# 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)/base/base.gyp:run_all_unittests',
        '<(DEPTH)/cobalt/base/base.gyp:base',
        '<(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' ],
    },
  ],
}
