1################################################################################ 2# 3# nodejs 4# 5################################################################################ 6 7NODEJS_VERSION = 16.15.0 8NODEJS_SOURCE = node-v$(NODEJS_VERSION).tar.xz 9NODEJS_SITE = http://nodejs.org/dist/v$(NODEJS_VERSION) 10NODEJS_DEPENDENCIES = \ 11 host-nodejs \ 12 host-ninja \ 13 host-pkgconf \ 14 host-python3 \ 15 host-qemu \ 16 c-ares \ 17 libuv \ 18 nghttp2 \ 19 zlib \ 20 $(call qstrip,$(BR2_PACKAGE_NODEJS_MODULES_ADDITIONAL_DEPS)) 21HOST_NODEJS_DEPENDENCIES = \ 22 host-icu \ 23 host-libopenssl \ 24 host-ninja \ 25 host-pkgconf \ 26 host-python3 \ 27 host-zlib 28NODEJS_INSTALL_STAGING = YES 29NODEJS_LICENSE = MIT (core code); MIT, Apache and BSD family licenses (Bundled components) 30NODEJS_LICENSE_FILES = LICENSE 31NODEJS_CPE_ID_VENDOR = nodejs 32NODEJS_CPE_ID_PRODUCT = node.js 33 34NODEJS_CONF_OPTS = \ 35 --shared-zlib \ 36 --shared-cares \ 37 --shared-libuv \ 38 --shared-nghttp2 \ 39 --without-dtrace \ 40 --without-etw \ 41 --cross-compiling \ 42 --dest-os=linux \ 43 --ninja 44 45HOST_NODEJS_MAKE_OPTS = \ 46 $(HOST_CONFIGURE_OPTS) \ 47 CXXFLAGS="$(HOST_NODEJS_CXXFLAGS)" \ 48 LDFLAGS.host="$(HOST_LDFLAGS)" \ 49 NO_LOAD=cctest.target.mk \ 50 PATH=$(@D)/bin:$(BR_PATH) 51 52NODEJS_MAKE_OPTS = \ 53 $(TARGET_CONFIGURE_OPTS) \ 54 NO_LOAD=cctest.target.mk \ 55 PATH=$(@D)/bin:$(BR_PATH) \ 56 LDFLAGS="$(NODEJS_LDFLAGS)" \ 57 LD="$(TARGET_CXX)" 58 59# nodejs's build system uses python which can be a symlink to an unsupported 60# python version (e.g. python 3.10 with nodejs 14.18.1). We work around this by 61# forcing host-python3 early in the PATH, via a python->python3 symlink. 62define NODEJS_PYTHON3_SYMLINK 63 mkdir -p $(@D)/bin 64 ln -sf $(HOST_DIR)/bin/python3 $(@D)/bin/python 65endef 66HOST_NODEJS_PRE_CONFIGURE_HOOKS += NODEJS_PYTHON3_SYMLINK 67NODEJS_PRE_CONFIGURE_HOOKS += NODEJS_PYTHON3_SYMLINK 68 69ifeq ($(BR2_PACKAGE_OPENSSL),y) 70NODEJS_DEPENDENCIES += openssl 71NODEJS_CONF_OPTS += --shared-openssl 72else 73NODEJS_CONF_OPTS += --without-ssl 74endif 75 76ifeq ($(BR2_PACKAGE_ICU),y) 77NODEJS_DEPENDENCIES += icu 78NODEJS_CONF_OPTS += --with-intl=system-icu 79else 80NODEJS_CONF_OPTS += --with-intl=none 81endif 82 83ifneq ($(BR2_PACKAGE_NODEJS_NPM),y) 84NODEJS_CONF_OPTS += --without-npm 85endif 86 87define HOST_NODEJS_CONFIGURE_CMDS 88 cd $(@D); \ 89 $(HOST_CONFIGURE_OPTS) \ 90 PATH=$(@D)/bin:$(BR_PATH) \ 91 PYTHON=$(HOST_DIR)/bin/python3 \ 92 $(HOST_DIR)/bin/python3 ./configure \ 93 --prefix=$(HOST_DIR) \ 94 --without-dtrace \ 95 --without-etw \ 96 --shared-openssl \ 97 --shared-openssl-includes=$(HOST_DIR)/include \ 98 --shared-openssl-libpath=$(HOST_DIR)/lib \ 99 --shared-zlib \ 100 --no-cross-compiling \ 101 --with-intl=system-icu \ 102 --ninja 103endef 104 105NODEJS_HOST_TOOLS_V8 = \ 106 torque \ 107 gen-regexp-special-case \ 108 bytecode_builtins_list_generator 109NODEJS_HOST_TOOLS_NODE = mkcodecache 110NODEJS_HOST_TOOLS = $(NODEJS_HOST_TOOLS_V8) $(NODEJS_HOST_TOOLS_NODE) 111 112HOST_NODEJS_CXXFLAGS = $(HOST_CXXFLAGS) 113 114define HOST_NODEJS_BUILD_CMDS 115 $(HOST_MAKE_ENV) PYTHON=$(HOST_DIR)/bin/python3 \ 116 $(MAKE) -C $(@D) \ 117 $(HOST_NODEJS_MAKE_OPTS) 118endef 119 120define HOST_NODEJS_INSTALL_CMDS 121 $(HOST_MAKE_ENV) PYTHON=$(HOST_DIR)/bin/python3 \ 122 $(MAKE) -C $(@D) install \ 123 $(HOST_NODEJS_MAKE_OPTS) 124 125 $(foreach f,$(NODEJS_HOST_TOOLS), \ 126 $(INSTALL) -m755 -D $(@D)/out/Release/$(f) $(HOST_DIR)/bin/$(f) 127 ) 128endef 129 130ifeq ($(BR2_i386),y) 131NODEJS_CPU = ia32 132else ifeq ($(BR2_x86_64),y) 133NODEJS_CPU = x64 134else ifeq ($(BR2_mips),y) 135NODEJS_CPU = mips 136else ifeq ($(BR2_mipsel),y) 137NODEJS_CPU = mipsel 138else ifeq ($(BR2_arm),y) 139NODEJS_CPU = arm 140# V8 needs to know what floating point ABI the target is using. 141NODEJS_ARM_FP = $(GCC_TARGET_FLOAT_ABI) 142# it also wants to know which FPU to use, but only has support for 143# vfp, vfpv3, vfpv3-d16 and neon. 144ifeq ($(BR2_ARM_FPU_VFPV2),y) 145NODEJS_ARM_FPU = vfp 146# vfpv4 is a superset of vfpv3 147else ifeq ($(BR2_ARM_FPU_VFPV3)$(BR2_ARM_FPU_VFPV4),y) 148NODEJS_ARM_FPU = vfpv3 149# vfpv4-d16 is a superset of vfpv3-d16 150else ifeq ($(BR2_ARM_FPU_VFPV3D16)$(BR2_ARM_FPU_VFPV4D16),y) 151NODEJS_ARM_FPU = vfpv3-d16 152else ifeq ($(BR2_ARM_FPU_NEON),y) 153NODEJS_ARM_FPU = neon 154endif 155else ifeq ($(BR2_aarch64),y) 156NODEJS_CPU = arm64 157endif 158 159# MIPS architecture specific options 160ifeq ($(BR2_mips)$(BR2_mipsel),y) 161ifeq ($(BR2_MIPS_CPU_MIPS32R6),y) 162NODEJS_MIPS_ARCH_VARIANT = r6 163NODEJS_MIPS_FPU_MODE = fp64 164else ifeq ($(BR2_MIPS_CPU_MIPS32R2),y) 165NODEJS_MIPS_ARCH_VARIANT = r2 166else ifeq ($(BR2_MIPS_CPU_MIPS32),y) 167NODEJS_MIPS_ARCH_VARIANT = r1 168endif 169endif 170 171NODEJS_LDFLAGS = $(TARGET_LDFLAGS) 172 173ifeq ($(BR2_TOOLCHAIN_HAS_LIBATOMIC),y) 174NODEJS_LDFLAGS += -latomic 175endif 176 177# V8's JIT infrastructure requires binaries such as mksnapshot and 178# mkpeephole to be run in the host during the build. However, these 179# binaries must have the same bit-width as the target (e.g. a x86_64 180# host targeting ARMv6 needs to produce a 32-bit binary). To work around this 181# issue, cross-compile the binaries for the target and run them on the 182# host with QEMU, much like gobject-introspection. 183define NODEJS_INSTALL_V8_QEMU_WRAPPER 184 $(INSTALL) -D -m 755 $(NODEJS_PKGDIR)/v8-qemu-wrapper.in \ 185 $(@D)/out/Release/v8-qemu-wrapper 186 $(SED) "s%@QEMU_USER@%$(QEMU_USER)%g" \ 187 $(@D)/out/Release/v8-qemu-wrapper 188 $(SED) "s%@TOOLCHAIN_HEADERS_VERSION@%$(BR2_TOOLCHAIN_HEADERS_AT_LEAST)%g" \ 189 $(@D)/out/Release/v8-qemu-wrapper 190 $(SED) "s%@QEMU_USERMODE_ARGS@%$(call qstrip,$(BR2_PACKAGE_HOST_QEMU_USER_MODE_ARGS))%g" \ 191 $(@D)/out/Release/v8-qemu-wrapper 192endef 193NODEJS_PRE_CONFIGURE_HOOKS += NODEJS_INSTALL_V8_QEMU_WRAPPER 194 195define NODEJS_WRAPPER_FIXUP 196 $(SED) "s%@MAYBE_WRAPPER@%'<(PRODUCT_DIR)/v8-qemu-wrapper',%g" $(@D)/node.gyp 197 $(SED) "s%@MAYBE_WRAPPER@%'<(PRODUCT_DIR)/v8-qemu-wrapper',%g" $(@D)/tools/v8_gypfiles/v8.gyp 198endef 199NODEJS_PRE_CONFIGURE_HOOKS += NODEJS_WRAPPER_FIXUP 200 201# Do not run the qemu-wrapper for the host build. 202define HOST_NODEJS_WRAPPER_FIXUP 203 $(SED) "s%@MAYBE_WRAPPER@%%g" $(@D)/node.gyp 204 $(SED) "s%@MAYBE_WRAPPER@%%g" $(@D)/tools/v8_gypfiles/v8.gyp 205endef 206HOST_NODEJS_PRE_CONFIGURE_HOOKS += HOST_NODEJS_WRAPPER_FIXUP 207 208define NODEJS_CONFIGURE_CMDS 209 (cd $(@D); \ 210 $(TARGET_CONFIGURE_OPTS) \ 211 PATH=$(@D)/bin:$(BR_PATH) \ 212 LDFLAGS="$(NODEJS_LDFLAGS)" \ 213 LD="$(TARGET_CXX)" \ 214 PYTHON=$(HOST_DIR)/bin/python3 \ 215 $(HOST_DIR)/bin/python3 ./configure \ 216 --prefix=/usr \ 217 --dest-cpu=$(NODEJS_CPU) \ 218 $(if $(NODEJS_ARM_FP),--with-arm-float-abi=$(NODEJS_ARM_FP)) \ 219 $(if $(NODEJS_ARM_FPU),--with-arm-fpu=$(NODEJS_ARM_FPU)) \ 220 $(if $(NODEJS_MIPS_ARCH_VARIANT),--with-mips-arch-variant=$(NODEJS_MIPS_ARCH_VARIANT)) \ 221 $(if $(NODEJS_MIPS_FPU_MODE),--with-mips-fpu-mode=$(NODEJS_MIPS_FPU_MODE)) \ 222 $(NODEJS_CONF_OPTS) \ 223 ) 224endef 225 226define NODEJS_BUILD_CMDS 227 $(TARGET_MAKE_ENV) PYTHON=$(HOST_DIR)/bin/python3 \ 228 $(MAKE) -C $(@D) \ 229 $(NODEJS_MAKE_OPTS) 230endef 231 232# 233# Build the list of modules to install. 234# 235NODEJS_MODULES_LIST= $(call qstrip,\ 236 $(BR2_PACKAGE_NODEJS_MODULES_ADDITIONAL)) 237 238# Define NPM for other packages to use 239NPM = $(TARGET_CONFIGURE_OPTS) \ 240 LDFLAGS="$(NODEJS_LDFLAGS)" \ 241 LD="$(TARGET_CXX)" \ 242 npm_config_arch=$(NODEJS_CPU) \ 243 npm_config_target_arch=$(NODEJS_CPU) \ 244 npm_config_build_from_source=true \ 245 npm_config_nodedir=$(BUILD_DIR)/nodejs-$(NODEJS_VERSION) \ 246 npm_config_prefix=$(TARGET_DIR)/usr \ 247 npm_config_cache=$(BUILD_DIR)/.npm-cache \ 248 $(HOST_DIR)/bin/npm 249 250# 251# We can only call NPM if there's something to install. 252# 253ifneq ($(NODEJS_MODULES_LIST),) 254define NODEJS_INSTALL_MODULES 255 # If you're having trouble with module installation, adding -d to the 256 # npm install call below and setting npm_config_rollback=false can both 257 # help in diagnosing the problem. 258 $(NPM) install -g $(NODEJS_MODULES_LIST) 259endef 260endif 261 262define NODEJS_INSTALL_STAGING_CMDS 263 $(TARGET_MAKE_ENV) PYTHON=$(HOST_DIR)/bin/python3 \ 264 $(MAKE) -C $(@D) install \ 265 DESTDIR=$(STAGING_DIR) \ 266 $(NODEJS_MAKE_OPTS) 267endef 268 269define NODEJS_INSTALL_TARGET_CMDS 270 $(TARGET_MAKE_ENV) PYTHON=$(HOST_DIR)/bin/python3 \ 271 $(MAKE) -C $(@D) install \ 272 DESTDIR=$(TARGET_DIR) \ 273 $(NODEJS_MAKE_OPTS) 274 $(NODEJS_INSTALL_MODULES) 275endef 276 277# node.js configure is a Python script and does not use autotools 278$(eval $(generic-package)) 279$(eval $(host-generic-package)) 280