# 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.

# This is a sample GYP files that shows the common patterns that should be used
# to create GYP files in Cobalt.

{
  'targets': [
    # Independent components should be broken into separate and testable
    # libraries.
    {
      'target_name': 'simple_example_lib',
      'type': 'static_library',
      'sources': [
        'simple_example.cc',
        'simple_example.h',
      ],
      'dependencies': [
        '<(DEPTH)/cobalt/base/base.gyp:base',
      ],
    },

    # This target is responsible for copying content required to run
    # simple_example to (PRODUCT_DIR). This target is optional and should
    # be added only if the executable has custom content.
    {
      'target_name': 'simple_example_content',
      'type': 'none',
      # Executable specific content logic should be added here.
      # ...
    },

    # An executable target is responsible for building the executable
    # and also making sure that all the necessary data needed to run the
    # executable from (PRODUCT_DIR) was copied over.
    {
      'target_name': 'simple_example',
      # Using (final_executable_type) instead of executable allows us
      # to compile the target into a library on platforms that package the
      # native code into a bundle (ex. Android).
      'type': '<(final_executable_type)',
      'variables': {
        # Override the default main thread stack size and set it to 1MB.
        'main_thread_stack_size': 1048576,
      },
      'sources': [
        'simple_example_main.cc',
      ],
      'dependencies': [
        '<(DEPTH)/cobalt/base/base.gyp:base',
        'simple_example_content',
        'simple_example_lib',
      ],
    },

    # This target will build simple_example and deploy the required data
    # (executable + content) to a platform specific location needed to run
    # executable on the target platform.
    {
      'target_name': 'simple_example_deploy',
      'type': 'none',
      'dependencies': [
        'simple_example',
      ],
      'variables': {
        'executable_name': 'simple_example',
      },
      'includes': [ '../../starboard/build/deploy.gypi' ],
    },

    # This target will create a test for simple_example.
    {
      'target_name': 'simple_example_test',
      # Using (gtest_target_type) instead of executable allows us to compile
      # the target into a library on platforms that package the native code
      # into a bundle (ex. Android).
      'type': '<(gtest_target_type)',
      'sources': [
        'simple_example_test.cc',
      ],
      'dependencies': [
        '<(DEPTH)/cobalt/base/base.gyp:base',
        '<(DEPTH)/cobalt/test/test.gyp:run_all_unittests',
        '<(DEPTH)/testing/gtest.gyp:gtest',
        'simple_example_lib',
      ],

      # This section is optional and is only needed if tests are using
      # external data.
      'actions': [
        {
          'action_name': 'copy_test_data',
          'variables': {
            'input_files': [
              'testdata',
            ],
            'output_dir': 'cobalt/samples',
          },
          'includes': [ '../build/copy_test_data.gypi' ],
        },
      ],
    },

    # This target will deploy the test and its data to a platform specific
    # location needed to run the test on the target platform.
    {
      'target_name': 'simple_example_test_deploy',
      'type': 'none',
      'dependencies': [
        'simple_example_test',
      ],
      'variables': {
        'executable_name': 'simple_example_test',
      },
      'includes': [ '../../starboard/build/deploy.gypi' ],
    },
  ],
}
