%YAML 1.2
--- |
  # GRPC Node gyp file
  # This currently builds the Node extension and dependencies
  # This file has been automatically generated from a template file.
  # Please look at the templates directory instead.
  # This file can be regenerated from the template by running
  # tools/buildgen/generate_projects.sh

  # Copyright 2015, Google Inc.
  # All rights reserved.
  #
  # Redistribution and use in source and binary forms, with or without
  # modification, are permitted provided that the following conditions are
  # met:
  #
  #     * Redistributions of source code must retain the above copyright
  # notice, this list of conditions and the following disclaimer.
  #     * Redistributions in binary form must reproduce the above
  # copyright notice, this list of conditions and the following disclaimer
  # in the documentation and/or other materials provided with the
  # distribution.
  #     * Neither the name of Google Inc. nor the names of its
  # contributors may be used to endorse or promote products derived from
  # this software without specific prior written permission.
  #
  # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

  # Some of this file is built with the help of
  # https://n8.io/converting-a-c-library-to-gyp/
  {
    'variables': {
      'config': '<!(echo $CONFIG)'
    },
    # TODO: Finish windows support
    'target_defaults': {
        # Empirically, Node only exports ALPN symbols if its major version is >0.
        # io.js always reports versions >0 and always exports ALPN symbols.
        # Therefore, Node's major version will be truthy if and only if it
        # supports ALPN. The output of "node -v" is v[major].[minor].[patch],
        # like "v4.1.1" in a recent version. We use cut to split by period and
        # take the first field (resulting in "v[major]"), then use cut again
        # to take all but the first character, removing the "v".
      'defines': [
        'TSI_OPENSSL_ALPN_SUPPORT=<!(node --version | cut -d. -f1 | cut -c2-)'
      ],
      'include_dirs': [
        '.',
        'include',
        '<(node_root_dir)/deps/openssl/openssl/include',
        '<(node_root_dir)/deps/zlib'
      ],
      'conditions': [
        ['OS != "win"', {
          'conditions': [
            ['config=="gcov"', {
              'cflags': [
                '-ftest-coverage',
                '-fprofile-arcs',
                '-O0'
              ],
              'ldflags': [
                '-ftest-coverage',
                '-fprofile-arcs'
              ]
            }
           ]
          ]
        }],
        ["target_arch=='ia32'", {
            "include_dirs": [ "<(node_root_dir)/deps/openssl/config/piii" ]
        }],
        ["target_arch=='x64'", {
            "include_dirs": [ "<(node_root_dir)/deps/openssl/config/k8" ]
        }],
        ["target_arch=='arm'", {
            "include_dirs": [ "<(node_root_dir)/deps/openssl/config/arm" ]
        }]
      ]
    },
    'targets': [
      % for module in node_modules:
      % for lib in libs:
      % if lib.name in module.transitive_deps:
      {
        'target_name': '${lib.name}',
        'product_prefix': 'lib',
        'type': 'static_library',
        'dependencies': [
          % for dep in getattr(lib, 'deps', []):
          '${dep}',
          % endfor
        ],
        'sources': [
          % for source in lib.src:
          '${source}',
          % endfor
        ],
        "conditions": [
          ['OS == "mac"', {
            'xcode_settings': {
              'MACOSX_DEPLOYMENT_TARGET': '10.9'
            }
          }]
        ],
      },
      % endif
      % endfor
      {
        'include_dirs': [
          "<!(node -e \"require('nan')\")"
        ],
        'cflags': [
          '-std=c++0x',
          '-Wall',
          '-pthread',
          '-g',
          '-zdefs',
          '-Werror',
          '-Wno-error=deprecated-declarations'
        ],
        'ldflags': [
          '-g'
        ],
        "conditions": [
          ['OS == "mac"', {
            'xcode_settings': {
              'MACOSX_DEPLOYMENT_TARGET': '10.9',
              'OTHER_CFLAGS': [
                '-std=c++11',
                '-stdlib=libc++'
              ]
            }
          }]
        ],
        "target_name": "${module.name}",
        "sources": [
          % for source in module.src:
          "${source}",
          % endfor
        ],
        "dependencies": [
          % for dep in getattr(module, 'deps', []):
          "${dep}",
          % endfor
        ]
      },
      % endfor
    ]
  }
