Files
termux-packages/packages/nodejs/build.sh
termux-pacman-bot f1c7eee994 bump(main/nodejs): v24.2.0
no regressions found when tested on aarch64 device.
Seems good to go. v24 also contains build fix for NDK r28a and r28b, so
we are set and ready for NDK r28.

This fix will be available for the upcoming nodejs-lts release as well
2025-06-10 11:06:46 +00:00

183 lines
6.7 KiB
Bash

TERMUX_PKG_HOMEPAGE=https://nodejs.org/
TERMUX_PKG_DESCRIPTION="Open Source, cross-platform JavaScript runtime environment"
TERMUX_PKG_LICENSE="MIT"
TERMUX_PKG_MAINTAINER="Yaksh Bariya <thunder-coding@termux.dev>"
TERMUX_PKG_VERSION=24.2.0
TERMUX_PKG_SRCURL=https://nodejs.org/dist/v${TERMUX_PKG_VERSION}/node-v${TERMUX_PKG_VERSION}.tar.xz
TERMUX_PKG_SHA256=40143d43efbdeeb9537995f532126c494d63a31da332acb5022f76f00afc62ab
# thunder-coding: don't try to autoupdate nodejs, that thing takes 2 whole hours to build for a single arch, and requires a lot of patch updates everytime. Also I run tests everytime I update it to ensure least bugs
TERMUX_PKG_AUTO_UPDATE=false
# Note that we do not use a shared libuv to avoid an issue with the Android
# linker, which does not use symbols of linked shared libraries when resolving
# symbols on dlopen(). See https://github.com/termux/termux-packages/issues/462.
TERMUX_PKG_DEPENDS="libc++, openssl, c-ares, libicu, libsqlite, zlib"
TERMUX_PKG_CONFLICTS="nodejs-lts, nodejs-current"
TERMUX_PKG_BREAKS="nodejs-dev"
TERMUX_PKG_REPLACES="nodejs-current, nodejs-dev"
TERMUX_PKG_SUGGESTS="clang, make, pkg-config, python"
TERMUX_PKG_RM_AFTER_INSTALL="lib/node_modules/npm/html lib/node_modules/npm/make.bat share/systemtap lib/dtrace"
TERMUX_PKG_BUILD_IN_SRC=true
TERMUX_PKG_HOSTBUILD=true
termux_step_post_get_source() {
# Prevent caching of host build:
rm -Rf $TERMUX_PKG_HOSTBUILD_DIR
}
termux_step_host_build() {
######
# Do host-build of ICU, which is required for nodejs
######
local ICU_VERSION=76.1
local ICU_TAR=icu4c-${ICU_VERSION//./_}-src.tgz
local ICU_DOWNLOAD=https://github.com/unicode-org/icu/releases/download/release-${ICU_VERSION//./-}/$ICU_TAR
termux_download \
$ICU_DOWNLOAD\
$TERMUX_PKG_CACHEDIR/$ICU_TAR \
dfacb46bfe4747410472ce3e1144bf28a102feeaa4e3875bac9b4c6cf30f4f3e
tar xf $TERMUX_PKG_CACHEDIR/$ICU_TAR
cd icu/source
export CC=/usr/bin/clang-18
export CXX=/usr/bin/clang++-18
export LD=/usr/bin/clang++-18
if [ "$TERMUX_ARCH_BITS" = 32 ]; then
./configure --prefix $TERMUX_PKG_HOSTBUILD_DIR/icu-installed \
--disable-samples \
--disable-tests \
--build=i686-pc-linux-gnu "CFLAGS=-m32" "CXXFLAGS=-m32" "LDFLAGS=-m32"
else
./configure --prefix $TERMUX_PKG_HOSTBUILD_DIR/icu-installed \
--disable-samples \
--disable-tests
fi
make -j $TERMUX_PKG_MAKE_PROCESSES install
######
# Download LLVM toolchain used by the upstream v8 project.
# Upstream v8 uses LLVM tooling from the main branch of the LLVM project as
# the main branch often contains bug fixes which are not released quickly to
# stable releases. Also Ubuntu's LLVM toolchain is too old in comparison to
# what Google uses.
######
# The LLVM_COMMIT, as well as the tarball of the LLVM build by Google in use
# can be found in deps/v8/DEPS file,
#
# For instance, if the deps/v8/DEPS file contains:
#
# 'third_party/llvm-build/Release+Asserts': {
# 'dep_type': 'gcs',
# 'bucket': 'chromium-browser-clang',
# 'objects': [
# {
# 'object_name': 'Linux_x64/clang-llvmorg-21-init-5118-g52cd27e6-5.tar.xz',
# 'sha256sum': '790fcc5b04e96882e8227ba7994161ab945c0e096057fc165a0f71e32a7cb061',
# 'size_bytes': 54517328,
# 'generation': 1742541959624765,
# 'condition': 'host_os == "linux"',
# },
#
# then the LLVM_COMMIT is 52cd27e6. The g before the hash is not part of the
# hash, weird that they decided to include a 'g' for no reason, but 'g' isn't
# a part of the hexadecimal characters so anyways.. Also v8 project only
# stores the short-hash in the DEPS file, but we are using full hash here for
# clarity. The full hash can be obtained by having a full checkout of the
# llvm-project locally and then running `git log --format=%H -n 1` in the
# llvm-project directory.
#
# Also the sha256sum is the hash of the tarball, which we can directly use
local LLVM_TAR="clang-llvmorg-21-init-5118-g52cd27e6-5.tar.xz"
local LLVM_TAR_HASH=790fcc5b04e96882e8227ba7994161ab945c0e096057fc165a0f71e32a7cb061
cd $TERMUX_PKG_HOSTBUILD_DIR
mkdir llvm-project-build
termux_download \
"https://commondatastorage.googleapis.com/chromium-browser-clang/Linux_x64/${LLVM_TAR}" \
"${TERMUX_PKG_CACHEDIR}/${LLVM_TAR}" \
"${LLVM_TAR_HASH}"
tar --extract -f "${TERMUX_PKG_CACHEDIR}/${LLVM_TAR}" --directory=llvm-project-build
}
termux_step_pre_configure() {
termux_setup_ninja
}
termux_step_configure() {
local DEST_CPU
if [ $TERMUX_ARCH = "arm" ]; then
DEST_CPU="arm"
elif [ $TERMUX_ARCH = "i686" ]; then
DEST_CPU="ia32"
elif [ $TERMUX_ARCH = "aarch64" ]; then
DEST_CPU="arm64"
elif [ $TERMUX_ARCH = "x86_64" ]; then
DEST_CPU="x64"
else
termux_error_exit "Unsupported arch '$TERMUX_ARCH'"
fi
export GYP_DEFINES="host_os=linux"
if [ "$TERMUX_ARCH_BITS" = "64" ]; then
export CC_host="$TERMUX_PKG_HOSTBUILD_DIR/llvm-project-build/bin/clang"
export CXX_host="$TERMUX_PKG_HOSTBUILD_DIR/llvm-project-build/bin/clang++"
export LINK_host="$TERMUX_PKG_HOSTBUILD_DIR/llvm-project-build/bin/clang++"
else
export CC_host="$TERMUX_PKG_HOSTBUILD_DIR/llvm-project-build/bin/clang -m32"
export CXX_host="$TERMUX_PKG_HOSTBUILD_DIR/llvm-project-build/bin/clang++ -m32"
export LINK_host="$TERMUX_PKG_HOSTBUILD_DIR/llvm-project-build/bin/clang++ -m32"
fi
LDFLAGS+=" -ldl"
# See note above TERMUX_PKG_DEPENDS why we do not use a shared libuv.
# When building with ninja, build.ninja is generated for both Debug and Release builds.
./configure \
--prefix=$TERMUX_PREFIX \
--dest-cpu=$DEST_CPU \
--dest-os=android \
--shared-cares \
--shared-openssl \
--shared-sqlite \
--shared-zlib \
--with-intl=system-icu \
--cross-compiling \
--ninja
export LD_LIBRARY_PATH=$TERMUX_PKG_HOSTBUILD_DIR/icu-installed/lib
sed -i \
-e "s|\-I$TERMUX_PREFIX/include||g" \
-e "s|\-L$TERMUX_PREFIX/lib||g" \
-e "s|-licui18n||g" \
-e "s|-licuuc||g" \
-e "s|-licudata||g" \
$TERMUX_PKG_SRCDIR/out/{Release,Debug}/obj.host/node_js2c.ninja
sed -i \
-e "s|\-I$TERMUX_PREFIX/include|-I$TERMUX_PKG_HOSTBUILD_DIR/icu-installed/include|g" \
-e "s|\-L$TERMUX_PREFIX/lib|-L$TERMUX_PKG_HOSTBUILD_DIR/icu-installed/lib|g" \
-e "s|\-L$TERMUX_PREFIX$TERMUX_PREFIX/lib||g" \
$(find $TERMUX_PKG_SRCDIR/out/{Release,Debug}/obj.host -name '*.ninja')
}
termux_step_make() {
if [ "${TERMUX_DEBUG_BUILD}" = "true" ]; then
ninja -C out/Debug -j "${TERMUX_PKG_MAKE_PROCESSES}"
else
ninja -C out/Release -j "${TERMUX_PKG_MAKE_PROCESSES}"
fi
}
termux_step_make_install() {
local _BUILD_DIR=out/
if [ "${TERMUX_DEBUG_BUILD}" = "true" ]; then
_BUILD_DIR+="/Debug/"
else
_BUILD_DIR+="/Release/"
fi
python tools/install.py install --dest-dir="" --prefix "${TERMUX_PREFIX}" --build-dir "$_BUILD_DIR"
}
termux_step_create_debscripts() {
cat <<- EOF > ./postinst
#!$TERMUX_PREFIX/bin/sh
npm config set foreground-scripts true
EOF
}