#!/usr/bin/env bash # Instala o toolchain GHC wasm (ghc-wasm-meta) em artifacts/tools/ghc-wasm-9.12, nunca no sistema. O repositorio ghc-wasm-meta # vem do commit 8079eb96 (tarball com sha256 conferido); o setup.sh dele baixa cada ferramenta (wasi-sdk, node, binaryen, # wasmtime, cabal, o bindist do GHC 9.12) de URLs fixas listadas no autogen.json, com hash. O setup.sh nao confere esses hashes, entao # aqui o "curl" que ele usa e substituido por uma funcao que confere o hash de autogen.json de cada arquivo baixado. # # src/FredGames.Bundler/Builds/lambdahack/install-ghc-wasm.sh set -euo pipefail META_COMMIT=8079eb96bbc63823d99ad8acaff0765532625474 META_SHA256=4a1d62b2bea9f7c811cfad3d6e0e3ff6d000dfc53b2ea43dfcb3ae7c51345220 FLAVOUR=9.12 here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" root="$(git -C "$here" rev-parse --show-toplevel 2>/dev/null || pwd)" prefix="$root/artifacts/tools/ghc-wasm-$FLAVOUR" cache="$root/artifacts/build/cache" mkdir -p "$cache" [ -f "$prefix/env" ] && { echo "ja instalado em $prefix"; exit 0; } if [ ! -f "$cache/ghc-wasm-meta-${META_COMMIT:0:8}.tar.gz" ]; then curl -fsSL --retry 4 "https://gitlab.haskell.org/haskell-wasm/ghc-wasm-meta/-/archive/$META_COMMIT/m.tar.gz" -o "$cache/ghc-wasm-meta-${META_COMMIT:0:8}.tar.gz" fi echo "$META_SHA256 $cache/ghc-wasm-meta-${META_COMMIT:0:8}.tar.gz" | shasum -a 256 -c - meta="$root/artifacts/build/ghc-wasm-meta" rm -rf "$meta"; mkdir -p "$meta" tar xzf "$cache/ghc-wasm-meta-${META_COMMIT:0:8}.tar.gz" -C "$meta" --strip-components 1 export META_JSON="$meta/autogen.json" verifying_curl() { # chama o curl de verdade e confere o hash de autogen.json para a URL baixada com -o command curl "$@" || return $? local url="" out="" prev="" for a in "$@"; do [ "$prev" = "-o" ] && out="$a" case "$a" in http*) url="$a";; esac prev="$a" done [ -n "$out" ] && [ -n "$url" ] || return 0 local want want="$(jq -r --arg u "$url" '[.[] | select(.url == $u) | .hash][0] // empty' "$META_JSON")" if [ -z "$want" ]; then echo "SEM HASH PARA $url" >&2; return 1; fi local algo="${want%%-*}" b64="${want#*-}" got got="$(openssl dgst -"$algo" -binary "$out" | openssl base64 -A)" if [ "$got" != "$b64" ]; then echo "HASH DIFERENTE: $url" >&2; return 1; fi echo "hash ok: ${url##*/}" >&2 } curl() { verifying_curl "$@"; } export -f verifying_curl curl PREFIX="$prefix" FLAVOUR="$FLAVOUR" bash "$meta/setup.sh" echo "Instalado em $prefix. Para usar: source $prefix/env"