From 09a85ca55405b72adc7afae56fd72f86a9dad5db Mon Sep 17 00:00:00 2001 From: Javier Sagredo Date: Wed, 29 Apr 2026 09:08:55 +0200 Subject: [PATCH] Add script for preparing the wasm libraries for building without Nix --- scripts/wasm-without-nix/build-wasm-libs.sh | 219 ++++++++++++++++++++ 1 file changed, 219 insertions(+) create mode 100755 scripts/wasm-without-nix/build-wasm-libs.sh diff --git a/scripts/wasm-without-nix/build-wasm-libs.sh b/scripts/wasm-without-nix/build-wasm-libs.sh new file mode 100755 index 0000000000..affb0aeed9 --- /dev/null +++ b/scripts/wasm-without-nix/build-wasm-libs.sh @@ -0,0 +1,219 @@ +#!/usr/bin/env bash +# Build libsodium, libsecp256k1, and libblst for wasm32-wasi and install them +# into a single prefix that cabal.project can point at via extra-lib-dirs / +# extra-include-dirs. Mirrors ./nix/{libsodium,secp256k1,blst}.nix but uses +# wasm32-wasi-clang directly (no Nix). +# +# Requirements on PATH: wasm32-wasi-clang (from wasi-sdk), autoreconf, +# automake, libtool, make, git, pkg-config. + +set -euo pipefail + +# Script must be run from the root of the project +PROJECT_DIR="$(pwd)" +[ -f "$PROJECT_DIR/cabal.project" ] || { + echo "Error: cabal.project not found in $PROJECT_DIR. Run this script from the root of the project" >&2 + exit 1 +} + +missing=() +[ -n "${PREFIX:-}" ] || missing+=(PREFIX) +[ -n "${SRC_ROOT:-}" ] || missing+=(SRC_ROOT) +if [ "${#missing[@]}" -gt 0 ]; then + cat >&2 </dev/null 2>&1 || toolchain_missing+=("$t") +done +if [ "${#toolchain_missing[@]}" -gt 0 ]; then + cat >&2 </dev/null || true + git -C "$dir" checkout "$rev" + fi +} + +build_libsodium() { + local dir="$ABS_SRC_ROOT/libsodium" + clone_if_missing "$LIBSODIUM_REPO" "$dir" "$LIBSODIUM_REV" + cd "$dir" + [ -x ./configure ] || ./autogen.sh -s + ./configure --host=wasm32-wasi --prefix="$ABS_PREFIX" + make -j"$(nproc)" + make install + wasm32-wasi-clang -shared -Wl,--whole-archive \ + "$ABS_PREFIX/lib/libsodium.a" \ + -o "$ABS_PREFIX/lib/libsodium.so" +} + +build_secp256k1() { + local dir="$ABS_SRC_ROOT/secp256k1" + clone_if_missing "$SECP256K1_REPO" "$dir" + cd "$dir" + [ -x ./configure ] || ./autogen.sh + ./configure \ + --host=wasm32-wasi \ + --enable-module-schnorrsig \ + --prefix="$ABS_PREFIX" \ + SECP_CFLAGS=-fPIC + make -j"$(nproc)" + make install + wasm32-wasi-clang -shared -Wl,--whole-archive \ + "$ABS_PREFIX/lib/libsecp256k1.a" \ + -o "$ABS_PREFIX/lib/libsecp256k1.so" +} + +build_blst() { + local dir="$ABS_SRC_ROOT/blst" + clone_if_missing "$BLST_REPO" "$dir" + cd "$dir" + CC=wasm32-wasi-clang ./build.sh + + cp libblst.a "$ABS_PREFIX/lib/" + cp bindings/blst.h bindings/blst_aux.h "$ABS_PREFIX/include/" + + wasm32-wasi-clang -shared -Wl,--whole-archive \ + "$ABS_PREFIX/lib/libblst.a" \ + -o "$ABS_PREFIX/lib/libblst.so" + + local version + version="$(git -C "$dir" describe --tags --always 2>/dev/null || echo 0.0.0)" + cat > "$ABS_PREFIX/lib/pkgconfig/libblst.pc" <&2 + exit 1 + fi +} + +build_libsodium 2>&1 | sed -u $'s/^/\033[1;32mlibsodium\033[0m > /' +build_secp256k1 2>&1 | sed -u $'s/^/\033[1;36msecp256k1\033[0m > /' +build_blst 2>&1 | sed -u $'s/^/\033[1;33mblst\033[0m > /' + +verify_wasm "$ABS_PREFIX/lib/libsodium.a" +verify_wasm "$ABS_PREFIX/lib/libsecp256k1.a" +verify_wasm "$ABS_PREFIX/lib/libblst.a" + +echo +echo "Done. Installed to: $ABS_PREFIX" + +FRAGMENT="$PROJECT_DIR/wasm-libs-without-nix.cabal" +cat > "$FRAGMENT" <> "$CABAL_PROJECT" <<'EOF' + +if arch(wasm32) + import: wasm-libs-without-nix.cabal +EOF + echo "Added to $CABAL_PROJECT" + ;; + *) + cat <<'EOF' +Skipped. To enable, append to cabal.project: + +if arch(wasm32) + import: wasm-libs-without-nix.cabal +EOF + ;; + esac +fi