From 00eb1ca1f739a53c80f8b6de3dd22898fd23bbf4 Mon Sep 17 00:00:00 2001 From: tannevaled Date: Fri, 29 May 2026 12:05:53 +0200 Subject: [PATCH 1/8] =?UTF-8?q?new(emscripten.org):=20C/C++=20=E2=86=92=20?= =?UTF-8?q?WebAssembly=20toolchain=20(Top=20300=20#594)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit LLVM-based toolchain wrapping pantry's llvm.org clang to target WebAssembly. Python-based — no traditional make install. Copy the tree + seed .emscripten config pointing at pantry's llvm.org/nodejs. Closes part of pkgxdev/pantry#99 (holdout #594). --- projects/emscripten.org/package.yml | 82 +++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 projects/emscripten.org/package.yml diff --git a/projects/emscripten.org/package.yml b/projects/emscripten.org/package.yml new file mode 100644 index 0000000000..8117cb8ab5 --- /dev/null +++ b/projects/emscripten.org/package.yml @@ -0,0 +1,82 @@ +# Emscripten — LLVM-based C/C++ → WebAssembly toolchain. +# +# Provides emcc/em++/emar/emranlib wrappers around llvm.org clang +# that target WebAssembly. The emscripten Python toolkit + Node.js +# runtime are required at runtime. +# +# Closes part of pkgxdev/pantry#99 (Top 300 holdout #594). + +distributable: + url: https://github.com/emscripten-core/emscripten/archive/refs/tags/{{ version.raw }}.tar.gz + strip-components: 1 + +versions: + github: emscripten-core/emscripten/tags + match: /^\d+\.\d+\.\d+$/ + +platforms: + - linux/x86-64 + - linux/aarch64 + - darwin/x86-64 + - darwin/aarch64 + +dependencies: + python.org: '>=3.9' + nodejs.org: '*' + llvm.org: '*' + +runtime: + env: + EMSDK: ${{prefix}} + EM_CONFIG: ${{prefix}}/.emscripten + LLVM_ROOT: ${{deps.llvm.org.prefix}}/bin + NODE_JS: ${{deps.nodejs.org.prefix}}/bin/node + PYTHON: ${{deps.python.org.prefix}}/bin/python3 + +build: + dependencies: + gnu.org/coreutils: '*' + + script: + # Emscripten is a Python toolchain — `make install` doesn't exist. + # Copy the entire tree into {{prefix}} and seed a minimal .emscripten + # config that points at llvm.org's clang. + - run: | + mkdir -p "{{prefix}}" + cp -R . "{{prefix}}/" + cat > "{{prefix}}/.emscripten" <&1 | head -1 + - run: | + cat > hello.c <<'EOF' + #include + int main() { printf("hello from emscripten\n"); return 0; } + EOF + emcc hello.c -o hello.js + test -f hello.js + test -f hello.wasm + +provides: + - bin/emcc + - bin/em++ + - bin/emar + - bin/emranlib + - bin/emcmake + - bin/emconfigure + - bin/emmake + - bin/emrun From c0c26bfa3097ff11cedacdf514a9fa21a3316951 Mon Sep 17 00:00:00 2001 From: tannevaled Date: Fri, 29 May 2026 13:58:17 +0200 Subject: [PATCH 2/8] fix(emscripten): use 'if' instead of '&&' (set -e killed the loop) --- projects/emscripten.org/package.yml | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/projects/emscripten.org/package.yml b/projects/emscripten.org/package.yml index 8117cb8ab5..ff314d34ed 100644 --- a/projects/emscripten.org/package.yml +++ b/projects/emscripten.org/package.yml @@ -55,9 +55,18 @@ build: # Symlink the entry points to {{prefix}}/bin/. mkdir -p "{{prefix}}/bin" + # `[ ... ] && cmd` fails the whole script when [] is false under + # set -e — use explicit `if` to keep the iteration going if a + # tool doesn't exist (different emscripten releases ship slightly + # different sets). for tool in emcc em++ emar emranlib emcmake emconfigure emmake emrun; do - [ -f "{{prefix}}/$tool" ] && ln -sf "../$tool" "{{prefix}}/bin/$tool" + if [ -f "{{prefix}}/$tool" ]; then + ln -sf "../$tool" "{{prefix}}/bin/$tool" + else + echo "warn: $tool not found at {{prefix}}/$tool" + fi done + ls -la "{{prefix}}/bin/" | head -15 test: script: From adb1416c08286423f398f283b6981f8b972ef662 Mon Sep 17 00:00:00 2001 From: tannevaled Date: Fri, 29 May 2026 14:34:07 +0200 Subject: [PATCH 3/8] fix(emscripten): create shell wrappers for .py entry points emscripten 5.0.x dropped the bare-name entry points (emcc, em++, emar, etc.) in favor of Python scripts with .py suffix. The previous recipe assumed bare names and produced empty bin/, leading to provides: audit failure 'missing executables'. Generate a small shell shim per tool that invokes the .py via pantry's pinned python3. --- projects/emscripten.org/package.yml | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/projects/emscripten.org/package.yml b/projects/emscripten.org/package.yml index ff314d34ed..a99a4602c7 100644 --- a/projects/emscripten.org/package.yml +++ b/projects/emscripten.org/package.yml @@ -53,17 +53,22 @@ build: JS_ENGINES = [NODE_JS] EOF - # Symlink the entry points to {{prefix}}/bin/. + # emscripten 5.0.x dropped the bare-name entry points in + # favor of .py-suffixed Python scripts (emcc.py, em++.py, ...). + # Wrap each as a small shell shim that invokes the .py via the + # bottle's pinned Python. mkdir -p "{{prefix}}/bin" - # `[ ... ] && cmd` fails the whole script when [] is false under - # set -e — use explicit `if` to keep the iteration going if a - # tool doesn't exist (different emscripten releases ship slightly - # different sets). for tool in emcc em++ emar emranlib emcmake emconfigure emmake emrun; do - if [ -f "{{prefix}}/$tool" ]; then - ln -sf "../$tool" "{{prefix}}/bin/$tool" + src="{{prefix}}/$tool.py" + dst="{{prefix}}/bin/$tool" + if [ -f "$src" ]; then + cat > "$dst" < Date: Fri, 29 May 2026 14:41:17 +0200 Subject: [PATCH 4/8] fix(emscripten): printf instead of heredoc (YAML block-scalar parse error) --- projects/emscripten.org/package.yml | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/projects/emscripten.org/package.yml b/projects/emscripten.org/package.yml index a99a4602c7..7a6a4a56a0 100644 --- a/projects/emscripten.org/package.yml +++ b/projects/emscripten.org/package.yml @@ -54,18 +54,16 @@ build: EOF # emscripten 5.0.x dropped the bare-name entry points in - # favor of .py-suffixed Python scripts (emcc.py, em++.py, ...). - # Wrap each as a small shell shim that invokes the .py via the - # bottle's pinned Python. + # favor of .py-suffixed Python scripts. Wrap each as a small + # shell shim. Use printf (not heredoc) — un-indented heredoc + # bodies break YAML's `|` block-scalar indentation rules. mkdir -p "{{prefix}}/bin" + PY="{{deps.python.org.prefix}}/bin/python3" for tool in emcc em++ emar emranlib emcmake emconfigure emmake emrun; do src="{{prefix}}/$tool.py" dst="{{prefix}}/bin/$tool" if [ -f "$src" ]; then - cat > "$dst" < "$dst" chmod 755 "$dst" else echo "warn: $src does not exist — skipping" From dd5efd1a473dfa9f079a72d199a26cd7b82c74be Mon Sep 17 00:00:00 2001 From: tannevaled Date: Fri, 29 May 2026 14:56:08 +0200 Subject: [PATCH 5/8] fix(emscripten): runtime-resolve bottle prefix in wrapper (was +brewing) --- projects/emscripten.org/package.yml | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/projects/emscripten.org/package.yml b/projects/emscripten.org/package.yml index 7a6a4a56a0..d70949b3ec 100644 --- a/projects/emscripten.org/package.yml +++ b/projects/emscripten.org/package.yml @@ -55,21 +55,32 @@ build: # emscripten 5.0.x dropped the bare-name entry points in # favor of .py-suffixed Python scripts. Wrap each as a small - # shell shim. Use printf (not heredoc) — un-indented heredoc - # bodies break YAML's `|` block-scalar indentation rules. + # shell shim that resolves its own bin/ at runtime so the + # bottle is relocation-safe (the literal +brewing prefix would + # be wrong post-install). + # + # Python comes from a pkgx dep and has a stable path — fine to + # hardcode that. Only the bottle-relative .py path needs to be + # runtime-resolved via ${0%/*}. mkdir -p "{{prefix}}/bin" PY="{{deps.python.org.prefix}}/bin/python3" for tool in emcc em++ emar emranlib emcmake emconfigure emmake emrun; do src="{{prefix}}/$tool.py" dst="{{prefix}}/bin/$tool" if [ -f "$src" ]; then - printf '#!/bin/sh\nexec "%s" "%s" "$@"\n' "$PY" "$src" > "$dst" + printf '%s\n%s\n%s\n%s\n' \ + '#!/bin/sh' \ + 'bindir=$(CDPATH= cd -- "${0%/*}" && pwd)' \ + 'prefix=$(CDPATH= cd -- "$bindir/.." && pwd)' \ + "exec \"$PY\" \"\$prefix/$tool.py\" \"\$@\"" > "$dst" chmod 755 "$dst" else echo "warn: $src does not exist — skipping" fi done ls -la "{{prefix}}/bin/" | head -15 + echo "── sample wrapper ──" + cat "{{prefix}}/bin/emcc" 2>/dev/null || true test: script: From c435fb239de4b11bdf9f95bad97a1aece7a480b7 Mon Sep 17 00:00:00 2001 From: tannevaled Date: Fri, 29 May 2026 15:12:03 +0200 Subject: [PATCH 6/8] fix(emscripten): omit BINARYEN_ROOT (empty value triggered error) --- projects/emscripten.org/package.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/projects/emscripten.org/package.yml b/projects/emscripten.org/package.yml index d70949b3ec..f8d85b3d11 100644 --- a/projects/emscripten.org/package.yml +++ b/projects/emscripten.org/package.yml @@ -47,11 +47,13 @@ build: cat > "{{prefix}}/.emscripten" < Date: Sun, 31 May 2026 14:07:44 +0200 Subject: [PATCH 7/8] fix(emscripten): add WebAssembly/binaryen dep for wasm-opt MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Test failed with: emcc: error: BINARYEN_ROOT not set in config, and `wasm-opt` not found in PATH Pantry's llvm.org does not ship wasm-opt — that tool lives in WebAssembly/binaryen (added by PR #13080, currently green). Wire binaryen as a runtime + build dep and point BINARYEN_ROOT at it in both runtime.env and the seeded .emscripten config. Mirrors how homebrew/nixpkgs configure emscripten (separate binaryen install referenced via BINARYEN_ROOT). --- projects/emscripten.org/package.yml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/projects/emscripten.org/package.yml b/projects/emscripten.org/package.yml index f8d85b3d11..05e8e53b6a 100644 --- a/projects/emscripten.org/package.yml +++ b/projects/emscripten.org/package.yml @@ -24,12 +24,14 @@ dependencies: python.org: '>=3.9' nodejs.org: '*' llvm.org: '*' + WebAssembly/binaryen: '*' runtime: env: EMSDK: ${{prefix}} EM_CONFIG: ${{prefix}}/.emscripten LLVM_ROOT: ${{deps.llvm.org.prefix}}/bin + BINARYEN_ROOT: ${{deps.WebAssembly/binaryen.prefix}} NODE_JS: ${{deps.nodejs.org.prefix}}/bin/node PYTHON: ${{deps.python.org.prefix}}/bin/python3 @@ -46,14 +48,15 @@ build: cp -R . "{{prefix}}/" cat > "{{prefix}}/.emscripten" < Date: Sun, 31 May 2026 14:10:23 +0200 Subject: [PATCH 8/8] fix(emscripten): use full github.com/ key for binaryen dep MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit pantry's convention for non-domain projects is github.com//; the binaryen recipe lives at projects/github.com/WebAssembly/binaryen/. Previous commit used 'WebAssembly/binaryen' which libpkgx rejected: Error: pkg not found: WebAssembly/binaryen NB: this PR now hard-depends on #13080 (new(WebAssembly/binaryen)) being merged first — that PR is green and mergeable. --- projects/emscripten.org/package.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/projects/emscripten.org/package.yml b/projects/emscripten.org/package.yml index 05e8e53b6a..93a8cfe9ee 100644 --- a/projects/emscripten.org/package.yml +++ b/projects/emscripten.org/package.yml @@ -24,14 +24,14 @@ dependencies: python.org: '>=3.9' nodejs.org: '*' llvm.org: '*' - WebAssembly/binaryen: '*' + github.com/WebAssembly/binaryen: '*' runtime: env: EMSDK: ${{prefix}} EM_CONFIG: ${{prefix}}/.emscripten LLVM_ROOT: ${{deps.llvm.org.prefix}}/bin - BINARYEN_ROOT: ${{deps.WebAssembly/binaryen.prefix}} + BINARYEN_ROOT: ${{deps.github.com/WebAssembly/binaryen.prefix}} NODE_JS: ${{deps.nodejs.org.prefix}}/bin/node PYTHON: ${{deps.python.org.prefix}}/bin/python3 @@ -48,7 +48,7 @@ build: cp -R . "{{prefix}}/" cat > "{{prefix}}/.emscripten" <