%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" and runtime!="electron"', {
        '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.
            #
            # This is not true of Electron, which does not have OpenSSL headers.
            '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)"
          }
        ]
      }
    ]
  }