diff --git a/bin/copy-recipes.sh b/bin/copy-recipes.sh new file mode 100755 index 0000000..f7908b5 --- /dev/null +++ b/bin/copy-recipes.sh @@ -0,0 +1,52 @@ +#!/bin/bash -eu + +# Copies files from recipes/x64-glibc-217 to: +# recipes/x64-pointer-compression +# recipes/x86 + +__dirname="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +recipesDir="$(dirname "$__dirname")/recipes" +srcRecipeDir="$recipesDir/x64-glibc-217" + + + +# Copy to x64-pointer-compression + +for dirBase in x64-pointer-compression; do + destRecipeDir="$recipesDir/$dirBase" + mkdir -p "$destRecipeDir/files" + + cp -f "$srcRecipeDir/Dockerfile" "$destRecipeDir/" + cp -f "$srcRecipeDir/run.sh" "$destRecipeDir/" + # cp -f "$srcRecipeDir/run_other.sh" "$destRecipeDir/" # Recipe specific code + cp -f "$srcRecipeDir/run_versions.sh" "$destRecipeDir/" + # cp -f "$srcRecipeDir/should-build.sh" "$destRecipeDir/" # Pointer compression is supported from v13.4 + cp -rf "$srcRecipeDir/files/"* "$destRecipeDir/files/" +done + + + +# Copy to x86 + +if true; then + destRecipeDir="$recipesDir/x86" + mkdir -p "$destRecipeDir/files" + + cp -f "$srcRecipeDir/Dockerfile" "$destRecipeDir/" + cp -f "$srcRecipeDir/run.sh" "$destRecipeDir/" + # cp -f "$srcRecipeDir/run_other.sh" "$destRecipeDir/" # Recipe specific code + # cp -f "$srcRecipeDir/run_versions.sh" "$destRecipeDir/" # Different versions of programs are used (because devtoolset-12 is not available) + # cp -f "$srcRecipeDir/should-build.sh" "$destRecipeDir/" + + # cp -f "$srcRecipeDir/files/"*.repo "$destRecipeDir/files/" # Different versions of programs are used (because devtoolset-12 is not available) + # cp -f "$srcRecipeDir/files/installPrerequisites" "$destRecipeDir/files/" # Different versions of programs are used (because devtoolset-12 is not available) + cp -f "$srcRecipeDir/files/installFromSourceCode" "$destRecipeDir/files/" + cp -f "$srcRecipeDir/files/opt__gcc15__enable" "$destRecipeDir/files/" + + sed -i -e 's/ --platform=linux\/amd64 / --platform=linux\/386 /g' "$destRecipeDir/Dockerfile" + sed -i -E 's/# RUN (.* binutils )/RUN \1/g' "$destRecipeDir/Dockerfile" + sed -i -E 's/--build=x86_64-redhat-linux/--build=i686-redhat-linux/g' "$destRecipeDir/Dockerfile" + # sed -i -e 's/gcc-15.1.0/gcc-12.4.0/g' "$destRecipeDir/Dockerfile" + # sed -i -e 's/gcc15/gcc12/g' "$destRecipeDir/Dockerfile" "$destRecipeDir/files/opt__gcc12__enable" "$destRecipeDir/files/installFromSourceCode" + sed -i -e 's/devtoolset-12/devtoolset-9/g' "$destRecipeDir/files/opt__gcc"*'__enable' +fi diff --git a/recipes/x64-glibc-217/Dockerfile b/recipes/x64-glibc-217/Dockerfile index f83868d..01856fa 100644 --- a/recipes/x64-glibc-217/Dockerfile +++ b/recipes/x64-glibc-217/Dockerfile @@ -1,4 +1,4 @@ -FROM centos:7 +FROM --platform=linux/amd64 centos:7 ARG GID=1000 ARG UID=1000 @@ -6,34 +6,18 @@ ARG UID=1000 RUN groupadd --gid $GID node \ && adduser --gid $GID --uid $UID node -RUN cat </dev/null && ./contrib/download_prerequisites +./configure $configureArgsStr +make -j $(nproc) +make install + +hash -r +ccache -s > "/root/ccacheStat_$name.txt" diff --git a/recipes/x64-glibc-217/files/installPrerequisites b/recipes/x64-glibc-217/files/installPrerequisites new file mode 100644 index 0000000..38ba177 --- /dev/null +++ b/recipes/x64-glibc-217/files/installPrerequisites @@ -0,0 +1,12 @@ +#!/bin/bash -eux + +sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-* +sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-* +yum install -y epel-release # Adds extra repos +yum upgrade -y + +yum install -y bzip2 # Required to compile gcc +yum install -y gcc-c++ # Required to compile Node.js v7- +yum install -y make # Allows compilation +yum install -y ccache # Allows caching +yum install -y devtoolset-12 # Includes gcc 12.1.1 diff --git a/recipes/x64-glibc-217/files/opt__gcc15__enable b/recipes/x64-glibc-217/files/opt__gcc15__enable new file mode 100644 index 0000000..f25221a --- /dev/null +++ b/recipes/x64-glibc-217/files/opt__gcc15__enable @@ -0,0 +1,15 @@ +#!/bin/bash -eux + +DIR=/opt/gcc15 + +source /opt/rh/devtoolset-12/enable + +export PATH="$DIR/bin${PATH:+:${PATH}}" +export MANPATH="$DIR/share/man${MANPATH:+:${MANPATH}}" +export INFOPATH="$DIR/share/info${INFOPATH:+:${INFOPATH}}" +export LD_LIBRARY_PATH="$DIR/lib64:$DIR/lib${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}" +export PKG_CONFIG_PATH="$DIR/lib64/pkgconfig${PKG_CONFIG_PATH:+:${PKG_CONFIG_PATH}}" + +if [ -f "$DIR/bin/gcc" ]; then + export LDFLAGS='-static-libstdc++' +fi diff --git a/recipes/x64-glibc-217/run.sh b/recipes/x64-glibc-217/run.sh index 740e069..b0f5c2f 100755 --- a/recipes/x64-glibc-217/run.sh +++ b/recipes/x64-glibc-217/run.sh @@ -1,7 +1,8 @@ -#!/usr/bin/env bash +#!/bin/bash -eux -set -e -set -x + + +# Init release_urlbase="$1" disttype="$2" @@ -11,37 +12,59 @@ commit="$5" fullversion="$6" source_url="$7" source_urlbase="$8" -config_flags="" -cd /home/node +homeDir=/home/node +nodeDir="$homeDir/node-$fullversion" + +tar --directory="$homeDir" -xf "$homeDir/node.tar.xz" + -tar -xf node.tar.xz -# configuring cares correctly to not use sys/random.h on this target -cd "node-${fullversion}"/deps/cares -sed -i 's/define HAVE_SYS_RANDOM_H 1/undef HAVE_SYS_RANDOM_H/g' ./config/linux/ares_config.h -sed -i 's/define HAVE_GETRANDOM 1/undef HAVE_GETRANDOM/g' ./config/linux/ares_config.h +# Patch the code -# fix https://github.com/c-ares/c-ares/issues/850 -if [[ "$(grep -o 'ARES_VERSION_STR "[^"]*"' ./include/ares_version.h | awk '{print $2}' | tr -d '"')" == "1.33.0" ]]; then - sed -i 's/MSG_FASTOPEN/TCP_FASTOPEN_CONNECT/g' ./src/lib/ares__socket.c +# Configuring cares correctly to not use sys/random.h on this target +cd "$nodeDir/deps/cares/config/linux" +sed -i 's/define HAVE_SYS_RANDOM_H 1/undef HAVE_SYS_RANDOM_H/g' ares_config.h +sed -i 's/define HAVE_GETRANDOM 1/undef HAVE_GETRANDOM/g' ares_config.h + +# Fix https://github.com/c-ares/c-ares/issues/850 +cd "$nodeDir/deps/cares" +if [[ "$(grep -o 'ARES_VERSION_STR "[^"]*"' include/ares_version.h | awk '{print $2}' | tr -d '"')" == "1.33.0" ]]; then + sed -i 's/MSG_FASTOPEN/TCP_FASTOPEN_CONNECT/g' src/lib/ares__socket.c fi -cd /home/node +# Linux implementation of experimental WASM memory control requires Linux 3.17 & glibc 2.27 so disable it +cd "$nodeDir/deps/v8/src" +[ -f d8/d8.cc ] && sed -i -e 's/#if V8_TARGET_OS_LINUX/#if false/g' wasm/wasm-objects.cc d8/d8.cc + + -cd "node-${fullversion}" +# Prepare to compile Node.js -export CC="ccache gcc" -export CXX="ccache g++" export MAJOR_VERSION=$(echo ${fullversion} | cut -d . -f 1 | tr --delete v) -. /opt/rh/devtoolset-12/enable -. /opt/rh/rh-python38/enable +isNodeVersionGE() { + printf "$1\n$fullversion" | sort -VC +} + +source "$homeDir/run_other.sh" +source "$homeDir/run_versions.sh" + +setPython +setGCC + + + +# Compile Node.js + +cd "$nodeDir" +export CC='ccache gcc' +export CXX='ccache g++' make -j$(getconf _NPROCESSORS_ONLN) binary V= \ - DESTCPU="x64" \ - ARCH="x64" \ - VARIATION="glibc-217" \ + DESTCPU="$destCPU" \ + ARCH="$arch" \ + VARIATION="$variation" \ DISTTYPE="$disttype" \ CUSTOMTAG="$customtag" \ DATESTRING="$datestring" \ @@ -49,4 +72,5 @@ make -j$(getconf _NPROCESSORS_ONLN) binary V= \ RELEASE_URLBASE="$release_urlbase" \ CONFIG_FLAGS="$config_flags" +"$nodeDir/node" -p process.versions # Make sure there is no "Segmentation fault" error (example: node v21.0~v21.2 x64-pointer-compression) mv node-*.tar.?z /out/ diff --git a/recipes/x64-glibc-217/run_other.sh b/recipes/x64-glibc-217/run_other.sh new file mode 100644 index 0000000..f09863c --- /dev/null +++ b/recipes/x64-glibc-217/run_other.sh @@ -0,0 +1,9 @@ +#!/bin/bash -eux + +config_flags= +destCPU=x64 +arch=x64 +variation=glibc-217 + +# export CFLAGS='-march=skylake' +# export CXXFLAGS='-march=skylake' diff --git a/recipes/x64-glibc-217/run_versions.sh b/recipes/x64-glibc-217/run_versions.sh new file mode 100644 index 0000000..b5d1130 --- /dev/null +++ b/recipes/x64-glibc-217/run_versions.sh @@ -0,0 +1,15 @@ +#!/bin/bash -eux + +setPython() { + if isNodeVersionGE 'v22.3'; then export PYTHON='python3.13'; return; fi # Python 3.13: Node.js v22.3 ~ latest (v24.3) + if isNodeVersionGE 'v14.14'; then export PYTHON='python3.9'; return; fi # Python 3.9: Node.js v14.14 ~ latest (v24.3) + if isNodeVersionGE 'v4.0'; then export PYTHON='python2.7'; return; fi # Python 2.7: Node.js v4.0 ~ v15.14 (latest) + + # Node.js v16.0 is first version not supporting Python 2.7 but supports Python 3.6 ~ 3.9 so Python 3.9 is chosen +} + +setGCC() { + if isNodeVersionGE 'v22.3'; then source /opt/gcc15/enable; return; fi # GCC 15.1: Node.js v22.3 ~ latest (v24.3) + if isNodeVersionGE 'v8.0'; then source /opt/rh/devtoolset-12/enable; return; fi # GCC 12.1: Node.js v8.0 ~ v22.1 + # GCC 4.8.5: Node.js v4.0 ~ v10.14 +} diff --git a/recipes/x64-glibc-217/should-build.sh b/recipes/x64-glibc-217/should-build.sh index 5e683eb..3f0e74c 100755 --- a/recipes/x64-glibc-217/should-build.sh +++ b/recipes/x64-glibc-217/should-build.sh @@ -3,8 +3,15 @@ __dirname=$1 fullversion=$2 -. ${__dirname}/_decode_version.sh +isNodeVersionGE() { + printf "$1\n$fullversion" | sort -VC +} -decode "$fullversion" +isNodeVersionLT() { + ! printf "$1\n$fullversion" | sort -VC +} -test "$major" -ge "18" && test "$major" -lt "24" +isNodeVersionGE 'v6.2' # Node.js v6.1- cannot download required files due to broken links + +isNodeVersionLT 'v17.0' || isNodeVersionGE 'v18.0' # Node.js v17 requires GCC version between 4.8.5 and 12.1 which is not installed +isNodeVersionLT 'v22.2' || isNodeVersionGE 'v22.3' # Node.js v22.2 requires GCC version between 12.1 and 15.1 which is not installed diff --git a/recipes/x64-pointer-compression/Dockerfile b/recipes/x64-pointer-compression/Dockerfile index 84ddff6..01856fa 100644 --- a/recipes/x64-pointer-compression/Dockerfile +++ b/recipes/x64-pointer-compression/Dockerfile @@ -1,4 +1,4 @@ -FROM centos:7 +FROM --platform=linux/amd64 centos:7 ARG GID=1000 ARG UID=1000 @@ -6,46 +6,18 @@ ARG UID=1000 RUN groupadd --gid $GID node \ && adduser --gid $GID --uid $UID node -COPY cloudlinux.repo /etc/yum.repos.d/cloudlinux.repo - -# patch repos and install base dependencies -RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-* \ - && sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-* \ - && yum install -y epel-release \ - && yum upgrade -y \ - && yum install -y \ - git \ - curl \ - make \ - python2 \ - ccache \ - xz-utils \ - devtoolset-8 \ - devtoolset-9 \ - glibc-devel - -# installs c compiler dev tools and builds python >=3.8 from source as it is needed for node >=v22 -ENV PYTHON_VERSION="3.10.15" -RUN yum groupinstall -y "Development Tools" \ - && yum install -y \ - gcc \ - gcc-c++ \ - make \ - zlib-devel \ - bzip2-devel \ - openssl-devel \ - libffi-devel \ - sqlite-devel \ - readline-devel \ - && curl https://www.python.org/ftp/python/${PYTHON_VERSION}/Python-${PYTHON_VERSION}.tgz -O \ - && tar xzf Python-${PYTHON_VERSION}.tgz \ - && cd Python-${PYTHON_VERSION} \ - && ./configure --enable-optimizations \ - && make altinstall \ - && PYTHON_MAJOR_MINOR_VERSION=$(echo $PYTHON_VERSION | cut -d. -f1,2) \ - && ln -sf /usr/local/bin/python${PYTHON_MAJOR_MINOR_VERSION} /usr/bin/python3 - -COPY --chown=node:node run.sh /home/node/run.sh +COPY --chmod=755 files/installPrerequisites /root/installPrerequisites +COPY files/*.repo /etc/yum.repos.d/ +RUN /root/installPrerequisites + +COPY --chmod=755 files/installFromSourceCode /root/installFromSourceCode +COPY --chmod=755 files/opt__gcc15__enable /opt/gcc15/enable +RUN --mount=type=cache,target=/root/.ccache --mount=type=tmpfs,target=/usr/src /root/installFromSourceCode python3 https://www.python.org/ftp/python/3.9.23/Python-3.9.23.tar.xz '--prefix=/usr/local/' +RUN --mount=type=cache,target=/root/.ccache --mount=type=tmpfs,target=/usr/src /root/installFromSourceCode python3 https://www.python.org/ftp/python/3.13.5/Python-3.13.5.tar.xz '--prefix=/usr/local/' +RUN --mount=type=cache,target=/root/.ccache --mount=type=tmpfs,target=/usr/src /root/installFromSourceCode gcc https://gcc.gnu.org/pub/gcc/releases/gcc-15.1.0/gcc-15.1.0.tar.xz '--prefix=/opt/gcc15/ --with-default-libstdcxx-abi=gcc4-compatible --enable-languages=c,c++ --enable-checking=release --enable-gnu-indirect-function --with-linker-hash-style=gnu --disable-bootstrap --disable-multilib --build=x86_64-redhat-linux' +# RUN --mount=type=cache,target=/root/.ccache --mount=type=tmpfs,target=/usr/src /root/installFromSourceCode binutils https://sourceware.org/pub/binutils/releases/binutils-2.44.tar.xz '--prefix=/opt/gcc15/ --without-debuginfod --disable-nls LDFLAGS=-pthread' + +COPY --chmod=755 --chown=node:node run.sh run_other.sh run_versions.sh /home/node/ VOLUME /home/node/.ccache VOLUME /out diff --git a/recipes/x64-pointer-compression/cloudlinux.repo b/recipes/x64-pointer-compression/cloudlinux.repo deleted file mode 100644 index 2ca8962..0000000 --- a/recipes/x64-pointer-compression/cloudlinux.repo +++ /dev/null @@ -1,9 +0,0 @@ -[cloudlinux-sclo-devtoolset-8] -name=Cloudlinux devtoolset-8 -baseurl=https://repo.cloudlinux.com/cloudlinux/7/sclo/devtoolset-8/x86_64/ -gpgcheck=0 - -[cloudlinux-sclo-devtoolset-9] -name=Cloudlinux devtoolset-9 -baseurl=https://repo.cloudlinux.com/cloudlinux/7/sclo/devtoolset-9/x86_64/ -gpgcheck=0 diff --git a/recipes/x64-pointer-compression/files/etc__yum.repos.d__devtoolset.repo b/recipes/x64-pointer-compression/files/etc__yum.repos.d__devtoolset.repo new file mode 100644 index 0000000..81064ea --- /dev/null +++ b/recipes/x64-pointer-compression/files/etc__yum.repos.d__devtoolset.repo @@ -0,0 +1,4 @@ +[devtoolset-12] +name=Devtoolset 12 +baseurl=https://buildlogs.centos.org/c7-devtoolset-12.x86_64/ +gpgcheck=0 diff --git a/recipes/x64-pointer-compression/files/installFromSourceCode b/recipes/x64-pointer-compression/files/installFromSourceCode new file mode 100644 index 0000000..ebbab3b --- /dev/null +++ b/recipes/x64-pointer-compression/files/installFromSourceCode @@ -0,0 +1,36 @@ +#!/bin/bash -eux + +# Calc vars + + id="$1" +url="$2" +configureArgsStr="$3" + +base=$(basename "$url") +name=${base%.*} +name=${name%.tar} + ext=${base:${#name}} + +case "$ext" in + .tar.xz|.txz) formatOpt=--xz;; + .tar.gz|.tgz) formatOpt=--gzip;; + .tar.bz2|.tbz2) formatOpt=--bzip2;; + *) formatOpt=--auto-compress +esac + +# Run commands + +curl -fL "$url" | tar --extract --directory=/usr/src "$formatOpt" + +source /opt/gcc15/enable +export CC='ccache gcc' +export CXX='ccache g++' + +cd "/usr/src/$name" +chmod +x ./contrib/download_prerequisites 2>/dev/null && ./contrib/download_prerequisites +./configure $configureArgsStr +make -j $(nproc) +make install + +hash -r +ccache -s > "/root/ccacheStat_$name.txt" diff --git a/recipes/x64-pointer-compression/files/installPrerequisites b/recipes/x64-pointer-compression/files/installPrerequisites new file mode 100644 index 0000000..38ba177 --- /dev/null +++ b/recipes/x64-pointer-compression/files/installPrerequisites @@ -0,0 +1,12 @@ +#!/bin/bash -eux + +sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-* +sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-* +yum install -y epel-release # Adds extra repos +yum upgrade -y + +yum install -y bzip2 # Required to compile gcc +yum install -y gcc-c++ # Required to compile Node.js v7- +yum install -y make # Allows compilation +yum install -y ccache # Allows caching +yum install -y devtoolset-12 # Includes gcc 12.1.1 diff --git a/recipes/x64-pointer-compression/files/opt__gcc15__enable b/recipes/x64-pointer-compression/files/opt__gcc15__enable new file mode 100644 index 0000000..f25221a --- /dev/null +++ b/recipes/x64-pointer-compression/files/opt__gcc15__enable @@ -0,0 +1,15 @@ +#!/bin/bash -eux + +DIR=/opt/gcc15 + +source /opt/rh/devtoolset-12/enable + +export PATH="$DIR/bin${PATH:+:${PATH}}" +export MANPATH="$DIR/share/man${MANPATH:+:${MANPATH}}" +export INFOPATH="$DIR/share/info${INFOPATH:+:${INFOPATH}}" +export LD_LIBRARY_PATH="$DIR/lib64:$DIR/lib${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}" +export PKG_CONFIG_PATH="$DIR/lib64/pkgconfig${PKG_CONFIG_PATH:+:${PKG_CONFIG_PATH}}" + +if [ -f "$DIR/bin/gcc" ]; then + export LDFLAGS='-static-libstdc++' +fi diff --git a/recipes/x64-pointer-compression/run.sh b/recipes/x64-pointer-compression/run.sh index 7ac9dab..b0f5c2f 100755 --- a/recipes/x64-pointer-compression/run.sh +++ b/recipes/x64-pointer-compression/run.sh @@ -1,7 +1,8 @@ -#!/usr/bin/env bash +#!/bin/bash -eux -set -e -set -x + + +# Init release_urlbase="$1" disttype="$2" @@ -11,33 +12,59 @@ commit="$5" fullversion="$6" source_url="$7" source_urlbase="$8" -config_flags=--experimental-enable-pointer-compression -cd /home/node +homeDir=/home/node +nodeDir="$homeDir/node-$fullversion" -tar -xf node.tar.xz +tar --directory="$homeDir" -xf "$homeDir/node.tar.xz" -# configuring cares correctly to not use sys/random.h on this target -cd "node-${fullversion}"/deps/cares/config/linux -sed -i 's/define HAVE_SYS_RANDOM_H 1/undef HAVE_SYS_RANDOM_H/g' ./ares_config.h -sed -i 's/define HAVE_GETRANDOM 1/undef HAVE_GETRANDOM/g' ./ares_config.h -cd /home/node -cd "node-${fullversion}" +# Patch the code -export CC="ccache gcc" -export CXX="ccache g++" -export MAJOR_VERSION=$(echo ${fullversion} | cut -d . -f 1 | tr --delete v) +# Configuring cares correctly to not use sys/random.h on this target +cd "$nodeDir/deps/cares/config/linux" +sed -i 's/define HAVE_SYS_RANDOM_H 1/undef HAVE_SYS_RANDOM_H/g' ares_config.h +sed -i 's/define HAVE_GETRANDOM 1/undef HAVE_GETRANDOM/g' ares_config.h -if [ $MAJOR_VERSION -ge 16 ]; then - . /opt/rh/devtoolset-9/enable +# Fix https://github.com/c-ares/c-ares/issues/850 +cd "$nodeDir/deps/cares" +if [[ "$(grep -o 'ARES_VERSION_STR "[^"]*"' include/ares_version.h | awk '{print $2}' | tr -d '"')" == "1.33.0" ]]; then + sed -i 's/MSG_FASTOPEN/TCP_FASTOPEN_CONNECT/g' src/lib/ares__socket.c fi +# Linux implementation of experimental WASM memory control requires Linux 3.17 & glibc 2.27 so disable it +cd "$nodeDir/deps/v8/src" +[ -f d8/d8.cc ] && sed -i -e 's/#if V8_TARGET_OS_LINUX/#if false/g' wasm/wasm-objects.cc d8/d8.cc + + + +# Prepare to compile Node.js + +export MAJOR_VERSION=$(echo ${fullversion} | cut -d . -f 1 | tr --delete v) + +isNodeVersionGE() { + printf "$1\n$fullversion" | sort -VC +} + +source "$homeDir/run_other.sh" +source "$homeDir/run_versions.sh" + +setPython +setGCC + + + +# Compile Node.js + +cd "$nodeDir" +export CC='ccache gcc' +export CXX='ccache g++' + make -j$(getconf _NPROCESSORS_ONLN) binary V= \ - DESTCPU="x64" \ - ARCH="x64" \ - VARIATION="pointer-compression" \ + DESTCPU="$destCPU" \ + ARCH="$arch" \ + VARIATION="$variation" \ DISTTYPE="$disttype" \ CUSTOMTAG="$customtag" \ DATESTRING="$datestring" \ @@ -45,4 +72,5 @@ make -j$(getconf _NPROCESSORS_ONLN) binary V= \ RELEASE_URLBASE="$release_urlbase" \ CONFIG_FLAGS="$config_flags" +"$nodeDir/node" -p process.versions # Make sure there is no "Segmentation fault" error (example: node v21.0~v21.2 x64-pointer-compression) mv node-*.tar.?z /out/ diff --git a/recipes/x64-pointer-compression/run_other.sh b/recipes/x64-pointer-compression/run_other.sh new file mode 100644 index 0000000..6a9d469 --- /dev/null +++ b/recipes/x64-pointer-compression/run_other.sh @@ -0,0 +1,6 @@ +#!/bin/bash -eux + +config_flags=--experimental-enable-pointer-compression +destCPU=x64 +arch=x64 +variation=pointer-compression diff --git a/recipes/x64-pointer-compression/run_versions.sh b/recipes/x64-pointer-compression/run_versions.sh new file mode 100644 index 0000000..b5d1130 --- /dev/null +++ b/recipes/x64-pointer-compression/run_versions.sh @@ -0,0 +1,15 @@ +#!/bin/bash -eux + +setPython() { + if isNodeVersionGE 'v22.3'; then export PYTHON='python3.13'; return; fi # Python 3.13: Node.js v22.3 ~ latest (v24.3) + if isNodeVersionGE 'v14.14'; then export PYTHON='python3.9'; return; fi # Python 3.9: Node.js v14.14 ~ latest (v24.3) + if isNodeVersionGE 'v4.0'; then export PYTHON='python2.7'; return; fi # Python 2.7: Node.js v4.0 ~ v15.14 (latest) + + # Node.js v16.0 is first version not supporting Python 2.7 but supports Python 3.6 ~ 3.9 so Python 3.9 is chosen +} + +setGCC() { + if isNodeVersionGE 'v22.3'; then source /opt/gcc15/enable; return; fi # GCC 15.1: Node.js v22.3 ~ latest (v24.3) + if isNodeVersionGE 'v8.0'; then source /opt/rh/devtoolset-12/enable; return; fi # GCC 12.1: Node.js v8.0 ~ v22.1 + # GCC 4.8.5: Node.js v4.0 ~ v10.14 +} diff --git a/recipes/x64-pointer-compression/should-build.sh b/recipes/x64-pointer-compression/should-build.sh index 513aff9..6c2fb6f 100755 --- a/recipes/x64-pointer-compression/should-build.sh +++ b/recipes/x64-pointer-compression/should-build.sh @@ -3,8 +3,20 @@ __dirname=$1 fullversion=$2 -. ${__dirname}/_decode_version.sh +isNodeVersionGE() { + printf "$1\n$fullversion" | sort -VC +} -decode "$fullversion" +isNodeVersionLT() { + ! printf "$1\n$fullversion" | sort -VC +} -test "$major" -ge "14" && test "$major" -lt "23" +isNodeVersionGE 'v13.4' # Pointer compression is supported since Node.js v13.4 + +isNodeVersionLT 'v17.0' || isNodeVersionGE 'v18.0' # Node.js v17 requires GCC version between 4.8.5 and 12.1 which is not installed +isNodeVersionLT 'v22.2' || isNodeVersionGE 'v22.3' # Node.js v22.2 requires GCC version between 12.1 and 15.1 which is not installed + +isNodeVersionLT 'v20.17' || isNodeVersionGE 'v21.0' # Pointer compression does not work in Node.js v20.17~v20.19 (Compilation error) +isNodeVersionLT 'v21.0' || isNodeVersionGE 'v21.3' # Pointer compression does not work in Node.js v21.0~v21.2 (Segmentation fault) +isNodeVersionLT 'v22.6' || isNodeVersionGE 'v22.17' # Pointer compression does not work in Node.js v22.6~v22.16 (Compilation error) +isNodeVersionLT 'v23.0' || isNodeVersionGE 'v24.2' # Pointer compression does not work in Node.js v23.0~v24.1 (Compilation error) diff --git a/recipes/x86/Dockerfile b/recipes/x86/Dockerfile index d195706..cb806d6 100644 --- a/recipes/x86/Dockerfile +++ b/recipes/x86/Dockerfile @@ -1,4 +1,4 @@ -FROM centos:7 +FROM --platform=linux/386 centos:7 ARG GID=1000 ARG UID=1000 @@ -6,25 +6,18 @@ ARG UID=1000 RUN groupadd --gid $GID node \ && adduser --gid $GID --uid $UID node -COPY cloudlinux.repo /etc/yum.repos.d/cloudlinux.repo - -RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-* \ - && sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-* \ - && yum install -y epel-release \ - && yum upgrade -y \ - && yum install -y \ - git \ - curl \ - make \ - python2 \ - python3 \ - ccache \ - xz-utils \ - devtoolset-6.i686 \ - devtoolset-9.i686 \ - glibc-devel.i686 - -COPY --chown=node:node run.sh /home/node/run.sh +COPY --chmod=755 files/installPrerequisites /root/installPrerequisites +COPY files/*.repo /etc/yum.repos.d/ +RUN /root/installPrerequisites + +COPY --chmod=755 files/installFromSourceCode /root/installFromSourceCode +COPY --chmod=755 files/opt__gcc15__enable /opt/gcc15/enable +RUN --mount=type=cache,target=/root/.ccache --mount=type=tmpfs,target=/usr/src /root/installFromSourceCode python3 https://www.python.org/ftp/python/3.9.23/Python-3.9.23.tar.xz '--prefix=/usr/local/' +RUN --mount=type=cache,target=/root/.ccache --mount=type=tmpfs,target=/usr/src /root/installFromSourceCode python3 https://www.python.org/ftp/python/3.13.5/Python-3.13.5.tar.xz '--prefix=/usr/local/' +RUN --mount=type=cache,target=/root/.ccache --mount=type=tmpfs,target=/usr/src /root/installFromSourceCode gcc https://gcc.gnu.org/pub/gcc/releases/gcc-15.1.0/gcc-15.1.0.tar.xz '--prefix=/opt/gcc15/ --with-default-libstdcxx-abi=gcc4-compatible --enable-languages=c,c++ --enable-checking=release --enable-gnu-indirect-function --with-linker-hash-style=gnu --disable-bootstrap --disable-multilib --build=i686-redhat-linux' +RUN --mount=type=cache,target=/root/.ccache --mount=type=tmpfs,target=/usr/src /root/installFromSourceCode binutils https://sourceware.org/pub/binutils/releases/binutils-2.44.tar.xz '--prefix=/opt/gcc15/ --without-debuginfod --disable-nls LDFLAGS=-pthread' + +COPY --chmod=755 --chown=node:node run.sh run_other.sh run_versions.sh /home/node/ VOLUME /home/node/.ccache VOLUME /out diff --git a/recipes/x86/cloudlinux.repo b/recipes/x86/cloudlinux.repo deleted file mode 100644 index e4551b0..0000000 --- a/recipes/x86/cloudlinux.repo +++ /dev/null @@ -1,9 +0,0 @@ -[cloudlinux-sclo-devtoolset-6] -name=Cloudlinux devtoolset-6 -baseurl=https://repo.cloudlinux.com/cloudlinux/7/sclo/devtoolset-6/i386/ -gpgcheck=0 - -[cloudlinux-sclo-devtoolset-9] -name=Cloudlinux devtoolset-9 -baseurl=https://repo.cloudlinux.com/cloudlinux/7/sclo/devtoolset-9/i386/ -gpgcheck=0 diff --git a/recipes/x86/files/etc__yum.repos.d__devtoolset.repo b/recipes/x86/files/etc__yum.repos.d__devtoolset.repo new file mode 100644 index 0000000..4d03dac --- /dev/null +++ b/recipes/x86/files/etc__yum.repos.d__devtoolset.repo @@ -0,0 +1,4 @@ +[cloudlinux-sclo-devtoolset-9] +name=Cloudlinux devtoolset-9 +baseurl=https://repo.cloudlinux.com/cloudlinux/7/sclo/devtoolset-9/i386/ +gpgcheck=0 diff --git a/recipes/x86/files/etc__yum.repos.d__epel.repo b/recipes/x86/files/etc__yum.repos.d__epel.repo new file mode 100644 index 0000000..cd99e33 --- /dev/null +++ b/recipes/x86/files/etc__yum.repos.d__epel.repo @@ -0,0 +1,4 @@ +[epel] +name=epel +baseurl=https://buildlogs.centos.org/c7-epel.i386/ +gpgcheck=0 diff --git a/recipes/x86/files/installFromSourceCode b/recipes/x86/files/installFromSourceCode new file mode 100644 index 0000000..ebbab3b --- /dev/null +++ b/recipes/x86/files/installFromSourceCode @@ -0,0 +1,36 @@ +#!/bin/bash -eux + +# Calc vars + + id="$1" +url="$2" +configureArgsStr="$3" + +base=$(basename "$url") +name=${base%.*} +name=${name%.tar} + ext=${base:${#name}} + +case "$ext" in + .tar.xz|.txz) formatOpt=--xz;; + .tar.gz|.tgz) formatOpt=--gzip;; + .tar.bz2|.tbz2) formatOpt=--bzip2;; + *) formatOpt=--auto-compress +esac + +# Run commands + +curl -fL "$url" | tar --extract --directory=/usr/src "$formatOpt" + +source /opt/gcc15/enable +export CC='ccache gcc' +export CXX='ccache g++' + +cd "/usr/src/$name" +chmod +x ./contrib/download_prerequisites 2>/dev/null && ./contrib/download_prerequisites +./configure $configureArgsStr +make -j $(nproc) +make install + +hash -r +ccache -s > "/root/ccacheStat_$name.txt" diff --git a/recipes/x86/files/installPrerequisites b/recipes/x86/files/installPrerequisites new file mode 100644 index 0000000..c7211fd --- /dev/null +++ b/recipes/x86/files/installPrerequisites @@ -0,0 +1,16 @@ +#!/bin/bash -eux + +sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-* +sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-* +yum upgrade -y + +yum install -y bzip2 # Required to compile gcc +yum install -y zlib-devel # Required to compile Python +yum install -y bzip2-devel # Required to compile Python with bz2 module (required by Node.js) +yum install -y gcc-c++ # Required to compile Node.js v7- +yum install -y make # Allows compilation +yum install -y ccache # Allows caching +yum install -y devtoolset-9.i686 # Includes gcc 9.3.1 + +# Fix bugs +sed -i -e 's/:\${MANPATH}/\${MANPATH:+:\${MANPATH}}/g' /opt/rh/devtoolset-9/enable diff --git a/recipes/x86/files/opt__gcc15__enable b/recipes/x86/files/opt__gcc15__enable new file mode 100644 index 0000000..ef0676c --- /dev/null +++ b/recipes/x86/files/opt__gcc15__enable @@ -0,0 +1,15 @@ +#!/bin/bash -eux + +DIR=/opt/gcc15 + +source /opt/rh/devtoolset-9/enable + +export PATH="$DIR/bin${PATH:+:${PATH}}" +export MANPATH="$DIR/share/man${MANPATH:+:${MANPATH}}" +export INFOPATH="$DIR/share/info${INFOPATH:+:${INFOPATH}}" +export LD_LIBRARY_PATH="$DIR/lib64:$DIR/lib${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}" +export PKG_CONFIG_PATH="$DIR/lib64/pkgconfig${PKG_CONFIG_PATH:+:${PKG_CONFIG_PATH}}" + +if [ -f "$DIR/bin/gcc" ]; then + export LDFLAGS='-static-libstdc++' +fi diff --git a/recipes/x86/run.sh b/recipes/x86/run.sh index b2ad774..b0f5c2f 100755 --- a/recipes/x86/run.sh +++ b/recipes/x86/run.sh @@ -1,7 +1,8 @@ -#!/usr/bin/env bash +#!/bin/bash -eux -set -e -set -x + + +# Init release_urlbase="$1" disttype="$2" @@ -11,35 +12,59 @@ commit="$5" fullversion="$6" source_url="$7" source_urlbase="$8" -config_flags=--openssl-no-asm -cd /home/node +homeDir=/home/node +nodeDir="$homeDir/node-$fullversion" -tar -xf node.tar.xz +tar --directory="$homeDir" -xf "$homeDir/node.tar.xz" -# configuring cares correctly to not use sys/random.h on this target -cd "node-${fullversion}"/deps/cares/config/linux -sed -i 's/define HAVE_SYS_RANDOM_H 1/undef HAVE_SYS_RANDOM_H/g' ./ares_config.h -sed -i 's/define HAVE_GETRANDOM 1/undef HAVE_GETRANDOM/g' ./ares_config.h -cd /home/node -cd "node-${fullversion}" +# Patch the code -export CC="ccache gcc" -export CXX="ccache g++" -export CXXFLAGS=-m32 -export CFLAGS=-m32 -export MAJOR_VERSION=$(echo ${fullversion} | cut -d . -f 1 | tr --delete v) +# Configuring cares correctly to not use sys/random.h on this target +cd "$nodeDir/deps/cares/config/linux" +sed -i 's/define HAVE_SYS_RANDOM_H 1/undef HAVE_SYS_RANDOM_H/g' ares_config.h +sed -i 's/define HAVE_GETRANDOM 1/undef HAVE_GETRANDOM/g' ares_config.h -if [ $MAJOR_VERSION -ge 16 ]; then - . /opt/rh/devtoolset-9/enable +# Fix https://github.com/c-ares/c-ares/issues/850 +cd "$nodeDir/deps/cares" +if [[ "$(grep -o 'ARES_VERSION_STR "[^"]*"' include/ares_version.h | awk '{print $2}' | tr -d '"')" == "1.33.0" ]]; then + sed -i 's/MSG_FASTOPEN/TCP_FASTOPEN_CONNECT/g' src/lib/ares__socket.c fi +# Linux implementation of experimental WASM memory control requires Linux 3.17 & glibc 2.27 so disable it +cd "$nodeDir/deps/v8/src" +[ -f d8/d8.cc ] && sed -i -e 's/#if V8_TARGET_OS_LINUX/#if false/g' wasm/wasm-objects.cc d8/d8.cc + + + +# Prepare to compile Node.js + +export MAJOR_VERSION=$(echo ${fullversion} | cut -d . -f 1 | tr --delete v) + +isNodeVersionGE() { + printf "$1\n$fullversion" | sort -VC +} + +source "$homeDir/run_other.sh" +source "$homeDir/run_versions.sh" + +setPython +setGCC + + + +# Compile Node.js + +cd "$nodeDir" +export CC='ccache gcc' +export CXX='ccache g++' + make -j$(getconf _NPROCESSORS_ONLN) binary V= \ - DESTCPU="x86" \ - ARCH="x86" \ - VARIATION="" \ + DESTCPU="$destCPU" \ + ARCH="$arch" \ + VARIATION="$variation" \ DISTTYPE="$disttype" \ CUSTOMTAG="$customtag" \ DATESTRING="$datestring" \ @@ -47,4 +72,5 @@ make -j$(getconf _NPROCESSORS_ONLN) binary V= \ RELEASE_URLBASE="$release_urlbase" \ CONFIG_FLAGS="$config_flags" +"$nodeDir/node" -p process.versions # Make sure there is no "Segmentation fault" error (example: node v21.0~v21.2 x64-pointer-compression) mv node-*.tar.?z /out/ diff --git a/recipes/x86/run_other.sh b/recipes/x86/run_other.sh new file mode 100644 index 0000000..25908ef --- /dev/null +++ b/recipes/x86/run_other.sh @@ -0,0 +1,34 @@ +#!/bin/bash -eux + +config_flags= +destCPU=x86 +arch=x86 +variation= + +# GCC forbids SSE by default for x86 but it is required by Node.js so enable it manually +export CFLAGS='-msse2' +export CXXFLAGS='-msse2' +# export CFLAGS='-msse4.2' # This can be used too for modern CPUs (~2008) +# export CFLAGS='-mavx' # This can be used too for modern CPUs (~2011) +# export CFLAGS='-mavx2' # This can be used too for modern CPUs (~2013) +# export CFLAGS='-mavx2 -maes' # This can be used too for modern CPUs (~2015) +# export CFLAGS='-march=znver1' # This can be used too for modern AMD CPUs (~2017) +# export CFLAGS='-march=sandybridge' # This can be used too for modern Intel CPUs (~2011) + +# x86 does not support _mm_cvtsi128_si64 instruction so forbid it's usage and fallback to non-SSE solution +cd "$nodeDir/deps/v8/src" +find . -name '*.cc' -type f -print0 | xargs -0 sed -i -e 's/#ifdef __SSE2__/#if false/g' + +# Replace %ifdef with #ifdef in assembler code +cd "$nodeDir/deps/openssl/config/archs/linux-elf/asm" && +find . -name '*.S' -type f -print0 | xargs -0 --no-run-if-empty sed -i -e 's/%ifdef/#ifdef/g' -e 's/%endif/#endif/g' + +# Fix https://github.com/nodejs/node/issues/58458 +str1='return __ Tuple\(result, __ Word32Constant\(0\)\);' +str2='V result_ = result; return __ Tuple\(result_, __ Word32Constant\(0\)\);' +cd "$nodeDir/deps/v8/src/compiler/turboshaft" && +[ -f int64-lowering-reducer.h ] && sed -i -E "s/$str1/$str2/g" int64-lowering-reducer.h +# https://github.com/nodejs/node/issues/58458#issuecomment-2916873746 +# https://github.com/nodejs/node/commit/02f8cdb0c7a73d970ed7134a481a211bbd599c02 + +true # To allow "&&" above diff --git a/recipes/x86/run_versions.sh b/recipes/x86/run_versions.sh new file mode 100644 index 0000000..997d604 --- /dev/null +++ b/recipes/x86/run_versions.sh @@ -0,0 +1,15 @@ +#!/bin/bash -eux + +setPython() { + if isNodeVersionGE 'v22.3'; then export PYTHON='python3.13'; return; fi # Python 3.13: Node.js v22.3 ~ latest (v24.3) + if isNodeVersionGE 'v14.14'; then export PYTHON='python3.9'; return; fi # Python 3.9: Node.js v14.14 ~ latest (v24.3) + if isNodeVersionGE 'v4.0'; then export PYTHON='python2.7'; return; fi # Python 2.7: Node.js v4.0 ~ v15.14 (latest) + + # Node.js v16.0 is first version not supporting Python 2.7 but supports Python 3.6 ~ 3.9 so Python 3.9 is chosen +} + +setGCC() { + if isNodeVersionGE 'v22.3'; then source /opt/gcc15/enable; return; fi # GCC 15.1: Node.js v22.3 ~ latest (v24.3) + if isNodeVersionGE 'v7.10'; then source /opt/rh/devtoolset-9/enable; return; fi # GCC 9.3: Node.js v7.10 ~ v21.7 (latest) + # GCC 4.8.5: Node.js v4.0 ~ v10.14 +} diff --git a/recipes/x86/should-build.sh b/recipes/x86/should-build.sh index 10ff5ba..ed3bad4 100755 --- a/recipes/x86/should-build.sh +++ b/recipes/x86/should-build.sh @@ -3,8 +3,14 @@ __dirname=$1 fullversion=$2 -. ${__dirname}/_decode_version.sh +isNodeVersionGE() { + printf "$1\n$fullversion" | sort -VC +} -decode "$fullversion" +isNodeVersionLT() { + ! printf "$1\n$fullversion" | sort -VC +} -test "$major" -lt "22" +isNodeVersionGE 'v6.2' # Node.js v6.1- cannot download required files due to broken links + +isNodeVersionLT 'v22.0' || isNodeVersionGE 'v22.3' # Node.js v22.0~v22.2 requires GCC version between 9.3 and 15.1 which is not installed