diff --git a/nodejs-sources.sh b/nodejs-sources.sh index d7d766a..74e0398 100755 --- a/nodejs-sources.sh +++ b/nodejs-sources.sh @@ -3,23 +3,23 @@ # arguments, make sure to call # `argbash nodejs-tarball.sh -o nodejs-tarball.sh` -# ARG_POSITIONAL_SINGLE([version],[Node.js release version],[""]) +# ARG_POSITIONAL_SINGLE([version],[Node.js release version]) +# ARG_OPTIONAL_BOOLEAN([push],[],[Whether to upload to the lookaside cache],[on]) # ARG_DEFAULTS_POS([]) # ARG_HELP([Tool to aid in Node.js packaging of new releases]) # ARGBASH_GO() # needed because of Argbash --> m4_ignore([ -### START OF CODE GENERATED BY Argbash v2.8.1 one line above ### +### START OF CODE GENERATED BY Argbash v2.10.0 one line above ### # Argbash is a bash code generator used to get arguments parsing right. # Argbash is FREE SOFTWARE, see https://argbash.io for more info die() { - local _ret=$2 - test -n "$_ret" || _ret=1 - test "$_PRINT_HELP" = yes && print_help >&2 + local _ret="${2:-1}" + test "${_PRINT_HELP:-no}" = yes && print_help >&2 echo "$1" >&2 - exit ${_ret} + exit "${_ret}" } @@ -32,15 +32,17 @@ begins_with_short_option() # THE DEFAULTS INITIALIZATION - POSITIONALS _positionals=() -_arg_version="" +_arg_version= # THE DEFAULTS INITIALIZATION - OPTIONALS +_arg_push="on" print_help() { printf '%s\n' "Tool to aid in Node.js packaging of new releases" - printf 'Usage: %s [-h|--help] []\n' "$0" - printf '\t%s\n' ": Node.js release version (default: '""')" + printf 'Usage: %s [--(no-)push] [-h|--help] \n' "$0" + printf '\t%s\n' ": Node.js release version" + printf '\t%s\n' "--push, --no-push: Whether to upload to the lookaside cache (on by default)" printf '\t%s\n' "-h, --help: Prints help" } @@ -52,6 +54,10 @@ parse_commandline() do _key="$1" case "$_key" in + --no-push|--push) + _arg_push="on" + test "${1:0:5}" = "--no-" && _arg_push="off" + ;; -h|--help) print_help exit 0 @@ -73,7 +79,9 @@ parse_commandline() handle_passed_args_count() { - test "${_positionals_count}" -le 1 || _PRINT_HELP=yes die "FATAL ERROR: There were spurious positional arguments --- we expect between 0 and 1, but got ${_positionals_count} (the last one was: '${_last_positional}')." 1 + local _required_args_string="'version'" + test "${_positionals_count}" -ge 1 || _PRINT_HELP=yes die "FATAL ERROR: Not enough positional arguments - we require exactly 1 (namely: $_required_args_string), but got only ${_positionals_count}." 1 + test "${_positionals_count}" -le 1 || _PRINT_HELP=yes die "FATAL ERROR: There were spurious positional arguments --- we expect exactly 1 (namely: $_required_args_string), but got ${_positionals_count} (the last one was: '${_last_positional}')." 1 } @@ -100,6 +108,10 @@ assign_positional_args 1 "${_positionals[@]}" ### END OF CODE GENERATED BY Argbash (sortof) ### ]) # [ <-- needed because of Argbash +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +alias wget='wget --quiet' + packages=("jq" "wget" "tar" "fedpkg" "grep" "sed") rpm -q ${packages[@]} >/dev/null @@ -109,15 +121,11 @@ fi set -e -echo $_arg_version - -if [ x$_arg_version != x ]; then - version=$_arg_version -else - version=$(rpm -q --specfile --qf='%{version}\n' nodejs*.spec | head -n1) -fi +version=$_arg_version NODE_MAJOR=$(echo $version | cut -d. -f1) +NODE_MINOR=$(echo $version | cut -d. -f2) +NODE_PATCH=$(echo $version | cut -d. -f3) rm -rf node-v${version}.tar.gz \ node-v${version}-stripped.tar.gz \ @@ -126,8 +134,10 @@ rm -rf node-v${version}.tar.gz \ cjs-module-lexer* \ undici* \ SHASUMS256.txt +echo Downloading node-v${version}.tar.gz wget http://nodejs.org/dist/v${version}/node-v${version}.tar.gz \ http://nodejs.org/dist/v${version}/SHASUMS256.txt +echo Validating sha256sum sha256sum -c SHASUMS256.txt --ignore-missing rm -f SHASUMS256.txt tar -zxf node-v${version}.tar.gz @@ -137,7 +147,6 @@ tar -zxf node-v${version}.tar.gz rm -rf node-v${version}/deps/openssl tar -zcf node-v${version}-stripped.tar.gz node-v${version} -set -x # Download the cjs-module-lexer sources LEXER_VERSION=$(jq -r '.version' node-v${version}/deps/cjs-module-lexer/package.json) wget https://github.com/nodejs/cjs-module-lexer/archive/refs/tags/${LEXER_VERSION}.tar.gz @@ -167,14 +176,19 @@ wget https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-${UNDICI ICU_MAJOR=$(jq -r '.[0].url' node-v${version}/tools/icu/current_ver.dep | sed --expression='s/.*release-\([[:digit:]]\+\)-\([[:digit:]]\+\).*/\1/g') ICU_MINOR=$(jq -r '.[0].url' node-v${version}/tools/icu/current_ver.dep | sed --expression='s/.*release-\([[:digit:]]\+\)-\([[:digit:]]\+\).*/\2/g') -set +x - # Download the ICU binary data files rm -Rf icu4c-${ICU_MAJOR}_${ICU_MINOR}-data-bin-*.zip wget $(grep Source3 nodejs${NODE_MAJOR}.spec | sed --expression="s/.*http/http/g" --expression="s/\(\%{icu_major}\)/${ICU_MAJOR}/g" --expression="s/\(\%{icu_minor}\)/${ICU_MINOR}/g") wget $(grep Source4 nodejs${NODE_MAJOR}.spec | sed --expression="s/.*http/http/g" --expression="s/\(\%{icu_major}\)/${ICU_MAJOR}/g" --expression="s/\(\%{icu_minor}\)/${ICU_MINOR}/g") -fedpkg new-sources node-v${version}-stripped.tar.gz \ +if [ _arg_push = 'on' ]; then + push_flag='' +else + push_flag='--offline' +fi + +fedpkg new-sources ${push_flag} \ + node-v${version}-stripped.tar.gz \ icu4c-${ICU_MAJOR}_${ICU_MINOR}-data-bin-*.zip \ cjs-module-lexer-${LEXER_VERSION}-stripped.tar.gz \ wasi-sdk-${LEXER_WASI_MAJOR}.${LEXER_WASI_MINOR}-linux.tar.gz \ @@ -186,41 +200,49 @@ rm -f node-v${version}.tar.gz set +e # Determine the bundled versions of the various packages -echo "Bundled software versions" +echo "Included software versions" echo "-------------------------" echo +echo "Node.js version" +echo "=========================" +echo "${version}" +echo echo "libnode shared object version" echo "=========================" -grep "define NODE_MODULE_VERSION" node-v${version}/src/node_version.h +NODE_SOVERSION=$(grep -oP '(?<=#define NODE_MODULE_VERSION )\d+' node-v${version}/src/node_version.h) +echo "${NODE_SOVERSION}" echo echo "V8" echo "=========================" -grep "define V8_MAJOR_VERSION" node-v${version}/deps/v8/include/v8-version.h -grep "define V8_MINOR_VERSION" node-v${version}/deps/v8/include/v8-version.h -grep "define V8_BUILD_NUMBER" node-v${version}/deps/v8/include/v8-version.h -grep "define V8_PATCH_LEVEL" node-v${version}/deps/v8/include/v8-version.h +V8_MAJOR=$(grep -oP '(?<=#define V8_MAJOR_VERSION )\d+' node-v${version}/deps/v8/include/v8-version.h) +V8_MINOR=$(grep -oP '(?<=#define V8_MINOR_VERSION )\d+' node-v${version}/deps/v8/include/v8-version.h) +V8_BUILD=$(grep -oP '(?<=#define V8_BUILD_NUMBER )\d+' node-v${version}/deps/v8/include/v8-version.h) +V8_PATCH=$(grep -oP '(?<=#define V8_PATCH_LEVEL )\d+' node-v${version}/deps/v8/include/v8-version.h) +echo "${V8_MAJOR}.${V8_MINOR}.${V8_BUILD}.${V8_PATCH}" echo echo "c-ares" echo "=========================" -grep "define ARES_VERSION_MAJOR" node-v${version}/deps/cares/include/ares_version.h -grep "define ARES_VERSION_MINOR" node-v${version}/deps/cares/include/ares_version.h -grep "define ARES_VERSION_PATCH" node-v${version}/deps/cares/include/ares_version.h +C_ARES_VERSION=$(grep -oP '(?<=#define ARES_VERSION_STR ).*\"' node-v${version}/deps/cares/include/ares_version.h |sed -e 's/^"//' -e 's/"$//') +echo $C_ARES_VERSION echo echo "llhttp" echo "=========================" -grep "define LLHTTP_VERSION_MAJOR" node-v${version}/deps/llhttp/include/llhttp.h -grep "define LLHTTP_VERSION_MINOR" node-v${version}/deps/llhttp/include/llhttp.h -grep "define LLHTTP_VERSION_PATCH" node-v${version}/deps/llhttp/include/llhttp.h +LLHTTP_MAJOR=$(grep -oP '(?<=#define LLHTTP_VERSION_MAJOR )\d+' node-v${version}/deps/llhttp/include/llhttp.h) +LLHTTP_MINOR=$(grep -oP '(?<=#define LLHTTP_VERSION_MINOR )\d+' node-v${version}/deps/llhttp/include/llhttp.h) +LLHTTP_PATCH=$(grep -oP '(?<=#define LLHTTP_VERSION_PATCH )\d+' node-v${version}/deps/llhttp/include/llhttp.h) +echo "${LLHTTP_MAJOR}.${LLHTTP_MINOR}.${LLHTTP_PATCH}" echo echo "libuv" echo "=========================" -grep "define UV_VERSION_MAJOR" node-v${version}/deps/uv/include/uv/version.h -grep "define UV_VERSION_MINOR" node-v${version}/deps/uv/include/uv/version.h -grep "define UV_VERSION_PATCH" node-v${version}/deps/uv/include/uv/version.h +UV_MAJOR=$(grep -oP '(?<=#define UV_VERSION_MAJOR )\d+' node-v${version}/deps/uv/include/uv/version.h) +UV_MINOR=$(grep -oP '(?<=#define UV_VERSION_MINOR )\d+' node-v${version}/deps/uv/include/uv/version.h) +UV_PATCH=$(grep -oP '(?<=#define UV_VERSION_PATCH )\d+' node-v${version}/deps/uv/include/uv/version.h) +echo ${UV_MAJOR}.${UV_MINOR}.${UV_PATCH} echo echo "nghttp2" echo "=========================" -grep "define NGHTTP2_VERSION " node-v${version}/deps/nghttp2/lib/includes/nghttp2/nghttp2ver.h +NGHTTP2_VERSION=$(grep -oP '(?<=#define NGHTTP2_VERSION ).*\"' node-v${version}/deps/nghttp2/lib/includes/nghttp2/nghttp2ver.h |sed -e 's/^"//' -e 's/"$//') +echo $NGHTTP2_VERSION echo echo "ICU" echo "=========================" @@ -228,21 +250,26 @@ echo "${ICU_MAJOR}.${ICU_MINOR}" echo echo "punycode" echo "=========================" -grep "'version'" node-v${version}/lib/punycode.js +PUNYCODE_VERSION=$(/usr/bin/node -e "console.log(require('punycode').version)") +echo $PUNYCODE_VERSION echo echo "uvwasi" echo "=========================" -grep "define UVWASI_VERSION_MAJOR" node-v${version}/deps/uvwasi/include/uvwasi.h -grep "define UVWASI_VERSION_MINOR" node-v${version}/deps/uvwasi/include/uvwasi.h -grep "define UVWASI_VERSION_PATCH" node-v${version}/deps/uvwasi/include/uvwasi.h +UVWASI_MAJOR=$(grep -oP '(?<=#define UVWASI_VERSION_MAJOR )\d+' node-v${version}/deps/uvwasi/include/uvwasi.h) +UVWASI_MINOR=$(grep -oP '(?<=#define UVWASI_VERSION_MINOR )\d+' node-v${version}/deps/uvwasi/include/uvwasi.h) +UVWASI_PATCH=$(grep -oP '(?<=#define UVWASI_VERSION_PATCH )\d+' node-v${version}/deps/uvwasi/include/uvwasi.h) +UVWASI_VERSION="${UVWASI_MAJOR}.${UVWASI_MINOR}.${UVWASI_PATCH}" +echo $UVWASI_VERSION echo echo "npm" echo "=========================" -grep "\"version\":" node-v${version}/deps/npm/package.json +NPM_VERSION=$(jq -r .version ./node-v${version}/deps/npm/package.json) +echo $NPM_VERSION echo echo "zlib" echo "=========================" -grep "define ZLIB_VERSION" node-v${version}/deps/zlib/zlib.h +ZLIB_VERSION=$(grep -oP '(?<=#define ZLIB_VERSION ).*\"' node-v${version}/deps/zlib/zlib.h |sed -e 's/^"//' -e 's/"$//') +echo $ZLIB_VERSION echo echo "cjs-module-lexer" echo "=========================" @@ -254,7 +281,34 @@ echo "=========================" echo "${UNDICI_VERSION}" echo "WASI-SDK: ${UNDICI_WASI_MAJOR}.${UNDICI_WASI_MINOR}" echo -echo "Make sure these versions match what is in the RPM spec file" +echo "Applying versions to spec template" + +sed -e "s/@NODE_MAJOR@/${NODE_MAJOR}/g" \ + -e "s/@NODE_MINOR@/${NODE_MINOR}/g" \ + -e "s/@NODE_PATCH@/${NODE_PATCH}/g" \ + -e "s/@NODE_SOVERSION@/${NODE_SOVERSION}/g" \ + -e "s/@V8_MAJOR@/${V8_MAJOR}/g" \ + -e "s/@V8_MINOR@/${V8_MINOR}/g" \ + -e "s/@V8_BUILD@/${V8_BUILD}/g" \ + -e "s/@V8_PATCH@/${V8_PATCH}/g" \ + -e "s/@C_ARES_VERSION@/${C_ARES_VERSION}/g" \ + -e "s/@LLHTTP_VERSION@/${LLHTTP_MAJOR}.${LLHTTP_MINOR}.${LLHTTP_PATCH}/g" \ + -e "s/@LIBUV_VERSION@/${UV_MAJOR}.${UV_MINOR}.${UV_PATCH}/g" \ + -e "s/@NGHTTP2_VERSION@/${NGHTTP2_VERSION}/g" \ + -e "s/@ICU_MAJOR@/${ICU_MAJOR}/g" \ + -e "s/@ICU_MINOR@/${ICU_MINOR}/g" \ + -e "s/@PUNYCODE_VERSION@/${PUNYCODE_VERSION}/g" \ + -e "s/@UVWASI_VERSION@/${UVWASI_VERSION}/g" \ + -e "s/@NPM_VERSION@/${NPM_VERSION}/g" \ + -e "s/@ZLIB_VERSION@/${ZLIB_VERSION}/g" \ + -e "s/@LEXER_VERSION@/${LEXER_VERSION}/g" \ + -e "s/@LEXER_WASI_MAJOR@/${LEXER_WASI_MAJOR}/g" \ + -e "s/@LEXER_WASI_MINOR@/${LEXER_WASI_MINOR}/g" \ + -e "s/@UNDICI_VERSION@/${UNDICI_VERSION}/g" \ + -e "s/@UNDICI_WASI_MAJOR@/${UNDICI_WASI_MAJOR}/g" \ + -e "s/@UNDICI_WASI_MINOR@/${UNDICI_WASI_MINOR}/g" \ + ${SCRIPT_DIR}/.packaging/nodejs.spec.in \ + > ${SCRIPT_DIR}/nodejs${NODE_MAJOR}.spec rm -rf node-v${version} # ] <-- needed because of Argbash diff --git a/nodejs18.spec b/nodejs18.spec index 599de03..8b4c1d9 100644 --- a/nodejs18.spec +++ b/nodejs18.spec @@ -155,25 +155,10 @@ Source100: nodejs-sources.sh # These are full sources for dependencies included as WASM blobs in the source of Node itself. # Note: These sources would also include pre-compiled WASM blobs… so they are adjusted not to. # Recipes for creating these blobs are included in the sources. - -# Version: jq '.version' deps/cjs-module-lexer/package.json -# Original: https://github.com/nodejs/cjs-module-lexer/archive/refs/tags/1.2.2.tar.gz -# Adjustments: rm -f cjs-module-lexer-1.2.2/lib/lexer.wasm -# This is generated by nodejs-sources.sh +# These are generated by nodejs-sources.sh Source101: cjs-module-lexer-1.2.2-stripped.tar.gz -# The WASM blob was made using wasi-sdk v11; compiler libraries are linked in. -# Version source: Makefile -# This is generated by nodejs-sources.sh Source102: wasi-sdk-11.0-linux.tar.gz - -# Version: jq '.version' deps/undici/src/package.json -# Original: https://github.com/nodejs/undici/archive/refs/tags/v5.11.0.tar.gz -# Adjustments: rm -f undici-5.11.0/lib/llhttp/llhttp*.wasm* -# This is generated by nodejs-sources.sh Source111: undici-5.13.0-stripped.tar.gz -# The WASM blob was made using wasi-sdk v14; compiler libraries are linked in. -# Version source: build/Dockerfile -# This is generated by nodejs-sources.sh Source112: wasi-sdk-14.0-linux.tar.gz # Disable running gyp on bundled deps we don't use diff --git a/packaging/nodejs.spec.in b/packaging/nodejs.spec.in new file mode 100644 index 0000000..4f79d86 --- /dev/null +++ b/packaging/nodejs.spec.in @@ -0,0 +1,832 @@ +# The following macros control the usage of dependencies bundled from upstream. +# +# When to use what: +# - Regular (presumably non-modular) build: use neither (the default in Fedora) +# - Early bootstrapping build that is not intended to be shipped: +# use --with=bootstrap; this will bundle deps and add `~bootstrap` release suffix +# - Build with some dependencies not avalaible in necessary versions (i.e. module build): +# use --with=bundled; will bundle deps, but do not add the suffix +# +# create bootstrapping build with bundled deps and extra release suffix +%bcond_with bootstrap +# bundle dependencies that are not available in Fedora modules +%if %{with bootstrap} +%bcond_without bundled +%else +%bcond_with bundled +%endif + +%if 0%{?rhel} && 0%{?rhel} < 8 +%bcond_without bundled_zlib +%else +%bcond_with bundled_zlib +%endif + +# LTO is currently broken on Node.js builds +%define _lto_cflags %{nil} + +# Heavy-handed approach to avoiding issues with python +# bytecompiling files in the node_modules/ directory +%global __python %{python3} + +# == Master Relase == +# This is used by both the nodejs package and the npm subpackage that +# has a separate version - the name is special so that rpmdev-bumpspec +# will bump this rather than adding .1 to the end. +%global baserelease %autorelease + +%{?!_pkgdocdir:%global _pkgdocdir %{_docdir}/%{name}-%{version}} + +# == Node.js Version == +# Note: Fedora should only ship LTS versions of Node.js (currently expected +# to be major versions with even numbers). The odd-numbered versions are new +# feature releases that are only supported for nine months, which is shorter +# than a Fedora release lifecycle. +%global nodejs_epoch 1 +%global nodejs_major @NODE_MAJOR@ +%global nodejs_minor @NODE_MINOR@ +%global nodejs_patch @NODE_PATCH@ +%global nodejs_abi %{nodejs_major}.%{nodejs_minor} +# nodejs_soversion - from NODE_MODULE_VERSION in src/node_version.h +%global nodejs_soversion @NODE_SOVERSION@ +%global nodejs_version %{nodejs_major}.%{nodejs_minor}.%{nodejs_patch} +%global nodejs_release %{baserelease} +%global nodejs_envr %{nodejs_epoch}:%{nodejs_version}-%{nodejs_release} + +%global nodejs_datadir %{_datarootdir}/node-%{nodejs_major} + +# Determine if this should be the default version for this Fedora release +# The default version will own /usr/bin/node and friends +%if 0%{?fedora} == 37 || 0%{?fedora} == 38 +%global nodejs_default %{nodejs_major} +%endif +%global nodejs_private_sitelib %{nodejs_sitelib}_%{nodejs_major} + + +# == Bundled Dependency Versions == +# v8 - from deps/v8/include/v8-version.h +# Epoch is set to ensure clean upgrades from the old v8 package +%global v8_epoch 3 +%global v8_major @V8_MAJOR@ +%global v8_minor @V8_MINOR@ +%global v8_build @V8_BUILD@ +%global v8_patch @V8_PATCH@ +%global v8_version %{v8_major}.%{v8_minor}.%{v8_build}.%{v8_patch} +%global v8_release %{nodejs_epoch}.%{nodejs_major}.%{nodejs_minor}.%{nodejs_patch}.%{nodejs_release} + +# zlib - from deps/zlib/zlib.h +%global zlib_version @ZLIB_VERSION@ + +# c-ares - from deps/cares/include/ares_version.h +# https://github.com/nodejs/node/pull/9332 +%global c_ares_version @C_ARES_VERSION@ + +# llhttp - from deps/llhttp/include/llhttp.h +%global llhttp_version @LLHTTP_VERSION@ + +# libuv - from deps/uv/include/uv/version.h +%global libuv_version @LIBUV_VERSION@ + +# nghttp2 - from deps/nghttp2/lib/includes/nghttp2/nghttp2ver.h +%global nghttp2_version @NGHTTP2_VERSION@ + +# ICU - from tools/icu/current_ver.dep +%global icu_major @ICU_MAJOR@ +%global icu_minor @ICU_MINOR@ +%global icu_version %{icu_major}.%{icu_minor} + +%global icudatadir %{nodejs_datadir}/icudata +%{!?little_endian: %global little_endian %(%{python3} -c "import sys;print (0 if sys.byteorder=='big' else 1)")} +# " this line just fixes syntax highlighting for vim that is confused by the above and continues literal + + +# OpenSSL minimum version +%global openssl11_minimum 1:1.1.1 +%global openssl30_minimum 1:3.0.2 + +# punycode - from lib/punycode.js +# Note: this was merged into the mainline since 0.6.x +# Note: this will be unmerged in an upcoming major release +%global punycode_version @PUNYCODE_VERSION@ + +# npm - from deps/npm/package.json +%global npm_epoch 1 +%global npm_version @NPM_VERSION@ + +# In order to avoid needing to keep incrementing the release version for the +# main package forever, we will just construct one for npm that is guaranteed +# to increment safely. Changing this can only be done during an update when the +# base npm version number is increasing. +%global npm_release %{nodejs_epoch}.%{nodejs_major}.%{nodejs_minor}.%{nodejs_patch}.%{nodejs_release} + +%global npm_envr %{npm_epoch}:%{npm_version}-%{npm_release} + +%global npm_obsoletes 1:8.19.2-1.18.12.1.3 + +# uvwasi - from deps/uvwasi/include/uvwasi.h +%global uvwasi_version @UVWASI_VERSION@ + +# histogram_c - assumed from timestamps +%global histogram_version 0.9.7 + + +Name: nodejs%{nodejs_major} +Epoch: %{nodejs_epoch} +Version: %{nodejs_version} +Release: %{nodejs_release} +Summary: JavaScript runtime +License: MIT and ASL 2.0 and ISC and BSD +Group: Development/Languages +URL: http://nodejs.org/ + +ExclusiveArch: %{nodejs_arches} + +# nodejs bundles openssl, but we use the system version in Fedora +# because openssl contains prohibited code, we remove openssl completely from +# the tarball, using the script in Source100 +Source0: node-v%{nodejs_version}-stripped.tar.gz +Source1: npmrc +Source2: btest402.js +# The binary data that icu-small can use to get icu-full capability +Source3: https://github.com/unicode-org/icu/releases/download/release-%{icu_major}-%{icu_minor}/icu4c-%{icu_major}_%{icu_minor}-data-bin-b.zip +Source4: https://github.com/unicode-org/icu/releases/download/release-%{icu_major}-%{icu_minor}/icu4c-%{icu_major}_%{icu_minor}-data-bin-l.zip +Source100: nodejs-sources.sh + +# These are full sources for dependencies included as WASM blobs in the source of Node itself. +# Note: These sources would also include pre-compiled WASM blobs… so they are adjusted not to. +# Recipes for creating these blobs are included in the sources. +# These are generated by nodejs-sources.sh +Source101: cjs-module-lexer-@LEXER_VERSION@-stripped.tar.gz +Source102: wasi-sdk-@LEXER_WASI_MAJOR@.@LEXER_WASI_MINOR@-linux.tar.gz +Source111: undici-@UNDICI_VERSION@-stripped.tar.gz +Source112: wasi-sdk-@UNDICI_WASI_MAJOR@.@UNDICI_WASI_MINOR@-linux.tar.gz + +# Disable running gyp on bundled deps we don't use +Patch1: 0001-Disable-running-gyp-on-shared-deps.patch + +%if 0%{?nodejs_default} +%global pkgname nodejs +%package -n %{pkgname} +Summary: JavaScript runtime +%else +%global pkgname nodejs%{nodejs_major} +%endif + +BuildRequires: make +BuildRequires: python%{python3_pkgversion}-devel +BuildRequires: python%{python3_pkgversion}-setuptools +BuildRequires: python%{python3_pkgversion}-jinja2 +%if 0%{?rhel} && 0%{?rhel} < 9 +BuildRequires: python-unversioned-command +%endif +%if %{with bundled_zlib} +Provides: bundled(zlib) = %{zlib_version} +%else +BuildRequires: zlib-devel +%endif +BuildRequires: brotli-devel +%if 0%{?rhel} && 0%{?rhel} < 8 +BuildRequires: devtoolset-11-gcc +BuildRequires: devtoolset-11-gcc-c++ +%else +BuildRequires: gcc >= 8.3.0 +BuildRequires: gcc-c++ >= 8.3.0 +%endif + +BuildRequires: jq + +# needed to generate bundled provides for npm dependencies +# https://src.fedoraproject.org/rpms/nodejs/pull-request/2 +# https://pagure.io/nodejs-packaging/pull-request/10 +BuildRequires: nodejs-packaging + +BuildRequires: chrpath +BuildRequires: libatomic +BuildRequires: ninja-build +BuildRequires: systemtap-sdt-devel +BuildRequires: unzip + +Provides: nodejs = %{nodejs_envr} + +%if %{with bundled} +Provides: bundled(libuv) = %{libuv_version} +%else +BuildRequires: libuv-devel >= 1:%{libuv_version} +Requires: libuv >= 1:%{libuv_version} +%endif + +# Node.js frequently bumps this faster than Fedora can follow, +# so we will bundle it. +Provides: bundled(nghttp2) = %{nghttp2_version} + +# Temporarily bundle llhttp because the upstream doesn't +# provide releases for it. +Provides: bundled(llhttp) = %{llhttp_version} + + +%if 0%{?rhel} && 0%{?rhel} < 8 +BuildRequires: openssl11-devel >= %{openssl11_minimum} +Requires: openssl11 >= %{openssl11_minimum} +%global ssl_configure --shared-openssl --shared-openssl-includes=%{_includedir}/openssl11 --shared-openssl-libpath=%{_libdir}/openssl11 +%else + +%if 0%{?fedora} >= 36 +BuildRequires: openssl >= %{openssl30_minimum} +BuildRequires: openssl-devel >= %{openssl30_minimum} +%global openssl_fips_configure --openssl-is-fips +%else +Requires: openssl >= %{openssl11_minimum} +BuildRequires: openssl-devel >= %{openssl11_minimum} +%global openssl_fips_configure %{nil} +%endif + +%global ssl_configure --shared-openssl %{openssl_fips_configure} +%endif + +# we need the system certificate store +Requires: ca-certificates + +Requires: %{pkgname}-libs%{?_isa} = %{nodejs_envr} + +%if 0%{?fedora} || 0%{?rhel} >= 8 +# Pull in the docs and full-icu data by default +Recommends: %{pkgname}-docs = %{nodejs_envr} +Recommends: %{pkgname}-full-i18n%{?_isa} = %{nodejs_envr} +Recommends: %{pkgname}-npm >= %{npm_envr} +%endif + +# we need ABI virtual provides where SONAMEs aren't enough/not present so deps +# break when binary compatibility is broken +Provides: nodejs(abi) = %{nodejs_abi} +Provides: nodejs(abi%{nodejs_major}) = %{nodejs_abi} + +# this corresponds to the "engine" requirement in package.json +Provides: nodejs(engine) = %{nodejs_version} + +# Node.js currently has a conflict with the 'node' package in Fedora +# The ham-radio group has agreed to rename their binary for us, but +# in the meantime, we're setting an explicit Conflicts: here +Conflicts: node <= 0.3.2-12 + +# The punycode module was absorbed into the standard library in v0.6. +# It still exists as a seperate package for the benefit of users of older +# versions. Since we've never shipped anything older than v0.10 in Fedora, +# we don't need the seperate nodejs-punycode package, so we Provide it here so +# dependent packages don't need to override the dependency generator. +# See also: RHBZ#11511811 +# UPDATE: punycode will be deprecated and so we should unbundle it in Node v8 +# and use upstream module instead +# https://github.com/nodejs/node/commit/29e49fc286080215031a81effbd59eac092fff2f +Provides: nodejs-punycode = %{punycode_version} +Provides: npm(punycode) = %{punycode_version} + +# Node.js has forked c-ares from upstream in an incompatible way, so we need +# to carry the bundled version internally. +# See https://github.com/nodejs/node/commit/766d063e0578c0f7758c3a965c971763f43fec85 +Provides: bundled(c-ares) = %{c_ares_version} + +# Node.js is closely tied to the version of v8 that is used with it. It makes +# sense to use the bundled version because upstream consistently breaks ABI +# even in point releases. Node.js upstream has now removed the ability to build +# against a shared system version entirely. +# See https://github.com/nodejs/node/commit/d726a177ed59c37cf5306983ed00ecd858cfbbef +Provides: bundled(v8) = %{v8_version} + +# Node.js is bound to a specific version of ICU which may not match the OS +# We cannot pin the OS to this version of ICU because every update includes +# an ABI-break, so we'll use the bundled copy. +Provides: bundled(icu) = %{icu_version} + +# Upstream added new dependencies, but so far they are not available in Fedora +# or there's no option to built it as a shared dependency, so we bundle them +Provides: bundled(uvwasi) = %{uvwasi_version} +Provides: bundled(histogram) = %{histogram_version} + + +%description +Node.js is a platform built on Chrome's JavaScript runtime \ +for easily building fast, scalable network applications. \ +Node.js uses an event-driven, non-blocking I/O model that \ +makes it lightweight and efficient, perfect for data-intensive \ +real-time applications that run across distributed devices.} + + +%if 0%{?nodejs_default} +%description -n %{pkgname} +Node.js is a platform built on Chrome's JavaScript runtime \ +for easily building fast, scalable network applications. \ +Node.js uses an event-driven, non-blocking I/O model that \ +makes it lightweight and efficient, perfect for data-intensive \ +real-time applications that run across distributed devices.} +%endif + + +%package -n %{pkgname}-devel +Summary: JavaScript runtime - development headers +Group: Development/Languages +Requires: %{pkgname}%{?_isa} = %{nodejs_envr} +Requires: %{pkgname}-libs%{?_isa} = %{nodejs_envr} +Requires: openssl-devel%{?_isa} +%if !%{with bundled_zlib} +Requires: zlib-devel%{?_isa} +%endif +Requires: brotli-devel%{?_isa} +Requires: nodejs-packaging + +%if %{without bundled} +Requires: libuv-devel%{?_isa} +%endif + +Provides: nodejs-devel = %{nodejs_envr} +Conflicts: nodejs-devel + + +%description -n %{pkgname}-devel +Development headers for the Node.js JavaScript runtime. + + +%package -n %{pkgname}-libs +Summary: Node.js and v8 libraries + +# Compatibility for obsolete v8 package +%if 0%{?__isa_bits} == 64 +Provides: libv8.so.%{v8_major}()(64bit) = %{v8_epoch}:%{v8_version} +Provides: libv8_libbase.so.%{v8_major}()(64bit) = %{v8_epoch}:%{v8_version} +Provides: libv8_libplatform.so.%{v8_major}()(64bit) = %{v8_epoch}:%{v8_version} +%else +# 32-bits +Provides: libv8.so.%{v8_major} = %{v8_epoch}:%{v8_version} +Provides: libv8_libbase.so.%{v8_major} = %{v8_epoch}:%{v8_version} +Provides: libv8_libplatform.so.%{v8_major} = %{v8_epoch}:%{v8_version} +%endif + +Provides: v8 = %{v8_epoch}:%{v8_version}-%{nodejs_release} +Provides: v8%{?_isa} = %{v8_epoch}:%{v8_version}-%{nodejs_release} +Obsoletes: v8 < 1:6.7.17-10 + +Provides: nodejs-libs = %{nodejs_envr} + +%description -n %{pkgname}-libs +Libraries to support Node.js and provide stable v8 interfaces. + + +%package -n %{pkgname}-full-i18n +Summary: Non-English locale data for Node.js +Requires: %{pkgname}%{?_isa} = %{nodejs_envr} + + +%description -n %{pkgname}-full-i18n +Optional data files to provide full-icu support for Node.js. Remove this +package to save space if non-English locales are not needed. + + +%package -n v8-%{v8_major}.%{v8_minor}-devel +Summary: v8 - development headers +Epoch: %{v8_epoch} +Version: %{v8_version} +Release: %{v8_release} +Requires: %{pkgname}-devel%{?_isa} = %{nodejs_envr} +Requires: %{pkgname}-libs%{?_isa} = %{nodejs_envr} +Provides: v8-devel = %{v8_epoch}:%{v8_version}-%{v8_release} + +Conflicts: v8-devel +Conflicts: v8-314-devel + + +%description -n v8-%{v8_major}.%{v8_minor}-devel +Development headers for the v8 runtime. + + +%package -n %{pkgname}-npm +Summary: Node.js Package Manager +Epoch: %{npm_epoch} +Version: %{npm_version} +Release: %{npm_release} + +# If we're using the companion NPM build, make sure to keep it in lock-step +# with the Node version. +Requires: %{pkgname} = %{nodejs_envr} +%if 0%{?fedora} || 0%{?rhel} >= 8 +Recommends: %{pkgname}-docs = %{nodejs_envr} +%endif + +# Do not add epoch to the virtual NPM provides or it will break +# the automatic dependency-generation script. +Provides: npm(npm) = %{npm_version} + +# Satisfy dependency requests for "npm" +Provides: npm = %{npm_envr} + +# Obsolete the old 'npm' package +Obsoletes: npm < %{npm_obsoletes} + + +%description -n %{pkgname}-npm +npm is a package manager for node.js. You can use it to install and publish +your node programs. It manages dependencies and does other cool stuff. + + +%package -n %{pkgname}-docs +Summary: Node.js API documentation +Group: Documentation +BuildArch: noarch +Requires(meta): %{pkgname} = %{nodejs_envr} + +Provides: nodejs-docs = %{nodejs_envr} + + +%description -n %{pkgname}-docs +The API documentation for the Node.js JavaScript runtime. + + +%prep +%autosetup -p1 -n node-v%{nodejs_version} + +# remove bundled dependencies that we aren't building +%if !%{with bundled_zlib} +rm -rf deps/zlib +%endif + +rm -rf deps/brotli +rm -rf deps/v8/third_party/jinja2 +rm -rf tools/inspector_protocol/jinja2 + +# check for correct versions of dependencies we are bundling +check_wasm_dep() { + local -r name="$1" source="$2" packagejson="$3" + local -r expected_version="$(jq -r '.version' "${packagejson}")" + + if ls "${source}"|grep -q --fixed-strings "${expected_version}"; then + printf '%s version matches\n' "${name}" >&2 + else + printf '%s version MISMATCH: %s !~ %s\n' "${name}" "${expected_version}" "${source}" >&2 + return 1 + fi +} + +check_wasm_dep cjs-module-lexer '%{SOURCE101}' deps/cjs-module-lexer/package.json +check_wasm_dep undici '%{SOURCE111}' deps/undici/src/package.json + +# Replace any instances of unversioned python with python3 +pfiles=( $(grep -rl python) ) +%py3_shebang_fix ${pfiles[@]} + + +%build + +# Activate DevToolset 11 on EPEL 7 +%if 0%{?rhel} && 0%{?rhel} < 8 +. /opt/rh/devtoolset-11/enable +%endif + +# When compiled on armv7hl this package generates an out of range +# reference to the literal pool. This is most likely a GCC issue. +%ifarch armv7hl +%define _lto_cflags %{nil} +%endif + +# Decrease debuginfo verbosity to reduce memory consumption during final +# library linking +%global optflags %(echo %{optflags} | sed 's/-g /-g1 /') + +export CC='%{__cc}' +export CXX='%{__cxx}' +export NODE_GYP_FORCE_PYTHON=%{python3} + +# build with debugging symbols and add defines from libuv (#892601) +# Node's v8 breaks with GCC 6 because of incorrect usage of methods on +# NULL objects. We need to pass -fno-delete-null-pointer-checks +# 2022-07-14: There's a bug in either torque or gcc that causes a +# segmentation fault on ppc64le and s390x if compiled with -O2. Things +# run fine on -O1 and -O3, so we'll just go with -O3 (like upstream) +# while this gets sorted out. +extra_cflags=( + -D_LARGEFILE_SOURCE + -D_FILE_OFFSET_BITS=64 + -DZLIB_CONST + -fno-delete-null-pointer-checks + -O3 +) +export CFLAGS="%{optflags} ${extra_cflags[*]}" CXXFLAGS="%{optflags} ${extra_cflags[*]}" +export LDFLAGS="%{build_ldflags}" + +# Fake up the unversioned python executable because gyp calls it from the PATH +mkdir .bin +cwd=$(pwd) +ln -srf /usr/bin/python3 ./.bin/python +export PATH="${cwd}/.bin:$PATH" + +%{python3} configure.py \ + --verbose \ + --ninja \ + --enable-lto \ + --prefix=%{_prefix} \ + --shared \ + --libdir=%{_lib} \ + %{ssl_configure} \ + %{!?with_bundled_zlib:--shared-zlib} \ + --shared-brotli \ + %{!?with_bundled:--shared-libuv} \ + %{?with_bundled:--without-dtrace}%{!?with_bundled:--with-dtrace} \ + --with-intl=small-icu \ + --with-icu-default-data-dir=%{icudatadir} \ + --without-corepack \ + --openssl-use-def-ca-store + +%ninja_build -C out/Release + + +%install + +# The ninja build does not put the shared library in the expected location, so +# we will move it. +mv out/Release/lib/libnode.so.%{nodejs_soversion} out/Release/ +./tools/install.py install %{buildroot} %{_prefix} + + +# own the sitelib directory +mv %{buildroot}%{nodejs_sitelib} \ + %{buildroot}%{nodejs_private_sitelib} + +%if 0%{?nodejs_default} +ln -srf %{buildroot}%{nodejs_private_sitelib} \ + %{buildroot}%{nodejs_sitelib} +%endif + + +# Set the binary permissions properly +chmod 0755 %{buildroot}/%{_bindir}/node +chrpath --delete %{buildroot}%{_bindir}/node + +# Rename the node binary +mv %{buildroot}%{_bindir}/node %{buildroot}%{_bindir}/node-%{nodejs_major} + +# Move the npm binary to npm-NODEJS_MAJOR +rm -f %{buildroot}%{_bindir}/npm + +ln -srf %{buildroot}%{nodejs_private_sitelib}/npm/bin/npm-cli.js \ + %{buildroot}%{_bindir}/npm-%{nodejs_major} + +# Move the npx binary to npm-NODEJS_MAJOR +rm -f %{buildroot}%{_bindir}/npx + +ln -srf %{buildroot}%{nodejs_private_sitelib}/npm/bin/npx-cli.js \ + %{buildroot}%{_bindir}/npx-%{nodejs_major} + +# Add the symlinks back for the default version +%if 0%{?nodejs_default} +ln -srf %{buildroot}%{_bindir}/node-%{nodejs_major} \ + %{buildroot}%{_bindir}/node + +ln -srf %{buildroot}%{_bindir}/npm-%{nodejs_major} \ + %{buildroot}%{_bindir}/npm + +ln -srf %{buildroot}%{_bindir}/npx-%{nodejs_major} \ + %{buildroot}%{_bindir}/npx +%endif + +# Install library symlink +ln -srf %{buildroot}%{_libdir}/libnode.so.%{nodejs_soversion} \ + %{buildroot}%{_libdir}/libnode.so + +# Install v8 compatibility symlinks +for header in %{buildroot}%{_includedir}/node/libplatform %{buildroot}%{_includedir}/node/v8*.h; do + header=$(basename ${header}) + ln -srf ./node/${header} %{buildroot}%{_includedir}/${header} +done +ln -s ./node/cppgc %{buildroot}%{_includedir}/cppgc +for soname in libv8 libv8_libbase libv8_libplatform; do + ln -s libnode.so.%{nodejs_soversion} %{buildroot}%{_libdir}/${soname}.so + ln -s libnode.so.%{nodejs_soversion} %{buildroot}%{_libdir}/${soname}.so.%{v8_major} +done + +# Remove tracing for non-default versions +%if ! 0%{?nodejs_default} +rm -rf %{buildroot}%{_usr}/lib/dtrace \ + %{buildroot}%{_datadir}/systemtap/tapset/node.stp +%endif + +# install documentation +mkdir -p %{buildroot}%{_pkgdocdir}/html +cp -pr doc/* %{buildroot}%{_pkgdocdir}/html +rm -f %{buildroot}%{_pkgdocdir}/html/nodejs.1 + +# node-gyp needs common.gypi too +mkdir -p %{buildroot}%{nodejs_datadir} +cp -p common.gypi %{buildroot}%{nodejs_datadir} + +# The config.gypi file is platform-dependent, so rename it to not conflict +mv %{buildroot}%{_includedir}/node/config.gypi \ + %{buildroot}%{_includedir}/node/config-%{_arch}.gypi + +# Install the GDB init tool into the documentation directory +mv %{buildroot}/%{_datadir}/doc/node/gdbinit %{buildroot}/%{_pkgdocdir}/gdbinit + +mkdir -p %{buildroot}%{_mandir}/nodejs-%{nodejs_major}/man1 \ + %{buildroot}%{_mandir}/nodejs-%{nodejs_major}/man5 \ + %{buildroot}%{_mandir}/nodejs-%{nodejs_major}/man7 \ + %{buildroot}%{nodejs_sitelib}/npm/man \ + %{buildroot}%{nodejs_private_sitelib}/npm/man \ + %{buildroot}%{_pkgdocdir}/npm + +# install manpage docs to mandir +cp -pr deps/npm/man/* \ + %{buildroot}%{_mandir}/nodejs-%{nodejs_major}/ +rm -rf %{buildroot}%{nodejs_private_sitelib}/npm/man +ln -srf %{buildroot}%{_mandir}/nodejs-%{nodejs_major} \ + %{buildroot}%{nodejs_private_sitelib}/npm/man + +%if 0%{?nodejs_default} +for i in 1 5 7; do + mkdir -p %{buildroot}%{_mandir}/man${i} + for manpage in %{buildroot}%{nodejs_private_sitelib}/npm/man/man$i/*; do + basename=$(basename ${manpage}) + ln -srf %{buildroot}%{nodejs_private_sitelib}/npm/man/man${i}/${manpage} \ + %{buildroot}%{_mandir}/man${i}/${basename} + done +done +%endif + +# Install the node interpreter manpage +mv %{buildroot}%{_mandir}/man1/node.1 \ + %{buildroot}%{_mandir}/nodejs-%{nodejs_major}/man1/ + +%if 0%{?nodejs_default} +ln -srf %{buildroot}%{_mandir}/nodejs-%{nodejs_major}/man1/node.1 \ + %{buildroot}%{_mandir}/man1/ +%endif + +# Install Gatsby HTML documentation to %%{_pkgdocdir} +cp -pr deps/npm/docs %{buildroot}%{_pkgdocdir}/npm/ +rm -rf %{buildroot}%{nodejs_private_sitelib}/npm/docs +ln -srf %{buildroot}%{_pkgdocdir}/npm %{buildroot}%{nodejs_private_sitelib}/npm/docs + +# Node tries to install some python files into a documentation directory +# (and not the proper one). Remove them for now until we figure out what to +# do with them. +rm -f %{buildroot}/%{_defaultdocdir}/node/lldb_commands.py \ + %{buildroot}/%{_defaultdocdir}/node/lldbinit + +# Some NPM bundled deps are executable but should not be. This causes +# unnecessary automatic dependencies to be added. Make them not executable. +# Skip the npm bin directory or the npm binary will not work. +find %{buildroot}%{nodejs_private_sitelib}/npm \ + -not -path "%{buildroot}%{nodejs_private_sitelib}/npm/bin/*" \ + -executable -type f \ + -exec chmod -x {} \; + +# The above command is a little overzealous. Add a few permissions back. +chmod 0755 %{buildroot}%{nodejs_private_sitelib}/npm/node_modules/@npmcli/run-script/lib/node-gyp-bin/node-gyp +chmod 0755 %{buildroot}%{nodejs_private_sitelib}/npm/node_modules/node-gyp/bin/node-gyp.js + +# Drop the NPM default configuration in place +%if 0%{?nodejs_default} +mkdir -p %{buildroot}%{_sysconfdir} +cp %{SOURCE1} %{buildroot}%{_sysconfdir}/npmrc + +# NPM upstream expects it to be in /usr/etc/npmrc, so we'll put a symlink here +# This is done in the interests of keeping /usr read-only. +mkdir -p %{buildroot}%{_prefix}/etc +ln -rsf %{buildroot}%{_sysconfdir}/npmrc \ + %{buildroot}%{_prefix}/etc/npmrc +%endif + +# Install the full-icu data files +mkdir -p %{buildroot}%{icudatadir} +%if 0%{?little_endian} +unzip -d %{buildroot}%{icudatadir} %{SOURCE4} icudt%{icu_major}l.dat +%else +unzip -d %{buildroot}%{icudatadir} %{SOURCE3} icudt%{icu_major}b.dat +%endif + + +%check +# Fail the build if the versions don't match +LD_LIBRARY_PATH=%{buildroot}%{_libdir} %{buildroot}/%{_bindir}/node-%{nodejs_major} -e "require('assert').equal(process.versions.node, '%{nodejs_version}')" +LD_LIBRARY_PATH=%{buildroot}%{_libdir} %{buildroot}/%{_bindir}/node-%{nodejs_major} -e "require('assert').equal(process.versions.v8.replace(/-node\.\d+$/, ''), '%{v8_version}')" +LD_LIBRARY_PATH=%{buildroot}%{_libdir} %{buildroot}/%{_bindir}/node-%{nodejs_major} -e "require('assert').equal(process.versions.ares.replace(/-DEV$/, ''), '%{c_ares_version}')" + +# Ensure we have punycode and that the version matches +LD_LIBRARY_PATH=%{buildroot}%{_libdir} %{buildroot}/%{_bindir}/node-%{nodejs_major} -e "require(\"assert\").equal(require(\"punycode\").version, '%{punycode_version}')" + +# Ensure we have npm and that the version matches +LD_LIBRARY_PATH=%{buildroot}%{_libdir} %{buildroot}%{_bindir}/node-%{nodejs_major} %{buildroot}%{_bindir}/npm-%{nodejs_major} version --json |jq -e '.npm == "%{npm_version}"' + +# Make sure i18n support is working +NODE_PATH=%{buildroot}%{_prefix}/lib/node_modules:%{buildroot}%{nodejs_private_sitelib}/npm/node_modules LD_LIBRARY_PATH=%{buildroot}%{_libdir} %{buildroot}/%{_bindir}/node-%{nodejs_major} --icu-data-dir=%{buildroot}%{icudatadir} %{SOURCE2} + + +%if 0%{?rhel} && 0%{?rhel} < 8 +%pretrans %{pkgname}-npm -p +-- Remove all of the symlinks from the bundled npm node_modules directory +base_path = "%{_prefix}/lib/node_modules/npm/node_modules/" +d_st = posix.stat(base_path) +if d_st then + for f in posix.files(base_path) do + path = base_path..f + st = posix.stat(path) + if st and st.type == "link" then + os.remove(path) + end + end +end +%endif + +# This can be removed once F37 is EOL +%pretrans -n %{pkgname} -p +path = "/usr/lib/node_modules" +st = posix.stat(path) +if st and st.type == "directory" then + status = os.rename(path, path .. ".rpmmoved") + if not status then + suffix = 0 + while not status do + suffix = suffix + 1 + status = os.rename(path .. ".rpmmoved", path .. ".rpmmoved." .. suffix) + end + os.rename(path, path .. ".rpmmoved") + end +end + + +%files -n %{pkgname} +%doc AUTHORS CHANGELOG.md onboarding.md GOVERNANCE.md README.md + +%if 0%{?nodejs_default} +%{_bindir}/node +%doc %{_mandir}/man1/node.1* +%dir %{_datadir}/systemtap +%dir %{_datadir}/systemtap/tapset +%{nodejs_sitelib} +%{_datadir}/systemtap/tapset/node.stp +%if %{without bundled} +%dir %{_usr}/lib/dtrace +%{_usr}/lib/dtrace/node.d +%endif +%endif + +%{_bindir}/node-%{nodejs_major} +%{nodejs_private_sitelib} + +%doc %{_mandir}/nodejs-%{nodejs_major}/man1/node.1* + + +%files -n %{pkgname}-devel +%{_includedir}/node +%{_libdir}/libnode.so +%{nodejs_datadir}/common.gypi +%{_pkgdocdir}/gdbinit + + +%files -n %{pkgname}-full-i18n +%dir %{icudatadir} +%{icudatadir}/icudt%{icu_major}*.dat + + +%files -n %{pkgname}-libs +%license LICENSE +%{_libdir}/libnode.so.%{nodejs_soversion} +%{_libdir}/libv8.so.%{v8_major} +%{_libdir}/libv8_libbase.so.%{v8_major} +%{_libdir}/libv8_libplatform.so.%{v8_major} +%dir %{nodejs_datadir}/ + + +%files -n v8-%{v8_major}.%{v8_minor}-devel +%{_includedir}/libplatform +%{_includedir}/v8*.h +%{_includedir}/cppgc +%{_libdir}/libv8.so +%{_libdir}/libv8_libbase.so +%{_libdir}/libv8_libplatform.so + + +%files -n %{pkgname}-npm +%if 0%{?nodejs_default} +%{_bindir}/npm +%{_bindir}/npx +%{_prefix}/etc/npmrc +%config(noreplace) %{_sysconfdir}/npmrc +%ghost %{_sysconfdir}/npmignore + +%doc %{_mandir}/man*/ +%exclude %doc %{_mandir}/man1/node.1* +%endif + +%{_bindir}/npm-%{nodejs_major} +%{_bindir}/npx-%{nodejs_major} +%{nodejs_private_sitelib}/npm + +%doc %{_mandir}/nodejs-%{nodejs_major}/ +%exclude %doc %{_mandir}/nodejs-%{nodejs_major}/man1/node.1* + + +%files -n %{pkgname}-docs +%doc doc +%dir %{_pkgdocdir} +%{_pkgdocdir}/html +%{_pkgdocdir}/npm/docs + + +%changelog +%autochangelog