From 33602b9114e0afa7c9113a3a8ca9f7d2c589645a Mon Sep 17 00:00:00 2001 From: Miguel de Benito Delgado Date: Mon, 9 Nov 2026 12:53:18 +0100 Subject: [PATCH] :wrench: Allow skipping renderer build setup via env. var (#12882) Set PENPOT_WASM_PREPARED=1 to speed up repeated builds --- render-wasm/README.md | 5 +++ render-wasm/_build_env | 5 +++ render-wasm/build | 4 +- render-wasm/scripts/cargo-build.test.cjs | 55 ++++++++++++++++++++++++ 4 files changed, 68 insertions(+), 1 deletion(-) diff --git a/render-wasm/README.md b/render-wasm/README.md index a6e0c1e25a..736b540bc2 100644 --- a/render-wasm/README.md +++ b/render-wasm/README.md @@ -52,6 +52,11 @@ Each target keeps its own `CARGO_TARGET_DIR` (`target/`), so switching between them does not invalidate the other's cache. Set `BUILD_MODE=release` (or `NODE_ENV=production`) for an optimized build; the default is `debug`. +Set `PENPOT_WASM_PREPARED=1` when the pinned Rust toolchain is selected, its +Emscripten target is installed, and this package's Node dependencies are +installed. `./build` and `./test` then skip `rustup` setup and `pnpm install`. +Benchmark preparation sets this flag for each retained build. + ### Serialize builds in one checkout All targets in one checkout share one `flock` lock stored at diff --git a/render-wasm/_build_env b/render-wasm/_build_env index c8d1fdd1e5..5c804469d0 100644 --- a/render-wasm/_build_env +++ b/render-wasm/_build_env @@ -164,6 +164,11 @@ function setup_rust { } function setup { + if [ "${PENPOT_WASM_PREPARED:-}" = "1" ]; then + echo "Skipping rustup and pnpm setup (PENPOT_WASM_PREPARED=1)" >&2 + return 0 + fi + setup_rust pnpm install; } diff --git a/render-wasm/build b/render-wasm/build index c4061068f2..c033654c5f 100755 --- a/render-wasm/build +++ b/render-wasm/build @@ -3,7 +3,9 @@ # Usage: ./build [frontend|export] [extra cargo params...] # # With no target, builds both. Set BUILD_MODE=release (or NODE_ENV=production) -# for an optimized build. See `_build_env` for what each target changes. +# for an optimized build. Set PENPOT_WASM_PREPARED=1 when the pinned toolchain +# and Node dependencies are prepared to skip their setup. See `_build_env` for +# what each target changes. _SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd) _RENDER_TARGET=${1:-} diff --git a/render-wasm/scripts/cargo-build.test.cjs b/render-wasm/scripts/cargo-build.test.cjs index e757c7cd95..01a080aa42 100644 --- a/render-wasm/scripts/cargo-build.test.cjs +++ b/render-wasm/scripts/cargo-build.test.cjs @@ -347,3 +347,58 @@ test("rejects malformed Cargo JSON and removes stale build facts", (t) => { assert.match(result.stderr, /ERROR:/); assert.equal(fs.existsSync(f.info), false); }); + +function runSetup(t, prepared) { + const root = fs.mkdtempSync(path.join(os.tmpdir(), "render-wasm-setup-")); + t.after(() => fs.rmSync(root, { recursive: true, force: true })); + const bin = path.join(root, "bin"); + const marker = path.join(root, "calls"); + fs.mkdirSync(bin); + for (const name of ["rustup", "pnpm"]) { + fs.writeFileSync( + path.join(bin, name), + `#!/bin/sh\nprintf '%s\\n' "${name} $*" >> "$MARKER"\n`, + { mode: 0o755 }, + ); + } + const env = { + ...process.env, + MARKER: marker, + PATH: `${bin}:${process.env.PATH}`, + }; + if (prepared === undefined) { + delete env.PENPOT_WASM_PREPARED; + } else { + env.PENPOT_WASM_PREPARED = prepared; + } + const result = spawnSync( + "bash", + [ + "--noprofile", + "--norc", + "-c", + 'source "$1" frontend; setup', + "setup-test", + path.resolve(__dirname, "..", "_build_env"), + ], + { + cwd: path.resolve(__dirname, ".."), + env, + encoding: "utf8", + }, + ); + assert.equal(result.status, 0, result.stderr); + return fs.existsSync(marker) ? fs.readFileSync(marker, "utf8") : ""; +} + +test("prepared setup skips rustup and pnpm", (t) => { + const normal = runSetup(t); + assert.match(normal, /^rustup default /m); + assert.match(normal, /^pnpm install$/m); + + const disabled = runSetup(t, "0"); + assert.match(disabled, /^rustup default /m); + assert.match(disabled, /^pnpm install$/m); + + assert.equal(runSetup(t, "1"), ""); +});