initial package import
This commit is contained in:
commit
2a0ce7c5c2
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
/undici-5.26.4-stripped.tar.gz
|
||||
/undici-5.26.4-nm-prod.tgz
|
||||
/undici-5.26.4-nm-dev.tgz
|
||||
/undici-5.26.4-bundled-licenses.txt
|
123
0001-feat-allow-customization-of-build-environment.patch
Normal file
123
0001-feat-allow-customization-of-build-environment.patch
Normal file
@ -0,0 +1,123 @@
|
||||
From 9dfb61b331b09552250cea7268fc632335816661 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Jan=20Stan=C4=9Bk?= <jstanek@redhat.com>
|
||||
Date: Thu, 2 Nov 2023 15:09:10 +0100
|
||||
Subject: [PATCH] feat: allow customization of build environment
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
This allows for the WASM artifacts to be built elsewhere than only in
|
||||
the alpine-based node container.
|
||||
|
||||
Signed-off-by: Jan Staněk <jstanek@redhat.com>
|
||||
---
|
||||
build/wasm.js | 72 +++++++++++++++++++++------------------------------
|
||||
1 file changed, 29 insertions(+), 43 deletions(-)
|
||||
|
||||
diff --git a/build/wasm.js b/build/wasm.js
|
||||
index fd90ac26..2b63f3c7 100644
|
||||
--- a/build/wasm.js
|
||||
+++ b/build/wasm.js
|
||||
@@ -9,6 +9,18 @@ const WASM_SRC = resolve(__dirname, '../deps/llhttp')
|
||||
const WASM_OUT = resolve(__dirname, '../lib/llhttp')
|
||||
const DOCKERFILE = resolve(__dirname, './Dockerfile')
|
||||
|
||||
+// These are defined by build environment
|
||||
+const WASM_CC = process.env.WASM_CC || 'clang'
|
||||
+let WASM_CFLAGS = process.env.WASM_CFLAGS || '--sysroot=/usr/share/wasi-sysroot -target wasm32-unknown-wasi'
|
||||
+let WASM_LDFLAGS = process.env.WASM_LDFLAGS || ''
|
||||
+const WASM_LDLIBS = process.env.WASM_LDLIBS || ''
|
||||
+
|
||||
+// These are relevant for undici and should not be overridden
|
||||
+WASM_CFLAGS += ' -Ofast -fno-exceptions -fvisibility=hidden -mexec-model=reactor'
|
||||
+WASM_LDFLAGS += ' -Wl,-error-limit=0 -Wl,-O3 -Wl,--lto-O3 -Wl,--strip-all'
|
||||
+WASM_LDFLAGS += ' -Wl,--allow-undefined -Wl,--export-dynamic -Wl,--export-table'
|
||||
+WASM_LDFLAGS += ' -Wl,--export=malloc -Wl,--export=free -Wl,--no-entry'
|
||||
+
|
||||
let platform = process.env.WASM_PLATFORM
|
||||
if (!platform && process.argv[2]) {
|
||||
platform = execSync('docker info -f "{{.OSType}}/{{.Architecture}}"').toString().trim()
|
||||
@@ -35,35 +47,25 @@ if (process.argv[2] === '--docker') {
|
||||
process.exit(0)
|
||||
}
|
||||
|
||||
-// Gather information about the tools used for the build
|
||||
-const buildInfo = execSync('apk info -v').toString()
|
||||
-if (!buildInfo.includes('wasi-sdk')) {
|
||||
- console.log('Failed to generate build environment information')
|
||||
- process.exit(-1)
|
||||
+const hasApk = (function () {
|
||||
+ try { execSync('command -v apk'); return true } catch (error) { return false }
|
||||
+})()
|
||||
+if (hasApk) {
|
||||
+ // Gather information about the tools used for the build
|
||||
+ const buildInfo = execSync('apk info -v').toString()
|
||||
+ if (!buildInfo.includes('wasi-sdk')) {
|
||||
+ console.log('Failed to generate build environment information')
|
||||
+ process.exit(-1)
|
||||
+ }
|
||||
+ writeFileSync(join(WASM_OUT, 'wasm_build_env.txt'), buildInfo)
|
||||
}
|
||||
-writeFileSync(join(WASM_OUT, 'wasm_build_env.txt'), buildInfo)
|
||||
|
||||
// Build wasm binary
|
||||
-execSync(`clang \
|
||||
- --sysroot=/usr/share/wasi-sysroot \
|
||||
- -target wasm32-unknown-wasi \
|
||||
- -Ofast \
|
||||
- -fno-exceptions \
|
||||
- -fvisibility=hidden \
|
||||
- -mexec-model=reactor \
|
||||
- -Wl,-error-limit=0 \
|
||||
- -Wl,-O3 \
|
||||
- -Wl,--lto-O3 \
|
||||
- -Wl,--strip-all \
|
||||
- -Wl,--allow-undefined \
|
||||
- -Wl,--export-dynamic \
|
||||
- -Wl,--export-table \
|
||||
- -Wl,--export=malloc \
|
||||
- -Wl,--export=free \
|
||||
- -Wl,--no-entry \
|
||||
+execSync(`${WASM_CC} ${WASM_CFLAGS} ${WASM_LDFLAGS} \
|
||||
${join(WASM_SRC, 'src')}/*.c \
|
||||
-I${join(WASM_SRC, 'include')} \
|
||||
- -o ${join(WASM_OUT, 'llhttp.wasm')}`, { stdio: 'inherit' })
|
||||
+ -o ${join(WASM_OUT, 'llhttp.wasm')} \
|
||||
+ ${WASM_LDLIBS}`, { stdio: 'inherit' })
|
||||
|
||||
const base64Wasm = readFileSync(join(WASM_OUT, 'llhttp.wasm')).toString('base64')
|
||||
writeFileSync(
|
||||
@@ -72,27 +74,11 @@ writeFileSync(
|
||||
)
|
||||
|
||||
// Build wasm simd binary
|
||||
-execSync(`clang \
|
||||
- --sysroot=/usr/share/wasi-sysroot \
|
||||
- -target wasm32-unknown-wasi \
|
||||
- -msimd128 \
|
||||
- -Ofast \
|
||||
- -fno-exceptions \
|
||||
- -fvisibility=hidden \
|
||||
- -mexec-model=reactor \
|
||||
- -Wl,-error-limit=0 \
|
||||
- -Wl,-O3 \
|
||||
- -Wl,--lto-O3 \
|
||||
- -Wl,--strip-all \
|
||||
- -Wl,--allow-undefined \
|
||||
- -Wl,--export-dynamic \
|
||||
- -Wl,--export-table \
|
||||
- -Wl,--export=malloc \
|
||||
- -Wl,--export=free \
|
||||
- -Wl,--no-entry \
|
||||
+execSync(`${WASM_CC} ${WASM_CFLAGS} -msimd128 ${WASM_LDFLAGS} \
|
||||
${join(WASM_SRC, 'src')}/*.c \
|
||||
-I${join(WASM_SRC, 'include')} \
|
||||
- -o ${join(WASM_OUT, 'llhttp_simd.wasm')}`, { stdio: 'inherit' })
|
||||
+ -o ${join(WASM_OUT, 'llhttp_simd.wasm')} \
|
||||
+ ${WASM_LDLIBS}`, { stdio: 'inherit' })
|
||||
|
||||
const base64WasmSimd = readFileSync(join(WASM_OUT, 'llhttp_simd.wasm')).toString('base64')
|
||||
writeFileSync(
|
||||
--
|
||||
2.41.0
|
||||
|
87
nodejs-undici.spec
Normal file
87
nodejs-undici.spec
Normal file
@ -0,0 +1,87 @@
|
||||
%global npm_name undici
|
||||
|
||||
%global llhttp_version_major 8
|
||||
%global llhttp_version_minor 1
|
||||
%global llhttp_version_patch 0
|
||||
|
||||
Name: nodejs-%{npm_name}
|
||||
Summary: An HTTP/1.1 client, written from scratch for Node.js
|
||||
Version: 5.26.4
|
||||
Release: %autorelease
|
||||
|
||||
License: MIT
|
||||
URL: https://undici.nodejs.org
|
||||
# See Source4 on how these archives were generated
|
||||
Source0: %{npm_name}-%{version}-stripped.tar.gz
|
||||
Source1: %{npm_name}-%{version}-nm-prod.tgz
|
||||
Source2: %{npm_name}-%{version}-nm-dev.tgz
|
||||
Source3: %{npm_name}-%{version}-bundled-licenses.txt
|
||||
Source4: %{npm_name}-sources.sh
|
||||
|
||||
Patch: 0001-feat-allow-customization-of-build-environment.patch
|
||||
|
||||
# Binary artifacts in this package are aimed at the wasm32-wasi "architecture".
|
||||
%global _binaries_in_noarch_packages_terminate_build 0
|
||||
BuildArch: noarch
|
||||
ExclusiveArch: %{nodejs_arches} noarch
|
||||
|
||||
BuildRequires: clang lld wasi-libc-devel
|
||||
BuildRequires: nodejs-devel npm
|
||||
# for autosetup -S git_am
|
||||
BuildRequires: git-core
|
||||
|
||||
# This package bundles it's own copy of llhttp
|
||||
Provides: bundled(llhttp) = %{llhttp_version_major}.%{llhttp_version_minor}.%{llhttp_version_patch}
|
||||
|
||||
%description
|
||||
An HTTP/1.1 client, written from scratch for Node.js.
|
||||
|
||||
%prep
|
||||
%autosetup -n %{npm_name}-%{version} -S git_am
|
||||
cp -p %{S:3} .
|
||||
|
||||
# Check for bundled llhttp version
|
||||
if ! grep -q 'LLHTTP_VERSION_MAJOR %{llhttp_version_major}' deps/llhttp/include/llhttp.h \
|
||||
|| ! grep -q 'LLHTTP_VERSION_MINOR %{llhttp_version_minor}' deps/llhttp/include/llhttp.h \
|
||||
|| ! grep -q 'LLHTTP_VERSION_PATCH %{llhttp_version_patch}' deps/llhttp/include/llhttp.h
|
||||
then
|
||||
echo 'llhttp version mismatch' >&2; exit 2
|
||||
fi
|
||||
|
||||
# Link node_modules
|
||||
mkdir -p node_modules/.bin/
|
||||
tar -xzf %{S:1}
|
||||
ln -srt node_modules/ node_modules_prod/*
|
||||
ln -srt node_modules/.bin/ node_modules_prod/.bin
|
||||
|
||||
%build
|
||||
export WASM_CC=clang
|
||||
export WASM_CFLAGS='--target=wasm32-wasi --sysroot=/usr/wasm32-wasi'
|
||||
export WASM_LDFLAGS='-nodefaultlibs'
|
||||
export WASM_LDLIBS='-lc'
|
||||
|
||||
# `npm run build` uses docker; invoke the build script directly
|
||||
%{__nodejs} build/wasm.js
|
||||
npm --offline pack
|
||||
|
||||
%install
|
||||
mkdir -p %{buildroot}%{nodejs_sitelib}/%{npm_name}
|
||||
tar -C %{buildroot}%{nodejs_sitelib}/%{npm_name} -xzf %{npm_name}-%{version}.tgz --strip-components=1
|
||||
cp -prt %{buildroot}%{nodejs_sitelib}/%{npm_name} node_modules_prod node_modules
|
||||
|
||||
%check
|
||||
%{__nodejs} -e 'require("./")'
|
||||
|
||||
tar -xzf %{S:2}
|
||||
ln -fsrt node_modules/ node_modules_dev/*
|
||||
ln -fsrt node_modules/.bin/ node_modules_dev/.bin/*
|
||||
# Depends on the environment/OpenSSL version, etc. Informational only.
|
||||
npm --offline run test || :
|
||||
|
||||
%files
|
||||
%doc README.md
|
||||
%license LICENSE %{npm_name}-%{version}-bundled-licenses.txt
|
||||
%{nodejs_sitelib}/%{npm_name}
|
||||
|
||||
%changelog
|
||||
%autochangelog
|
4
sources
Normal file
4
sources
Normal file
@ -0,0 +1,4 @@
|
||||
SHA512 (undici-5.26.4-stripped.tar.gz) = f50c3c731dc7cd8af9646fd7abd13e452ba258f66dc53be07feba827475828a16a7641934ae283cc9ca11bc8d0e348c0bfcb8ecccda2bb7afb6bdb01f5ddde63
|
||||
SHA512 (undici-5.26.4-nm-prod.tgz) = 2b6d0a2728289a91331314d7c40515a784d5d22dcc538fcbf33ffa09c826afd07c5605dff50d54d09b8010b9acdc1b00637e84461c274046ffbcb77bcbeda9a6
|
||||
SHA512 (undici-5.26.4-nm-dev.tgz) = 67bcd32c485c0385a4e7d9b1c703a23367c05438c6f6c34ac986056e4110b92d107fc7b0eec6d2dfb5036c7120d769fb2694cfd9dcccb3403ed639b9c993a9af
|
||||
SHA512 (undici-5.26.4-bundled-licenses.txt) = 3e591adb16e09b1c6fb75eb97a6ac51cd06e0aeae2bd5950a15902346e2c9626cb50203bfd0e15c7e8c98af8f24b81c1ce6617c359e7c0e7d0a6366457c844ba
|
104
undici-sources.sh
Executable file
104
undici-sources.sh
Executable file
@ -0,0 +1,104 @@
|
||||
#!/bin/sh
|
||||
# deps: curl rpm npm nodejs-packaging-bundler
|
||||
set -e
|
||||
|
||||
UNDICI_VERSION="$(rpm --specfile nodejs-undici.spec --qf '%{VERSION}\n')"; readonly UNDICI_VERSION
|
||||
|
||||
RPKG=fedpkg
|
||||
RELEASE=""
|
||||
OFFLINE=false
|
||||
|
||||
usage() {
|
||||
echo "${0##*/} - download and re-package upstream undici sources."
|
||||
echo
|
||||
echo Options:
|
||||
printf '\t%s\n' '-h, --help: Show this info and exit.'
|
||||
printf '\t%s\n' '-r<TOOL>, --rpkg=<TOOL>: Use <TOOL> for dist-git interaction [default: fedpkg].'
|
||||
printf '\t%s\n' '--release=<RELEASE>: Tell <TOOL> to assume working on <RELEASE> [default: detected from current branch].'
|
||||
printf '\t%s\n' '-n, --offline: Do not upload prepared sources to lookaside cache.'
|
||||
}
|
||||
|
||||
# Construct upstream archive URL
|
||||
github_archive_url() {
|
||||
readonly gh_version="${1-${UNDICI_VERSION}}"
|
||||
printf 'https://github.com/nodejs/undici/archive/v%s/undici-v%s.tar.gz' "${gh_version}" "${gh_version}"
|
||||
}
|
||||
|
||||
# Fetch upstream release
|
||||
# stdout: name of the original/upstream archive
|
||||
fetch() {
|
||||
readonly fetch_version="${1-${UNDICI_VERSION}}"
|
||||
# npm archive does not contain everything (i.e. build scripts).
|
||||
# Fetch the github archive instead.
|
||||
fetch_url="$(github_archive_url "${fetch_version}")"; readonly fetch_url
|
||||
curl --location --remote-name "${fetch_url}"
|
||||
printf '%s\n' "${fetch_url##*/}"
|
||||
}
|
||||
|
||||
# Delete any file where a WASM blob is detected
|
||||
# stdout: relative paths to deleted files
|
||||
nuke_wasm() {
|
||||
find "${1-.}" -type f \
|
||||
-exec grep -q --text -Pe '\x{0}asm|AGFzb' '{}' \; \
|
||||
-print \
|
||||
-delete
|
||||
}
|
||||
|
||||
# Remove husky (git hook manager) from prepare scripts
|
||||
remove_husky() {
|
||||
cd "${1-undici-v${UNDICI_VERSION}/}" >/dev/null
|
||||
if grep -q 'husky install' package.json; then
|
||||
npm pkg delete scripts.prepare
|
||||
fi
|
||||
cd - >/dev/null
|
||||
}
|
||||
|
||||
# Package the sources into stripped archive
|
||||
repackage() {
|
||||
readonly repackage_version="${1-${UNDICI_VERSION}}"
|
||||
readonly repackage_rootdir="${2-undici-v${repackage_version}/}"
|
||||
|
||||
tar -czf "undici-${repackage_version}-stripped.tar.gz" "${repackage_rootdir}"
|
||||
rm -rf "${repackage_rootdir}"
|
||||
echo "undici-${repackage_version}-stripped.tar.gz"
|
||||
}
|
||||
|
||||
# shellcheck disable=SC2046
|
||||
set -- $(getopt -n "${0##*/}" --unquoted -o hr:n -l help,rpkg:,release:,offline -- "$@")
|
||||
while test -n "$1"; do
|
||||
case "$1" in
|
||||
-h|--help) usage >&2 && exit;;
|
||||
-r|--rpkg) RPKG="$2"; shift 2;;
|
||||
-n|--offline) OFFLINE=true; shift 1;;
|
||||
--release) RELEASE="$2"; shift 2;;
|
||||
--) break;;
|
||||
*) printf 'Unknown argument: %s\n' "$1" >&2; exit 2;;
|
||||
esac
|
||||
done
|
||||
|
||||
printf '=== %s ===\n' 'Fetching and unpacking upstream tarball' >&2
|
||||
original="$(fetch "${UNDICI_VERSION}")"; readonly original
|
||||
tar -xzf "${original}"
|
||||
rootdir="$(ls -d "undici-${UNDICI_VERSION}/")"; readonly rootdir
|
||||
rm -rf "${original}"
|
||||
|
||||
printf '=== %s ===\n' 'Removing following WASM blobs' >&2
|
||||
nuke_wasm "${rootdir}" >&2
|
||||
|
||||
printf '=== %s ===\n' 'Cleaning package scripts' >&2
|
||||
remove_husky "${rootdir}"
|
||||
|
||||
printf '=== %s ===\n' 'Re-packaging clean archive' >&2
|
||||
repackage "${UNDICI_VERSION}" "${rootdir}"
|
||||
|
||||
printf '=== %s ===\n' 'Bundling dependencies' >&2
|
||||
nodejs-packaging-bundler undici "${UNDICI_VERSION}" "undici-${UNDICI_VERSION}-stripped.tar.gz"
|
||||
install -p -m0644 -t "${PWD}" "$(rpm -E '%{_sourcedir}')"/undici-"${UNDICI_VERSION}"-*
|
||||
|
||||
printf '=== %s ===\n' 'Updating dist-git sources' >&2
|
||||
# shellcheck disable=SC2086,SC2046
|
||||
${RPKG} $(test -n "${RELEASE}" && echo --release="${RELEASE}") new-sources $("$OFFLINE" && echo --offline) \
|
||||
"undici-${UNDICI_VERSION}-stripped.tar.gz" \
|
||||
"undici-${UNDICI_VERSION}-nm-prod.tgz" \
|
||||
"undici-${UNDICI_VERSION}-nm-dev.tgz" \
|
||||
"undici-${UNDICI_VERSION}-bundled-licenses.txt"
|
Loading…
Reference in New Issue
Block a user