1################################################################################ 2# 3# nodejs-src 4# 5################################################################################ 6 7NODEJS_SRC_VERSION = $(NODEJS_COMMON_VERSION) 8NODEJS_SRC_SOURCE = $(NODEJS_COMMON_SOURCE) 9NODEJS_SRC_SITE = $(NODEJS_COMMON_SITE) 10NODEJS_SRC_DL_SUBDIR = nodejs 11 12NODEJS_SRC_LICENSE = $(NODEJS_LICENSE) 13NODEJS_SRC_LICENSE_FILES = $(NODEJS_LICENSE_FILES) 14NODEJS_SRC_CPE_ID_VENDOR = $(NODEJS_CPE_ID_VENDOR) 15NODEJS_SRC_CPE_ID_PRODUCT = $(NODEJS_CPE_ID_PRODUCT) 16 17HOST_NODEJS_SRC_PROVIDES = host-nodejs 18 19NODEJS_SRC_DEPENDENCIES = \ 20 host-ninja \ 21 host-pkgconf \ 22 host-python3 \ 23 host-qemu \ 24 c-ares \ 25 libuv \ 26 nghttp2 \ 27 zlib \ 28 $(call qstrip,$(BR2_PACKAGE_NODEJS_MODULES_ADDITIONAL_DEPS)) 29HOST_NODEJS_SRC_DEPENDENCIES = \ 30 host-icu \ 31 host-libopenssl \ 32 host-ninja \ 33 host-pkgconf \ 34 host-python3 \ 35 host-zlib 36NODEJS_SRC_INSTALL_STAGING = YES 37 38NODEJS_SRC_CONF_OPTS = \ 39 --shared-zlib \ 40 --shared-cares \ 41 --shared-libuv \ 42 --shared-nghttp2 \ 43 --cross-compiling \ 44 --dest-os=linux \ 45 --ninja 46 47HOST_NODEJS_SRC_MAKE_OPTS = \ 48 $(HOST_CONFIGURE_OPTS) \ 49 CXXFLAGS="$(HOST_NODEJS_SRC_CXXFLAGS)" \ 50 LDFLAGS.host="$(HOST_LDFLAGS)" \ 51 NO_LOAD=cctest.target.mk \ 52 PATH=$(@D)/bin:$(BR_PATH) \ 53 JOBS=$(PARALLEL_JOBS) 54 55NODEJS_SRC_MAKE_OPTS = \ 56 $(TARGET_CONFIGURE_OPTS) \ 57 NO_LOAD=cctest.target.mk \ 58 PATH=$(@D)/bin:$(BR_PATH) \ 59 LDFLAGS="$(NODEJS_SRC_LDFLAGS)" \ 60 LD="$(TARGET_CXX)" \ 61 JOBS=$(PARALLEL_JOBS) 62 63# nodejs's build system uses python which can be a symlink to an unsupported 64# python version (e.g. python 3.10 with nodejs 14.18.1). We work around this by 65# forcing host-python3 early in the PATH, via a python->python3 symlink. 66define NODEJS_SRC_PYTHON3_SYMLINK 67 mkdir -p $(@D)/bin 68 ln -sf $(HOST_DIR)/bin/python3 $(@D)/bin/python 69endef 70HOST_NODEJS_SRC_PRE_CONFIGURE_HOOKS += NODEJS_SRC_PYTHON3_SYMLINK 71NODEJS_SRC_PRE_CONFIGURE_HOOKS += NODEJS_SRC_PYTHON3_SYMLINK 72 73ifeq ($(BR2_PACKAGE_OPENSSL),y) 74NODEJS_SRC_DEPENDENCIES += openssl 75NODEJS_SRC_CONF_OPTS += --shared-openssl 76else 77NODEJS_SRC_CONF_OPTS += --without-ssl 78endif 79 80ifeq ($(BR2_PACKAGE_ICU),y) 81NODEJS_SRC_DEPENDENCIES += icu 82NODEJS_SRC_CONF_OPTS += --with-intl=system-icu 83else 84NODEJS_SRC_CONF_OPTS += --with-intl=none 85endif 86 87ifneq ($(BR2_PACKAGE_NODEJS_NPM),y) 88NODEJS_SRC_CONF_OPTS += --without-npm 89endif 90 91define HOST_NODEJS_SRC_CONFIGURE_CMDS 92 cd $(@D); \ 93 $(HOST_CONFIGURE_OPTS) \ 94 PATH=$(@D)/bin:$(BR_PATH) \ 95 PYTHON=$(HOST_DIR)/bin/python3 \ 96 $(HOST_DIR)/bin/python3 configure.py \ 97 --prefix=$(HOST_DIR) \ 98 --shared-openssl \ 99 --shared-openssl-includes=$(HOST_DIR)/include \ 100 --shared-openssl-libpath=$(HOST_DIR)/lib \ 101 --shared-zlib \ 102 --no-cross-compiling \ 103 --with-intl=system-icu \ 104 --ninja 105endef 106 107HOST_NODEJS_SRC_CXXFLAGS = $(HOST_CXXFLAGS) 108 109define HOST_NODEJS_SRC_BUILD_CMDS 110 $(HOST_MAKE_ENV) PYTHON=$(HOST_DIR)/bin/python3 \ 111 $(MAKE) -C $(@D) \ 112 $(HOST_NODEJS_SRC_MAKE_OPTS) 113endef 114 115ifeq ($(BR2_PACKAGE_HOST_NODEJS_COREPACK),y) 116define HOST_NODEJS_SRC_ENABLE_COREPACK 117 $(COREPACK) enable 118endef 119endif 120 121define HOST_NODEJS_SRC_INSTALL_CMDS 122 $(HOST_MAKE_ENV) PYTHON=$(HOST_DIR)/bin/python3 \ 123 $(MAKE) -C $(@D) install \ 124 $(HOST_NODEJS_SRC_MAKE_OPTS) 125 $(HOST_NODEJS_SRC_ENABLE_COREPACK) 126endef 127 128ifeq ($(BR2_i386),y) 129NODEJS_SRC_CPU = ia32 130else ifeq ($(BR2_x86_64),y) 131NODEJS_SRC_CPU = x64 132else ifeq ($(BR2_mips),y) 133NODEJS_SRC_CPU = mips 134else ifeq ($(BR2_mipsel),y) 135NODEJS_SRC_CPU = mipsel 136else ifeq ($(BR2_arm),y) 137NODEJS_SRC_CPU = arm 138# V8 needs to know what floating point ABI the target is using. 139NODEJS_SRC_ARM_FP = $(GCC_TARGET_FLOAT_ABI) 140# it also wants to know which FPU to use, but only has support for 141# vfp, vfpv3, vfpv3-d16 and neon. 142ifeq ($(BR2_ARM_FPU_VFPV2),y) 143NODEJS_SRC_ARM_FPU = vfp 144# vfpv4 is a superset of vfpv3 145else ifeq ($(BR2_ARM_FPU_VFPV3)$(BR2_ARM_FPU_VFPV4),y) 146NODEJS_SRC_ARM_FPU = vfpv3 147# vfpv4-d16 is a superset of vfpv3-d16 148else ifeq ($(BR2_ARM_FPU_VFPV3D16)$(BR2_ARM_FPU_VFPV4D16),y) 149NODEJS_SRC_ARM_FPU = vfpv3-d16 150else ifeq ($(BR2_ARM_FPU_NEON),y) 151NODEJS_SRC_ARM_FPU = neon 152endif 153else ifeq ($(BR2_aarch64),y) 154NODEJS_SRC_CPU = arm64 155endif 156 157# MIPS architecture specific options 158ifeq ($(BR2_mips)$(BR2_mipsel),y) 159ifeq ($(BR2_MIPS_CPU_MIPS32R6),y) 160NODEJS_SRC_MIPS_ARCH_VARIANT = r6 161NODEJS_SRC_MIPS_FPU_MODE = fp64 162else ifeq ($(BR2_MIPS_CPU_MIPS32R2),y) 163NODEJS_SRC_MIPS_ARCH_VARIANT = r2 164else ifeq ($(BR2_MIPS_CPU_MIPS32),y) 165NODEJS_SRC_MIPS_ARCH_VARIANT = r1 166endif 167endif 168 169NODEJS_SRC_LDFLAGS = $(TARGET_LDFLAGS) 170 171ifeq ($(BR2_TOOLCHAIN_HAS_LIBATOMIC),y) 172NODEJS_SRC_LDFLAGS += -latomic 173endif 174 175# V8's JIT infrastructure requires binaries such as mksnapshot and 176# mkpeephole to be run in the host during the build. However, these 177# binaries must have the same bit-width as the target (e.g. a x86_64 178# host targeting ARMv6 needs to produce a 32-bit binary). To work around this 179# issue, cross-compile the binaries for the target and run them on the 180# host with QEMU, much like gobject-introspection. 181define NODEJS_SRC_INSTALL_V8_QEMU_WRAPPER 182 $(INSTALL) -D -m 755 $(NODEJS_SRC_PKGDIR)/v8-qemu-wrapper.in \ 183 $(@D)/out/Release/v8-qemu-wrapper 184 $(SED) "s%@QEMU_USER@%$(QEMU_USER)%g" \ 185 $(@D)/out/Release/v8-qemu-wrapper 186 $(SED) "s%@TOOLCHAIN_HEADERS_VERSION@%$(BR2_TOOLCHAIN_HEADERS_AT_LEAST)%g" \ 187 $(@D)/out/Release/v8-qemu-wrapper 188 $(SED) "s%@QEMU_USERMODE_ARGS@%$(call qstrip,$(BR2_PACKAGE_HOST_QEMU_USER_MODE_ARGS))%g" \ 189 $(@D)/out/Release/v8-qemu-wrapper 190endef 191NODEJS_SRC_PRE_CONFIGURE_HOOKS += NODEJS_SRC_INSTALL_V8_QEMU_WRAPPER 192 193define NODEJS_SRC_WRAPPER_FIXUP 194 $(SED) "s%@MAYBE_WRAPPER@%'<(PRODUCT_DIR)/v8-qemu-wrapper',%g" $(@D)/node.gyp 195 $(SED) "s%@MAYBE_WRAPPER@%'<(PRODUCT_DIR)/v8-qemu-wrapper',%g" $(@D)/tools/v8_gypfiles/v8.gyp 196endef 197NODEJS_SRC_PRE_CONFIGURE_HOOKS += NODEJS_SRC_WRAPPER_FIXUP 198 199# Do not run the qemu-wrapper for the host build. 200define HOST_NODEJS_SRC_WRAPPER_FIXUP 201 $(SED) "s%@MAYBE_WRAPPER@%%g" $(@D)/node.gyp 202 $(SED) "s%@MAYBE_WRAPPER@%%g" $(@D)/tools/v8_gypfiles/v8.gyp 203endef 204HOST_NODEJS_SRC_PRE_CONFIGURE_HOOKS += HOST_NODEJS_SRC_WRAPPER_FIXUP 205 206define NODEJS_SRC_CONFIGURE_CMDS 207 (cd $(@D); \ 208 $(TARGET_CONFIGURE_OPTS) \ 209 PATH=$(@D)/bin:$(BR_PATH) \ 210 LDFLAGS="$(NODEJS_SRC_LDFLAGS)" \ 211 LD="$(TARGET_CXX)" \ 212 PYTHON=$(HOST_DIR)/bin/python3 \ 213 $(HOST_DIR)/bin/python3 configure.py \ 214 --prefix=/usr \ 215 --dest-cpu=$(NODEJS_SRC_CPU) \ 216 $(if $(NODEJS_SRC_ARM_FP),--with-arm-float-abi=$(NODEJS_SRC_ARM_FP)) \ 217 $(if $(NODEJS_SRC_ARM_FPU),--with-arm-fpu=$(NODEJS_SRC_ARM_FPU)) \ 218 $(if $(NODEJS_SRC_MIPS_ARCH_VARIANT),--with-mips-arch-variant=$(NODEJS_SRC_MIPS_ARCH_VARIANT)) \ 219 $(if $(NODEJS_SRC_MIPS_FPU_MODE),--with-mips-fpu-mode=$(NODEJS_SRC_MIPS_FPU_MODE)) \ 220 $(NODEJS_SRC_CONF_OPTS) \ 221 ) 222endef 223 224define NODEJS_SRC_BUILD_CMDS 225 $(TARGET_MAKE_ENV) PYTHON=$(HOST_DIR)/bin/python3 \ 226 $(MAKE) -C $(@D) \ 227 $(NODEJS_SRC_MAKE_OPTS) 228endef 229 230# 231# Build the list of modules to install. 232# 233NODEJS_SRC_MODULES_LIST= $(call qstrip,\ 234 $(BR2_PACKAGE_NODEJS_MODULES_ADDITIONAL)) 235 236# 237# We can only call NPM if there's something to install. 238# 239ifneq ($(NODEJS_SRC_MODULES_LIST),) 240NODEJS_SRC_DEPENDENCIES += host-nodejs 241define NODEJS_SRC_INSTALL_MODULES 242 # If you're having trouble with module installation, adding -d to the 243 # npm install call below and setting npm_config_rollback=false can both 244 # help in diagnosing the problem. 245 $(NPM) install -g $(NODEJS_SRC_MODULES_LIST) 246endef 247 248# Exclude prebuilt binaries with different architectures and OS from check 249NODEJS_SRC_BIN_ARCH_EXCLUDE = /usr/lib/node_modules/ 250endif 251 252define NODEJS_SRC_INSTALL_STAGING_CMDS 253 $(TARGET_MAKE_ENV) PYTHON=$(HOST_DIR)/bin/python3 \ 254 $(MAKE) -C $(@D) install \ 255 DESTDIR=$(STAGING_DIR) \ 256 $(NODEJS_SRC_MAKE_OPTS) 257endef 258 259define NODEJS_SRC_INSTALL_TARGET_CMDS 260 $(TARGET_MAKE_ENV) PYTHON=$(HOST_DIR)/bin/python3 \ 261 $(MAKE) -C $(@D) install \ 262 DESTDIR=$(TARGET_DIR) \ 263 $(NODEJS_SRC_MAKE_OPTS) 264 $(NODEJS_SRC_INSTALL_MODULES) 265endef 266 267# node.js configure is a Python script and does not use autotools 268$(eval $(generic-package)) 269$(eval $(host-generic-package)) 270