From 5beac5427709e562fd39f0f198cd4dfb7eaa286a Mon Sep 17 00:00:00 2001 From: Hirokazu MORIKAWA Date: Mon, 4 Apr 2022 12:50:20 +0900 Subject: [PATCH] node: Major update from v14 to v16 This update also changes npm from v6 to v8. This change also requires node module packages to be modified. Each package will be updated later. Signed-off-by: Hirokazu MORIKAWA --- lang/node/Makefile | 9 +- lang/node/patches/003-path.patch | 8 +- lang/node/patches/004-musl_support.patch | 10 +- .../patches/007-fix_host_build_on_macos.patch | 2 +- .../010-execvp-arg-list-too-long.patch | 236 ++++++++++++++++++ lang/node/patches/999-cast_for_mips32.patch | 11 + ...necessary_libraries_for_host_execute.patch | 10 +- ...s-v8-src-trap-handler-trap-handler.h.patch | 29 +++ .../patches/999-localhost-no-addrconfig.patch | 2 +- lang/node/patches/999-v8_zlib_support.patch | 97 +++++++ 10 files changed, 394 insertions(+), 20 deletions(-) create mode 100644 lang/node/patches/010-execvp-arg-list-too-long.patch create mode 100644 lang/node/patches/999-cast_for_mips32.patch create mode 100644 lang/node/patches/999-deps-v8-src-trap-handler-trap-handler.h.patch create mode 100644 lang/node/patches/999-v8_zlib_support.patch diff --git a/lang/node/Makefile b/lang/node/Makefile index 251a6121e0..32ddc5d0c1 100644 --- a/lang/node/Makefile +++ b/lang/node/Makefile @@ -8,12 +8,12 @@ include $(TOPDIR)/rules.mk PKG_NAME:=node -PKG_VERSION:=v14.18.3 +PKG_VERSION:=v16.14.2 PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz PKG_SOURCE_URL:=https://nodejs.org/dist/$(PKG_VERSION) -PKG_HASH:=783ac443cd343dd6c68d2abcf7e59e7b978a6a428f6a6025f9b84918b769d608 +PKG_HASH:=e922e215cc68eb5f94d33e8a0b61e2c863b7731cc8600ab955d3822da90ff8d1 PKG_MAINTAINER:=Hirokazu MORIKAWA , Adrian Panella PKG_LICENSE:=MIT @@ -48,7 +48,7 @@ define Package/node/description an event-driven, non-blocking I/O model that makes it lightweight and efficient. Node.js' package ecosystem, npm, is the largest ecosystem of open source libraries in the world. *** The following preparations must be made on the host side. *** - 1. gcc 6.3 or higher is required. + 1. gcc 8.3 or higher is required. 2. To build a 32-bit target, gcc-multilib, g++-multilib are required. 3. Requires libatomic package. (If necessary, install the 32-bit library at the same time.) ex) sudo apt-get install gcc-multilib g++-multilib @@ -141,10 +141,11 @@ define Package/node/install endef define Package/node-npm/install + $(RM) $(1)/usr/lib/node_modules/npm $(INSTALL_DIR) $(1)/usr/lib/node_modules/npm $(CP) $(PKG_INSTALL_DIR)/usr/lib/node_modules/npm/{package.json,LICENSE} \ $(1)/usr/lib/node_modules/npm/ - $(CP) $(PKG_INSTALL_DIR)/usr/lib/node_modules/npm/{AUTHORS,*.md} \ + $(CP) $(PKG_INSTALL_DIR)/usr/lib/node_modules/npm/README.md \ $(1)/usr/lib/node_modules/npm/ $(CP) $(PKG_INSTALL_DIR)/usr/lib/node_modules/npm/{node_modules,bin,lib} \ $(1)/usr/lib/node_modules/npm/ diff --git a/lang/node/patches/003-path.patch b/lang/node/patches/003-path.patch index 8110a4a467..5330959aa2 100644 --- a/lang/node/patches/003-path.patch +++ b/lang/node/patches/003-path.patch @@ -1,12 +1,12 @@ --- a/lib/internal/modules/cjs/loader.js +++ b/lib/internal/modules/cjs/loader.js -@@ -1202,7 +1202,8 @@ Module._initPaths = function() { +@@ -1238,7 +1238,8 @@ Module._initPaths = function() { path.resolve(process.execPath, '..') : path.resolve(process.execPath, '..', '..'); -- let paths = [path.resolve(prefixDir, 'lib', 'node')]; -+ let paths = [path.resolve(prefixDir, 'lib', 'node'), -+ path.resolve(prefixDir, 'lib', 'node_modules')]; +- const paths = [path.resolve(prefixDir, 'lib', 'node')]; ++ const paths = [path.resolve(prefixDir, 'lib', 'node'), ++ path.resolve(prefixDir, 'lib', 'node_modules')]; if (homeDir) { ArrayPrototypeUnshift(paths, path.resolve(homeDir, '.node_libraries')); diff --git a/lang/node/patches/004-musl_support.patch b/lang/node/patches/004-musl_support.patch index cefe846d38..172b8010d9 100644 --- a/lang/node/patches/004-musl_support.patch +++ b/lang/node/patches/004-musl_support.patch @@ -1,6 +1,6 @@ --- a/deps/v8/src/base/platform/condition-variable.cc +++ b/deps/v8/src/base/platform/condition-variable.cc -@@ -16,7 +16,7 @@ namespace base { +@@ -20,7 +20,7 @@ namespace base { ConditionVariable::ConditionVariable() { #if (V8_OS_FREEBSD || V8_OS_NETBSD || V8_OS_OPENBSD || \ @@ -9,7 +9,7 @@ // On Free/Net/OpenBSD and Linux with glibc we can change the time // source for pthread_cond_timedwait() to use the monotonic clock. pthread_condattr_t attr; -@@ -92,7 +92,7 @@ bool ConditionVariable::WaitFor(Mutex* m +@@ -96,7 +96,7 @@ bool ConditionVariable::WaitFor(Mutex* m &native_handle_, &mutex->native_handle(), &ts); #else #if (V8_OS_FREEBSD || V8_OS_NETBSD || V8_OS_OPENBSD || \ @@ -20,7 +20,7 @@ result = clock_gettime(CLOCK_MONOTONIC, &ts); --- a/deps/v8/src/base/platform/platform-posix.cc +++ b/deps/v8/src/base/platform/platform-posix.cc -@@ -839,7 +839,7 @@ bool Thread::Start() { +@@ -883,7 +883,7 @@ bool Thread::Start() { #if V8_OS_MACOSX // Default on Mac OS X is 512kB -- bump up to 1MB stack_size = 1 * 1024 * 1024; @@ -31,7 +31,7 @@ #endif --- a/deps/v8/src/codegen/external-reference-table.cc +++ b/deps/v8/src/codegen/external-reference-table.cc -@@ -9,7 +9,7 @@ +@@ -10,7 +10,7 @@ #include "src/ic/stub-cache.h" #include "src/logging/counters.h" @@ -39,4 +39,4 @@ +#if defined(DEBUG) && defined(V8_OS_LINUX) && !defined(V8_OS_ANDROID) && defined(V8_LIBC_GLIBC) #define SYMBOLIZE_FUNCTION #include - #include + diff --git a/lang/node/patches/007-fix_host_build_on_macos.patch b/lang/node/patches/007-fix_host_build_on_macos.patch index 9341b3e4a9..a228c9bda2 100644 --- a/lang/node/patches/007-fix_host_build_on_macos.patch +++ b/lang/node/patches/007-fix_host_build_on_macos.patch @@ -1,6 +1,6 @@ --- a/tools/gyp/pylib/gyp/generator/make.py +++ b/tools/gyp/pylib/gyp/generator/make.py -@@ -180,7 +180,7 @@ cmd_solink_module = $(LINK.$(TOOLSET)) - +@@ -179,7 +179,7 @@ cmd_solink_module = $(LINK.$(TOOLSET)) - LINK_COMMANDS_MAC = """\ quiet_cmd_alink = LIBTOOL-STATIC $@ diff --git a/lang/node/patches/010-execvp-arg-list-too-long.patch b/lang/node/patches/010-execvp-arg-list-too-long.patch new file mode 100644 index 0000000000..821c5816b7 --- /dev/null +++ b/lang/node/patches/010-execvp-arg-list-too-long.patch @@ -0,0 +1,236 @@ +--- a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/make.py ++++ b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/make.py +@@ -154,6 +154,32 @@ cmd_alink_thin = rm -f $@ && $(AR.$(TOOL + quiet_cmd_link = LINK($(TOOLSET)) $@ + cmd_link = $(LINK.$(TOOLSET)) -o $@ $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -Wl,--start-group $(LD_INPUTS) $(LIBS) -Wl,--end-group + ++define xargs ++ $(1) $(wordlist 1,100,$(2)) ++ $(if $(word 101,$(2)),$(call xargs,$(1),$(wordlist 101,$(words $(2)),$(2)))) ++endef ++ ++define write-to-file ++ @echo >$(1) ++ $(call xargs,printf "%s\\n" >>$(1),$(2)) ++endef ++ ++OBJ_FILE_LIST_SFX := ar-file-list ++ ++define create_archive ++ $(eval OBJ_FILE_LIST := $(basename $(notdir $(1))).$(OBJ_FILE_LIST_SFX)) ++ rm -f $(1) $(1).$(OBJ_FILE_LIST); mkdir -p `dirname $(1)` ++ $(call write-to-file,$(1).$(OBJ_FILE_LIST),$(filter %.o,$(2))) ++ $(AR.$(TOOLSET)) crs $(1) @$(1).$(OBJ_FILE_LIST) ++endef ++ ++define create_thin_archive ++ $(eval OBJ_FILE_LIST := $(basename $(notdir $(1))).$(OBJ_FILE_LIST_SFX)) ++ rm -f $(1) $(OBJ_FILE_LIST); mkdir -p `dirname $(1)` ++ $(call write-to-file,$(1).$(OBJ_FILE_LIST),$(filter %.o,$(2))) ++ $(AR.$(TOOLSET)) crsT $(1) @$(1).$(OBJ_FILE_LIST) ++endef ++ + # We support two kinds of shared objects (.so): + # 1) shared_library, which is just bundling together many dependent libraries + # into a link line. +@@ -198,6 +224,32 @@ cmd_alink = rm -f $@ && $(AR.$(TOOLSET)) + quiet_cmd_alink_thin = AR($(TOOLSET)) $@ + cmd_alink_thin = rm -f $@ && $(AR.$(TOOLSET)) crsT $@ $(filter %.o,$^) + ++define xargs ++ $(1) $(wordlist 1,100,$(2)) ++ $(if $(word 101,$(2)),$(call xargs,$(1),$(wordlist 101,$(words $(2)),$(2)))) ++endef ++ ++define write-to-file ++ @echo >$(1) ++ $(call xargs,printf "%s\\n" >>$(1),$(2)) ++endef ++ ++OBJ_FILE_LIST_SFX := ar-file-list ++ ++define create_archive ++ $(eval OBJ_FILE_LIST := $(basename $(notdir $(1))).$(OBJ_FILE_LIST_SFX)) ++ rm -f $(1) $(1).$(OBJ_FILE_LIST); mkdir -p `dirname $(1)` ++ $(call write-to-file,$(1).$(OBJ_FILE_LIST),$(filter %.o,$(2))) ++ $(AR.$(TOOLSET)) crs $(1) @$(1).$(OBJ_FILE_LIST) ++endef ++ ++define create_thin_archive ++ $(eval OBJ_FILE_LIST := $(basename $(notdir $(1))).$(OBJ_FILE_LIST_SFX)) ++ rm -f $(1) $(OBJ_FILE_LIST); mkdir -p `dirname $(1)` ++ $(call write-to-file,$(1).$(OBJ_FILE_LIST),$(filter %.o,$(2))) ++ $(AR.$(TOOLSET)) crsT $(1) @$(1).$(OBJ_FILE_LIST) ++endef ++ + # Due to circular dependencies between libraries :(, we wrap the + # special "figure out circular dependencies" flags around the entire + # input list during linking. +@@ -1768,21 +1820,35 @@ $(obj).$(TOOLSET)/$(TARGET)/%%.o: $(obj) + self.flavor not in ("mac", "openbsd", "netbsd", "win") + and not self.is_standalone_static_library + ): +- self.WriteDoCmd( +- [self.output_binary], +- link_deps, +- "alink_thin", +- part_of_all, +- postbuilds=postbuilds, +- ) ++ if self.flavor in ('linux', 'android'): ++ self.WriteMakeRule( ++ [self.output_binary], ++ link_deps, ++ actions = ['$(call create_thin_archive,$@,$^)'] ++ ) ++ else: ++ self.WriteDoCmd( ++ [self.output_binary], ++ link_deps, ++ "alink_thin", ++ part_of_all, ++ postbuilds=postbuilds, ++ ) + else: +- self.WriteDoCmd( +- [self.output_binary], +- link_deps, +- "alink", +- part_of_all, +- postbuilds=postbuilds, +- ) ++ if self.flavor in ('linux', 'android'): ++ self.WriteMakeRule( ++ [self.output_binary], ++ link_deps, ++ actions = ['$(call create_archive,$@,$^)'] ++ ) ++ else: ++ self.WriteDoCmd( ++ [self.output_binary], ++ link_deps, ++ "alink", ++ part_of_all, ++ postbuilds=postbuilds, ++ ) + elif self.type == "shared_library": + self.WriteLn( + "%s: LD_INPUTS := %s" +--- a/tools/gyp/pylib/gyp/generator/make.py ++++ b/tools/gyp/pylib/gyp/generator/make.py +@@ -154,6 +154,32 @@ cmd_alink_thin = rm -f $@ && $(AR.$(TOOL + quiet_cmd_link = LINK($(TOOLSET)) $@ + cmd_link = $(LINK.$(TOOLSET)) -o $@ $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -Wl,--start-group $(LD_INPUTS) $(LIBS) -Wl,--end-group + ++define xargs ++ $(1) $(wordlist 1,100,$(2)) ++ $(if $(word 101,$(2)),$(call xargs,$(1),$(wordlist 101,$(words $(2)),$(2)))) ++endef ++ ++define write-to-file ++ @echo >$(1) ++ $(call xargs,printf "%s\\n" >>$(1),$(2)) ++endef ++ ++OBJ_FILE_LIST_SFX := ar-file-list ++ ++define create_archive ++ $(eval OBJ_FILE_LIST := $(basename $(notdir $(1))).$(OBJ_FILE_LIST_SFX)) ++ rm -f $(1) $(1).$(OBJ_FILE_LIST); mkdir -p `dirname $(1)` ++ $(call write-to-file,$(1).$(OBJ_FILE_LIST),$(filter %.o,$(2))) ++ $(AR.$(TOOLSET)) crs $(1) @$(1).$(OBJ_FILE_LIST) ++endef ++ ++define create_thin_archive ++ $(eval OBJ_FILE_LIST := $(basename $(notdir $(1))).$(OBJ_FILE_LIST_SFX)) ++ rm -f $(1) $(OBJ_FILE_LIST); mkdir -p `dirname $(1)` ++ $(call write-to-file,$(1).$(OBJ_FILE_LIST),$(filter %.o,$(2))) ++ $(AR.$(TOOLSET)) crsT $(1) @$(1).$(OBJ_FILE_LIST) ++endef ++ + # We support two kinds of shared objects (.so): + # 1) shared_library, which is just bundling together many dependent libraries + # into a link line. +@@ -198,6 +224,32 @@ cmd_alink = rm -f $@ && $(AR.$(TOOLSET)) + quiet_cmd_alink_thin = AR($(TOOLSET)) $@ + cmd_alink_thin = rm -f $@ && $(AR.$(TOOLSET)) crsT $@ $(filter %.o,$^) + ++define xargs ++ $(1) $(wordlist 1,100,$(2)) ++ $(if $(word 101,$(2)),$(call xargs,$(1),$(wordlist 101,$(words $(2)),$(2)))) ++endef ++ ++define write-to-file ++ @echo >$(1) ++ $(call xargs,printf "%s\\n" >>$(1),$(2)) ++endef ++ ++OBJ_FILE_LIST_SFX := ar-file-list ++ ++define create_archive ++ $(eval OBJ_FILE_LIST := $(basename $(notdir $(1))).$(OBJ_FILE_LIST_SFX)) ++ rm -f $(1) $(1).$(OBJ_FILE_LIST); mkdir -p `dirname $(1)` ++ $(call write-to-file,$(1).$(OBJ_FILE_LIST),$(filter %.o,$(2))) ++ $(AR.$(TOOLSET)) crs $(1) @$(1).$(OBJ_FILE_LIST) ++endef ++ ++define create_thin_archive ++ $(eval OBJ_FILE_LIST := $(basename $(notdir $(1))).$(OBJ_FILE_LIST_SFX)) ++ rm -f $(1) $(OBJ_FILE_LIST); mkdir -p `dirname $(1)` ++ $(call write-to-file,$(1).$(OBJ_FILE_LIST),$(filter %.o,$(2))) ++ $(AR.$(TOOLSET)) crsT $(1) @$(1).$(OBJ_FILE_LIST) ++endef ++ + # Due to circular dependencies between libraries :(, we wrap the + # special "figure out circular dependencies" flags around the entire + # input list during linking. +@@ -1768,21 +1820,35 @@ $(obj).$(TOOLSET)/$(TARGET)/%%.o: $(obj) + self.flavor not in ("mac", "openbsd", "netbsd", "win") + and not self.is_standalone_static_library + ): +- self.WriteDoCmd( +- [self.output_binary], +- link_deps, +- "alink_thin", +- part_of_all, +- postbuilds=postbuilds, +- ) ++ if self.flavor in ('linux', 'android'): ++ self.WriteMakeRule( ++ [self.output_binary], ++ link_deps, ++ actions = ['$(call create_thin_archive,$@,$^)'] ++ ) ++ else: ++ self.WriteDoCmd( ++ [self.output_binary], ++ link_deps, ++ 'alink_thin', ++ part_of_all, ++ postbuilds=postbuilds ++ ) + else: +- self.WriteDoCmd( +- [self.output_binary], +- link_deps, +- "alink", +- part_of_all, +- postbuilds=postbuilds, +- ) ++ if self.flavor in ('linux', 'android'): ++ self.WriteMakeRule( ++ [self.output_binary], ++ link_deps, ++ actions = ['$(call create_archive,$@,$^)'] ++ ) ++ else: ++ self.WriteDoCmd( ++ [self.output_binary], ++ link_deps, ++ 'alink', ++ part_of_all, ++ postbuilds=postbuilds ++ ) + elif self.type == "shared_library": + self.WriteLn( + "%s: LD_INPUTS := %s" diff --git a/lang/node/patches/999-cast_for_mips32.patch b/lang/node/patches/999-cast_for_mips32.patch new file mode 100644 index 0000000000..73493306fb --- /dev/null +++ b/lang/node/patches/999-cast_for_mips32.patch @@ -0,0 +1,11 @@ +--- a/deps/v8/src/compiler/backend/mips/code-generator-mips.cc ++++ b/deps/v8/src/compiler/backend/mips/code-generator-mips.cc +@@ -4230,7 +4230,7 @@ void CodeGenerator::AssembleReturn(Instr + } else if (FLAG_debug_code) { + __ Assert(eq, AbortReason::kUnexpectedAdditionalPopValue, + g.ToRegister(additional_pop_count), +- Operand(static_cast(0))); ++ Operand(static_cast(0))); + } + } + // Functions with JS linkage have at least one parameter (the receiver). diff --git a/lang/node/patches/999-delete_unnecessary_libraries_for_host_execute.patch b/lang/node/patches/999-delete_unnecessary_libraries_for_host_execute.patch index 6de249eaef..38b0ea5006 100644 --- a/lang/node/patches/999-delete_unnecessary_libraries_for_host_execute.patch +++ b/lang/node/patches/999-delete_unnecessary_libraries_for_host_execute.patch @@ -34,7 +34,7 @@ '<@(icu_src_genccode)', --- a/tools/v8_gypfiles/v8.gyp +++ b/tools/v8_gypfiles/v8.gyp -@@ -1310,6 +1310,7 @@ +@@ -1408,6 +1408,7 @@ { 'target_name': 'bytecode_builtins_list_generator', 'type': 'executable', @@ -42,7 +42,7 @@ 'conditions': [ ['want_separate_host_toolset', { 'toolsets': ['host'], -@@ -1333,6 +1334,8 @@ +@@ -1432,6 +1433,8 @@ { 'target_name': 'mksnapshot', 'type': 'executable', @@ -51,7 +51,7 @@ 'dependencies': [ 'v8_base_without_compiler', 'v8_compiler_for_mksnapshot', -@@ -1354,6 +1357,7 @@ +@@ -1453,6 +1456,7 @@ { 'target_name': 'torque', 'type': 'executable', @@ -59,7 +59,7 @@ 'dependencies': [ 'torque_base', # "build/win:default_exe_manifest", -@@ -1392,6 +1396,7 @@ +@@ -1491,6 +1495,7 @@ { 'target_name': 'torque-language-server', 'type': 'executable', @@ -67,7 +67,7 @@ 'conditions': [ ['want_separate_host_toolset', { 'toolsets': ['host'], -@@ -1419,6 +1424,8 @@ +@@ -1518,6 +1523,8 @@ { 'target_name': 'gen-regexp-special-case', 'type': 'executable', diff --git a/lang/node/patches/999-deps-v8-src-trap-handler-trap-handler.h.patch b/lang/node/patches/999-deps-v8-src-trap-handler-trap-handler.h.patch new file mode 100644 index 0000000000..b488359b2d --- /dev/null +++ b/lang/node/patches/999-deps-v8-src-trap-handler-trap-handler.h.patch @@ -0,0 +1,29 @@ +--- a/deps/v8/src/trap-handler/trap-handler.h ++++ b/deps/v8/src/trap-handler/trap-handler.h +@@ -17,19 +17,16 @@ namespace v8 { + namespace internal { + namespace trap_handler { + +-// X64 on Linux, Windows, MacOS, FreeBSD. +-#if V8_HOST_ARCH_X64 && V8_TARGET_ARCH_X64 && \ +- ((V8_OS_LINUX && !V8_OS_ANDROID) || V8_OS_WIN || V8_OS_MACOSX || \ +- V8_OS_FREEBSD) ++#if V8_TARGET_ARCH_X64 && V8_OS_LINUX && !V8_OS_ANDROID + #define V8_TRAP_HANDLER_SUPPORTED true +-// Arm64 (non-simulator) on Mac. +-#elif V8_TARGET_ARCH_ARM64 && V8_HOST_ARCH_ARM64 && V8_OS_MACOSX ++#elif V8_TARGET_ARCH_X64 && V8_OS_WIN + #define V8_TRAP_HANDLER_SUPPORTED true +-// Arm64 simulator on x64 on Linux or Mac. +-#elif V8_TARGET_ARCH_ARM64 && V8_HOST_ARCH_X64 && (V8_OS_LINUX || V8_OS_MACOSX) +-#define V8_TRAP_HANDLER_VIA_SIMULATOR ++#elif V8_TARGET_ARCH_X64 && V8_OS_MACOSX ++#define V8_TRAP_HANDLER_SUPPORTED true ++#elif V8_TARGET_ARCH_X64 && V8_OS_FREEBSD ++#define V8_TRAP_HANDLER_SUPPORTED true ++#elif V8_HOST_ARCH_ARM64 && V8_TARGET_ARCH_ARM64 && V8_OS_MACOSX + #define V8_TRAP_HANDLER_SUPPORTED true +-// Everything else is unsupported. + #else + #define V8_TRAP_HANDLER_SUPPORTED false + #endif diff --git a/lang/node/patches/999-localhost-no-addrconfig.patch b/lang/node/patches/999-localhost-no-addrconfig.patch index 3314648f87..c61a35086c 100644 --- a/lang/node/patches/999-localhost-no-addrconfig.patch +++ b/lang/node/patches/999-localhost-no-addrconfig.patch @@ -13,7 +13,7 @@ Forwarded: https://github.com/nodejs/node/issues/33816 // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the -@@ -1039,13 +1040,6 @@ function lookupAndConnect(self, options) +@@ -1037,13 +1038,6 @@ function lookupAndConnect(self, options) hints: options.hints || 0 }; diff --git a/lang/node/patches/999-v8_zlib_support.patch b/lang/node/patches/999-v8_zlib_support.patch new file mode 100644 index 0000000000..866083420d --- /dev/null +++ b/lang/node/patches/999-v8_zlib_support.patch @@ -0,0 +1,97 @@ +--- a/deps/zlib/zlib.gyp ++++ b/deps/zlib/zlib.gyp +@@ -43,10 +43,12 @@ + 'zutil.c', + 'zutil.h', + ], ++ 'include_dirs!': [ '