diff --git a/binding.gyp b/binding.gyp index d0932da9571ce6415d050f39e2bb5873d33bc24e..eacc7c44f6ab172a8531f2dfdee5d3b0ff4f1de8 100644 --- a/binding.gyp +++ b/binding.gyp @@ -37,7 +37,6 @@ # Some of this file is built with the help of # https://n8.io/converting-a-c-library-to-gyp/ { - # TODO: Finish windows support 'target_defaults': { 'include_dirs': [ '.', @@ -64,16 +63,16 @@ "ws2_32" ] }, { # OS != "win" - # 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-)' - ], + # 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-)' + ], 'variables': { 'config': '<!(echo $CONFIG)' }, @@ -110,6 +109,22 @@ 'conditions': [ ['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', + 'actions': [ + { + 'message': "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 BoringSSL and zlib under Windows { 'cflags': [ @@ -417,8 +432,7 @@ 'third_party/boringssl/ssl/t1_enc.c', 'third_party/boringssl/ssl/t1_lib.c', 'third_party/boringssl/ssl/tls_record.c', - ], - "include_dirs": [ "third_party/boringssl/include" ] + ] }, { 'cflags': [ @@ -447,8 +461,7 @@ 'third_party/zlib/trees.c', 'third_party/zlib/uncompr.c', 'third_party/zlib/zutil.c', - ], - "include_dirs": [ "third_party/boringssl/include" ] + ] }, ] }] diff --git a/templates/binding.gyp.template b/templates/binding.gyp.template index 71276e75e53ab952ee46e448a0de6a2e2f429652..650670b7507ece7cd8458fd4e073263b9bac72cb 100644 --- a/templates/binding.gyp.template +++ b/templates/binding.gyp.template @@ -39,29 +39,45 @@ # 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' ], 'conditions': [ ['OS == "win"', { - "include_dirs": [ "third_party/boringssl/include" ] - }, { + "include_dirs": [ "third_party/boringssl/include" ], + "defines": [ + '_WIN32_WINNT=0x0600', + 'WIN32_LEAN_AND_MEAN', + '_HAS_EXCEPTIONS=0', + 'UNICODE', + '_UNICODE', + 'NOMINMAX', + 'OPENSSL_NO_ASM' + ], + "msvs_settings": { + 'VCCLCompilerTool': { + 'RuntimeLibrary': 1, # static debug + } + }, + "libraries": [ + "ws2_32" + ] + }, { # OS != "win" + # 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-)' + ], + 'variables': { + 'config': '<!(echo $CONFIG)' + }, 'include_dirs': [ '<(node_root_dir)/deps/openssl/openssl/include', '<(node_root_dir)/deps/zlib' @@ -95,6 +111,22 @@ 'conditions': [ ['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', + 'actions': [ + { + 'message': "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 BoringSSL and zlib under Windows % for module in node_modules: % for lib in libs: @@ -117,8 +149,7 @@ % for source in lib.src: '${source}', % endfor - ], - "include_dirs": [ "third_party/boringssl/include" ] + ] }, % endif % endfor