%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': {
      'runtime%': 'node',
      # UV integration in C core is enabled by default. It can be disabled
      # by setting this argument to anything else.
      'grpc_uv%': 'true',
      # Some Node installations use the system installation of OpenSSL, and on
      # some systems, the system OpenSSL still does not have ALPN support. This
      # will let users recompile gRPC to work without ALPN.
      'grpc_alpn%': 'true',
      # Indicates that the library should be built with gcov.
      'grpc_gcov%': 'false'
    },
    'target_defaults': {
      'configurations': {
        % for name, args in configs.iteritems():
        %  if name in ['dbg', 'opt']:
        '${{'dbg':'Debug', 'opt': 'Release'}[name]}': {
          % for arg, prop in [('CPPFLAGS', 'cflags'), ('DEFINES', 'defines')]:
          %  if args.get(arg, None) is not None:
          '${prop}': [
            % for item in args.get(arg).split():
              '${item}',
            % endfor
          ],
          %  endif
          % endfor
        },
        %  endif
        % endfor
      },
      % for arg, prop in [('CPPFLAGS', 'cflags'), ('LDFLAGS', 'ldflags')]:
      %  if defaults['global'].get(arg, None) is not None:
      '${prop}': [
        % for item in defaults['global'].get(arg).split():
          '${item}',
        % endfor
      ],
      %  endif
      % endfor
      'include_dirs': [
        '.',
        'include'
      ],
      'defines': [
        'GPR_BACKWARDS_COMPATIBILITY_MODE'
      ],
      'conditions': [
        ['grpc_uv=="true"', {
          'defines': [
            'GRPC_ARES=0',
            # Disabling this while bugs are ironed out. Uncomment this to
            # re-enable libuv integration in C core.
            'GRPC_UV'
          ]
        }],
        ['grpc_gcov=="true"', {
          % for arg, prop in [('CPPFLAGS', 'cflags'), ('DEFINES', 'defines'), ('LDFLAGS', 'ldflags')]:
          %  if configs['gcov'].get(arg, None) is not None:
          '${prop}': [
            % for item in configs['gcov'].get(arg).split():
              '${item}',
            % endfor
          ],
          %  endif
          % endfor
        }],
        ['OS!="win" and runtime=="electron"', {
          "defines": [
            'OPENSSL_NO_THREADS'
          ]
        }],
        # This is the condition for using boringssl
        ['OS=="win" or runtime=="electron"', {
          "include_dirs": [
            "third_party/boringssl/include"
          ],
          "defines": [
            'OPENSSL_NO_ASM'
          ]
        }, {
          'conditions': [
            ['grpc_alpn=="true"', {
              'defines': [
                'TSI_OPENSSL_ALPN_SUPPORT=1'
              ],
            }, {
              'defines': [
                'TSI_OPENSSL_ALPN_SUPPORT=0'
              ],
            }]
          ],
          'include_dirs': [
            '<(node_root_dir)/deps/openssl/openssl/include',
          ],
          'conditions': [
           ["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" ]
           }]
          ]
        }],
        ['OS == "win"', {
          "include_dirs": [
            "third_party/zlib",
            "third_party/cares/cares"
          ],
          "defines": [
            '_WIN32_WINNT=0x0600',
            'WIN32_LEAN_AND_MEAN',
            '_HAS_EXCEPTIONS=0',
            'UNICODE',
            '_UNICODE',
            'NOMINMAX',
          ],
          "msvs_settings": {
            'VCCLCompilerTool': {
              'RuntimeLibrary': 1, # static debug
            }
          },
          "libraries": [
            "ws2_32"
          ]
        }, { # OS != "win"
          'include_dirs': [
            '<(node_root_dir)/deps/zlib',
            '<(node_root_dir)/deps/cares/include'
          ]
        }]
      ]
    },
    'conditions': [
      ['OS=="win" or runtime=="electron"', {
        'targets': [
          % for module in node_modules:
          % for lib in libs:
          % if lib.name in module.transitive_deps and lib.name == 'boringssl':
          {
            'cflags': [
              '-std=c99',
              '-Wall',
              '-Werror'
            ],
            '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
            ]
          },
          % endif
          % endfor
          % endfor
        ]
      }],
      ['OS == "win"', {
        'targets': [
          {
            # IMPORTANT WINDOWS BUILD INFORMATION
            # This library does not build on Windows without modifying the Node
            # development packages that node-gyp downloads in order to build.
            # Due to https://github.com/nodejs/node/issues/4932, the headers for
            # BoringSSL conflict with the OpenSSL headers included by default
            # when including the Node headers. The remedy for this is to remove
            # the OpenSSL headers, from the downloaded Node development package,
            # which is typically located in `.node-gyp` in your home directory.
            'target_name': 'WINDOWS_BUILD_WARNING',
            'rules': [
              {
                'rule_name': 'WINDOWS_BUILD_WARNING',
                'extension': 'S',
                'inputs': [
                  'package.json'
                ],
                'outputs': [
                  'ignore_this_part'
                ],
                'action': ['echo', 'IMPORTANT: Due to https://github.com/nodejs/node/issues/4932, to build this library on Windows, you must first remove <(node_root_dir)/include/node/openssl/']
              }
            ]
          },
          # Only want to compile zlib under Windows
          % for module in node_modules:
          % for lib in libs:
          % if lib.name in module.transitive_deps and lib.name == 'z':
          {
            'cflags': [
              '-std=c99',
              '-Wall',
              '-Werror'
            ],
            '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
            ]
          },
          % endif
          % endfor
          % endfor
        ]
      }]
    ],
    'targets': [
  <%
      for lib in libs:
        if 'grpc' in lib.transitive_deps or lib.name == 'grpc':
          lib.deps.append('node_modules/cares/deps/cares/cares.gyp:cares')
      for module in node_modules:
        module.deps.append('node_modules/cares/deps/cares/cares.gyp:cares')
  %>
      % for module in node_modules:
      % for lib in libs:
      % if lib.name in module.transitive_deps and lib.name not in ('boringssl', 'z'):
      {
        'cflags': [
          '-std=c99',
          '-Wall',
          '-Werror'
        ],
        '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++11',
          '-pthread',
          '-zdefs',
          '-Wno-error=deprecated-declarations'
        ],
        "conditions": [
          ['OS=="win" or runtime=="electron"', {
            'dependencies': [
              % for dep in getattr(module, 'deps', []):
              % if dep == 'boringssl':
              "${dep}",
              % endif
              % endfor
            ]
          }],
          ['OS=="mac"', {
            'xcode_settings': {
              'MACOSX_DEPLOYMENT_TARGET': '10.9',
              'OTHER_CFLAGS': [
                '-stdlib=libc++',
                '-std=c++11'
              ]
            }
          }],
          ['OS=="win"', {
            'dependencies': [
              % for dep in getattr(module, 'deps', []):
              % if dep == 'z':
              "${dep}",
              % endif
              % endfor
            ]
          }],
          ['OS=="linux"', {
            'ldflags': [
              '-Wl,-wrap,memcpy'
            ]
          }]
        ],
        "target_name": "${module.name}",
        "sources": [
          % for source in module.src:
          "${source}",
          % endfor
        ],
        "dependencies": [
          % for dep in getattr(module, 'deps', []):
          % if dep not in ('boringssl', 'z'):
          "${dep}",
          % endif
          % endfor
        ]
      },
      % endfor
      {
        "target_name": "action_after_build",
        "type": "none",
        "dependencies": [ "<(module_name)" ],
        "copies": [
          {
            "files": [ "<(PRODUCT_DIR)/<(module_name).node"],
            "destination": "<(module_path)"
          }
        ]
      }
    ]
  }
