# Copyright 2014 Google Inc. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

{
  'variables': {
    'cobalt_code': 1,

    # Define the platform specific Bison binary.
    'conditions': [
      ['host_os=="win"', {
        'bison_exe': '<(DEPTH)/third_party/bison/bin/bison',
      }, {
        'bison_exe': 'bison',
      }],
    ],
  },

  'targets': [

    # Generates header files from Bison grammar that are privately included
    # by CSS scanner and parser.
    {
      'target_name': 'css_grammar',
      'type': 'none',
      'sources': [
        'grammar.h',
        'grammar.y',
      ],
      # Generated header files are stored in the intermediate directory
      # under their module sub-directory.
      'module_dir': [
        'cobalt/css_parser',
      ],
      'direct_dependent_settings': {
        'include_dirs': [
          '<(SHARED_INTERMEDIATE_DIR)',
        ],
      },
      'rules': [
        {
          'rule_name': 'bison',
          'extension': 'y',
          # Don't run through Cygwin on Windows since we want to use a custom
          # Bison executable.
          'msvs_cygwin_shell': 0,
          'outputs': [
            # Tokens and types, included by scanner.
            '<(SHARED_INTERMEDIATE_DIR)/<(_module_dir)/<(RULE_INPUT_ROOT)_generated.h',
            # LALR(1) parser tables and yy*() functions, included by parser.
            '<(SHARED_INTERMEDIATE_DIR)/<(_module_dir)/<(RULE_INPUT_ROOT)_impl_generated.h',
          ],
          'action': [
            '<(bison_exe)',
            '-Wall',
            '-Werror',
            '--defines=<(SHARED_INTERMEDIATE_DIR)/<(_module_dir)/<(RULE_INPUT_ROOT)_generated.h',
            '--output=<(SHARED_INTERMEDIATE_DIR)/<(_module_dir)/<(RULE_INPUT_ROOT)_impl_generated.h',
            '<(RULE_INPUT_PATH)',
          ],
        },
      ],
    },

    {
      'target_name': 'css_parser',
      'type': 'static_library',
      'sources': [
        'animation_shorthand_property_parse_structures.cc',
        'animation_shorthand_property_parse_structures.h',
        'background_shorthand_property_parse_structures.cc',
        'background_shorthand_property_parse_structures.h',
        'border_shorthand_property_parse_structures.cc',
        'border_shorthand_property_parse_structures.h',
        'font_shorthand_property_parse_structures.cc',
        'font_shorthand_property_parse_structures.h',
        'margin_or_padding_shorthand.cc',
        'margin_or_padding_shorthand.h',
        'parser.cc',
        'parser.h',
        'position_parse_structures.cc',
        'position_parse_structures.h',
        'property_declaration.h',
        'ref_counted_util.h',
        'scanner.cc',
        'scanner.h',
        'shadow_property_parse_structures.cc',
        'shadow_property_parse_structures.h',
        'string_pool.h',
        'transition_shorthand_property_parse_structures.cc',
        'transition_shorthand_property_parse_structures.h',
        'trivial_string_piece.h',
        'trivial_type_pairs.h',
      ],
      # Scanner exposes UChar32 in a header.
      'direct_dependent_settings': {
        'include_dirs': [
          '<(DEPTH)/third_party/icu/public/common',
        ],
      },
      'dependencies': [
        '<(DEPTH)/cobalt/base/base.gyp:base',
        '<(DEPTH)/cobalt/cssom/cssom.gyp:cssom',
        '<(DEPTH)/third_party/icu/icu.gyp:icuuc',
        'css_grammar',
      ],
    },

    {
      'target_name': 'css_parser_test',
      'type': '<(gtest_target_type)',
      'sources': [
        'parser_test.cc',
        'ref_counted_util_test.cc',
        'scanner_test.cc',
        'trivial_string_piece_test.cc',
      ],
      'dependencies': [
        '<(DEPTH)/base/base.gyp:run_all_unittests',
        '<(DEPTH)/cobalt/base/base.gyp:base',
        '<(DEPTH)/testing/gmock.gyp:gmock',
        '<(DEPTH)/testing/gtest.gyp:gtest',
        'css_grammar',
        'css_parser',
      ],
    },

    {
      'target_name': 'css_parser_test_deploy',
      'type': 'none',
      'dependencies': [
        'css_parser_test',
      ],
      'variables': {
        'executable_name': 'css_parser_test',
      },
      'includes': [ '../../starboard/build/deploy.gypi' ],
    },

  ],
}
