Files
rpi-buildroot/package/nodejs/nodejs-src/nodejs-src.mk
Thomas Perale ccf3536fcb package/nodejs: make target nodejs package virtual
Since commit [1], the host-nodejs package was turned into a virtual
package. However, the target nodejs package was intentionally not
turned into a virtual package and became an empty package.
The reason for this is:

  - No alternatives providers were introduced for the target nodejs
    package.
  - The Config.in remained unchaged for the target package.

As a result, running `make show-info` with a config that includes the
target nodejs package, outputs an entry for the empty package:

```
"nodejs": {
    "type": "target",
    "name": "nodejs",
    "virtual": false,
    "version": "",
    ...
    "cpe-id": "cpe:2.3🅰️nodejs:node.js::*:*:*:*:*:*:*"
},
```

This can be an issue because the CPE ID of the empty nodejs package
is the following `cpe:2.3🅰️nodejs:node.js::*:*:*:*:*:*:*`.
Reporting such a CPE ID can be an issue for certain software that consume
the SBOM and could be interpreted as CPE that matches with every versions
of the package.

This patch converts the target nodejs package into a virtual package to
prevents the empty package from being included in the SBOM.

[1] 4cbc2af604 package/nodejs: rename to nodejs-src and convert to virtual package

Signed-off-by: Thomas Perale <thomas.perale@mind.be>
Tested-by: johan.derycke@barco.com
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
2025-05-17 11:54:03 +02:00

271 lines
7.9 KiB
Makefile

################################################################################
#
# nodejs-src
#
################################################################################
NODEJS_SRC_VERSION = $(NODEJS_COMMON_VERSION)
NODEJS_SRC_SOURCE = $(NODEJS_COMMON_SOURCE)
NODEJS_SRC_SITE = $(NODEJS_COMMON_SITE)
NODEJS_SRC_DL_SUBDIR = nodejs
NODEJS_SRC_LICENSE = $(NODEJS_LICENSE)
NODEJS_SRC_LICENSE_FILES = $(NODEJS_LICENSE_FILES)
NODEJS_SRC_CPE_ID_VENDOR = $(NODEJS_CPE_ID_VENDOR)
NODEJS_SRC_CPE_ID_PRODUCT = $(NODEJS_CPE_ID_PRODUCT)
NODEJS_SRC_PROVIDES = nodejs
HOST_NODEJS_SRC_PROVIDES = host-nodejs
NODEJS_SRC_DEPENDENCIES = \
host-ninja \
host-pkgconf \
host-python3 \
host-qemu \
c-ares \
libuv \
nghttp2 \
zlib \
$(call qstrip,$(BR2_PACKAGE_NODEJS_MODULES_ADDITIONAL_DEPS))
HOST_NODEJS_SRC_DEPENDENCIES = \
host-icu \
host-libopenssl \
host-ninja \
host-pkgconf \
host-python3 \
host-zlib
NODEJS_SRC_INSTALL_STAGING = YES
NODEJS_SRC_CONF_OPTS = \
--shared-zlib \
--shared-cares \
--shared-libuv \
--shared-nghttp2 \
--cross-compiling \
--dest-os=linux \
--ninja
HOST_NODEJS_SRC_MAKE_OPTS = \
$(HOST_CONFIGURE_OPTS) \
CXXFLAGS="$(HOST_NODEJS_SRC_CXXFLAGS)" \
LDFLAGS.host="$(HOST_LDFLAGS)" \
NO_LOAD=cctest.target.mk \
PATH=$(@D)/bin:$(BR_PATH) \
JOBS=$(PARALLEL_JOBS)
NODEJS_SRC_MAKE_OPTS = \
$(TARGET_CONFIGURE_OPTS) \
NO_LOAD=cctest.target.mk \
PATH=$(@D)/bin:$(BR_PATH) \
LDFLAGS="$(NODEJS_SRC_LDFLAGS)" \
LD="$(TARGET_CXX)" \
JOBS=$(PARALLEL_JOBS)
# nodejs's build system uses python which can be a symlink to an unsupported
# python version (e.g. python 3.10 with nodejs 14.18.1). We work around this by
# forcing host-python3 early in the PATH, via a python->python3 symlink.
define NODEJS_SRC_PYTHON3_SYMLINK
mkdir -p $(@D)/bin
ln -sf $(HOST_DIR)/bin/python3 $(@D)/bin/python
endef
HOST_NODEJS_SRC_PRE_CONFIGURE_HOOKS += NODEJS_SRC_PYTHON3_SYMLINK
NODEJS_SRC_PRE_CONFIGURE_HOOKS += NODEJS_SRC_PYTHON3_SYMLINK
ifeq ($(BR2_PACKAGE_OPENSSL),y)
NODEJS_SRC_DEPENDENCIES += openssl
NODEJS_SRC_CONF_OPTS += --shared-openssl
else
NODEJS_SRC_CONF_OPTS += --without-ssl
endif
ifeq ($(BR2_PACKAGE_ICU),y)
NODEJS_SRC_DEPENDENCIES += icu
NODEJS_SRC_CONF_OPTS += --with-intl=system-icu
else
NODEJS_SRC_CONF_OPTS += --with-intl=none
endif
ifneq ($(BR2_PACKAGE_NODEJS_NPM),y)
NODEJS_SRC_CONF_OPTS += --without-npm
endif
define HOST_NODEJS_SRC_CONFIGURE_CMDS
cd $(@D); \
$(HOST_CONFIGURE_OPTS) \
PATH=$(@D)/bin:$(BR_PATH) \
PYTHON=$(HOST_DIR)/bin/python3 \
$(HOST_DIR)/bin/python3 configure.py \
--prefix=$(HOST_DIR) \
--shared-openssl \
--shared-openssl-includes=$(HOST_DIR)/include \
--shared-openssl-libpath=$(HOST_DIR)/lib \
--shared-zlib \
--no-cross-compiling \
--with-intl=system-icu \
--ninja
endef
HOST_NODEJS_SRC_CXXFLAGS = $(HOST_CXXFLAGS)
define HOST_NODEJS_SRC_BUILD_CMDS
$(HOST_MAKE_ENV) PYTHON=$(HOST_DIR)/bin/python3 \
$(MAKE) -C $(@D) \
$(HOST_NODEJS_SRC_MAKE_OPTS)
endef
ifeq ($(BR2_PACKAGE_HOST_NODEJS_COREPACK),y)
define HOST_NODEJS_SRC_ENABLE_COREPACK
$(COREPACK) enable
endef
endif
define HOST_NODEJS_SRC_INSTALL_CMDS
$(HOST_MAKE_ENV) PYTHON=$(HOST_DIR)/bin/python3 \
$(MAKE) -C $(@D) install \
$(HOST_NODEJS_SRC_MAKE_OPTS)
$(HOST_NODEJS_SRC_ENABLE_COREPACK)
endef
ifeq ($(BR2_i386),y)
NODEJS_SRC_CPU = ia32
else ifeq ($(BR2_x86_64),y)
NODEJS_SRC_CPU = x64
else ifeq ($(BR2_mips),y)
NODEJS_SRC_CPU = mips
else ifeq ($(BR2_mipsel),y)
NODEJS_SRC_CPU = mipsel
else ifeq ($(BR2_arm),y)
NODEJS_SRC_CPU = arm
# V8 needs to know what floating point ABI the target is using.
NODEJS_SRC_ARM_FP = $(GCC_TARGET_FLOAT_ABI)
# it also wants to know which FPU to use, but only has support for
# vfp, vfpv3, vfpv3-d16 and neon.
ifeq ($(BR2_ARM_FPU_VFPV2),y)
NODEJS_SRC_ARM_FPU = vfp
# vfpv4 is a superset of vfpv3
else ifeq ($(BR2_ARM_FPU_VFPV3)$(BR2_ARM_FPU_VFPV4),y)
NODEJS_SRC_ARM_FPU = vfpv3
# vfpv4-d16 is a superset of vfpv3-d16
else ifeq ($(BR2_ARM_FPU_VFPV3D16)$(BR2_ARM_FPU_VFPV4D16),y)
NODEJS_SRC_ARM_FPU = vfpv3-d16
else ifeq ($(BR2_ARM_FPU_NEON),y)
NODEJS_SRC_ARM_FPU = neon
endif
else ifeq ($(BR2_aarch64),y)
NODEJS_SRC_CPU = arm64
endif
# MIPS architecture specific options
ifeq ($(BR2_mips)$(BR2_mipsel),y)
ifeq ($(BR2_MIPS_CPU_MIPS32R6),y)
NODEJS_SRC_MIPS_ARCH_VARIANT = r6
NODEJS_SRC_MIPS_FPU_MODE = fp64
else ifeq ($(BR2_MIPS_CPU_MIPS32R2),y)
NODEJS_SRC_MIPS_ARCH_VARIANT = r2
else ifeq ($(BR2_MIPS_CPU_MIPS32),y)
NODEJS_SRC_MIPS_ARCH_VARIANT = r1
endif
endif
NODEJS_SRC_LDFLAGS = $(TARGET_LDFLAGS)
ifeq ($(BR2_TOOLCHAIN_HAS_LIBATOMIC),y)
NODEJS_SRC_LDFLAGS += -latomic
endif
# V8's JIT infrastructure requires binaries such as mksnapshot and
# mkpeephole to be run in the host during the build. However, these
# binaries must have the same bit-width as the target (e.g. a x86_64
# host targeting ARMv6 needs to produce a 32-bit binary). To work around this
# issue, cross-compile the binaries for the target and run them on the
# host with QEMU, much like gobject-introspection.
define NODEJS_SRC_INSTALL_V8_QEMU_WRAPPER
$(INSTALL) -D -m 755 $(NODEJS_SRC_PKGDIR)/v8-qemu-wrapper.in \
$(@D)/out/Release/v8-qemu-wrapper
$(SED) "s%@QEMU_USER@%$(QEMU_USER)%g" \
$(@D)/out/Release/v8-qemu-wrapper
$(SED) "s%@TOOLCHAIN_HEADERS_VERSION@%$(BR2_TOOLCHAIN_HEADERS_AT_LEAST)%g" \
$(@D)/out/Release/v8-qemu-wrapper
$(SED) "s%@QEMU_USERMODE_ARGS@%$(call qstrip,$(BR2_PACKAGE_HOST_QEMU_USER_MODE_ARGS))%g" \
$(@D)/out/Release/v8-qemu-wrapper
endef
NODEJS_SRC_PRE_CONFIGURE_HOOKS += NODEJS_SRC_INSTALL_V8_QEMU_WRAPPER
define NODEJS_SRC_WRAPPER_FIXUP
$(SED) "s%@MAYBE_WRAPPER@%'<(PRODUCT_DIR)/v8-qemu-wrapper',%g" $(@D)/node.gyp
$(SED) "s%@MAYBE_WRAPPER@%'<(PRODUCT_DIR)/v8-qemu-wrapper',%g" $(@D)/tools/v8_gypfiles/v8.gyp
endef
NODEJS_SRC_PRE_CONFIGURE_HOOKS += NODEJS_SRC_WRAPPER_FIXUP
# Do not run the qemu-wrapper for the host build.
define HOST_NODEJS_SRC_WRAPPER_FIXUP
$(SED) "s%@MAYBE_WRAPPER@%%g" $(@D)/node.gyp
$(SED) "s%@MAYBE_WRAPPER@%%g" $(@D)/tools/v8_gypfiles/v8.gyp
endef
HOST_NODEJS_SRC_PRE_CONFIGURE_HOOKS += HOST_NODEJS_SRC_WRAPPER_FIXUP
define NODEJS_SRC_CONFIGURE_CMDS
(cd $(@D); \
$(TARGET_CONFIGURE_OPTS) \
PATH=$(@D)/bin:$(BR_PATH) \
LDFLAGS="$(NODEJS_SRC_LDFLAGS)" \
LD="$(TARGET_CXX)" \
PYTHON=$(HOST_DIR)/bin/python3 \
$(HOST_DIR)/bin/python3 configure.py \
--prefix=/usr \
--dest-cpu=$(NODEJS_SRC_CPU) \
$(if $(NODEJS_SRC_ARM_FP),--with-arm-float-abi=$(NODEJS_SRC_ARM_FP)) \
$(if $(NODEJS_SRC_ARM_FPU),--with-arm-fpu=$(NODEJS_SRC_ARM_FPU)) \
$(if $(NODEJS_SRC_MIPS_ARCH_VARIANT),--with-mips-arch-variant=$(NODEJS_SRC_MIPS_ARCH_VARIANT)) \
$(if $(NODEJS_SRC_MIPS_FPU_MODE),--with-mips-fpu-mode=$(NODEJS_SRC_MIPS_FPU_MODE)) \
$(NODEJS_SRC_CONF_OPTS) \
)
endef
define NODEJS_SRC_BUILD_CMDS
$(TARGET_MAKE_ENV) PYTHON=$(HOST_DIR)/bin/python3 \
$(MAKE) -C $(@D) \
$(NODEJS_SRC_MAKE_OPTS)
endef
#
# Build the list of modules to install.
#
NODEJS_SRC_MODULES_LIST= $(call qstrip,\
$(BR2_PACKAGE_NODEJS_MODULES_ADDITIONAL))
#
# We can only call NPM if there's something to install.
#
ifneq ($(NODEJS_SRC_MODULES_LIST),)
NODEJS_SRC_DEPENDENCIES += host-nodejs
define NODEJS_SRC_INSTALL_MODULES
# If you're having trouble with module installation, adding -d to the
# npm install call below and setting npm_config_rollback=false can both
# help in diagnosing the problem.
$(NPM) install -g $(NODEJS_SRC_MODULES_LIST)
endef
# Exclude prebuilt binaries with different architectures and OS from check
NODEJS_SRC_BIN_ARCH_EXCLUDE = /usr/lib/node_modules/
endif
define NODEJS_SRC_INSTALL_STAGING_CMDS
$(TARGET_MAKE_ENV) PYTHON=$(HOST_DIR)/bin/python3 \
$(MAKE) -C $(@D) install \
DESTDIR=$(STAGING_DIR) \
$(NODEJS_SRC_MAKE_OPTS)
endef
define NODEJS_SRC_INSTALL_TARGET_CMDS
$(TARGET_MAKE_ENV) PYTHON=$(HOST_DIR)/bin/python3 \
$(MAKE) -C $(@D) install \
DESTDIR=$(TARGET_DIR) \
$(NODEJS_SRC_MAKE_OPTS)
$(NODEJS_SRC_INSTALL_MODULES)
endef
# node.js configure is a Python script and does not use autotools
$(eval $(generic-package))
$(eval $(host-generic-package))