#!/usr/bin/env bash # Builds igneum-node-windows.zip (run your own Igneum node on a Windows PC) on the Mac. # Contents: START-NODE.bat, start-node.ps1, BUILD-NODE.bat, build-node.ps1, ALLOW-FIREWALL.bat, allow-firewall.ps1, # README.txt, upload-log.bat (from windows-miner/), WINDOWS-MINER.md, igneum-miner.exe (cross-compiled, the status # reader), igneumd.exe when a cross-compiled one exists, and src.zip: a `git archive` of the node worktree's HEAD under # vendor/igneum-node/ plus igneum-pow/ from this repository's HEAD (the fork depends on it by relative path), so the PC # can build the node with BUILD-NODE.bat without any GitHub access. # Usage: windows-node/make-package.sh [node worktree, default vendor/igneum-node-win] [output zip, default ~/Desktop/igneum-node-windows.zip] set -euo pipefail HERE="$(cd "$(dirname "$0")" && pwd)" ROOT="$(cd "$HERE/../.." && pwd)" NODE="${1:-$ROOT/vendor/igneum-node-win}" OUT="${2:-$HOME/Desktop/igneum-node-windows.zip}" [ -f "$NODE/Cargo.toml" ] || { echo "no node worktree at $NODE" >&2; exit 1; } EXE="$NODE/target/x86_64-pc-windows-gnu/release/igneumd.exe" MINER="$NODE/target/x86_64-pc-windows-gnu/release/igneum-miner.exe" STAGE="$(mktemp -d)/igneum-node-windows" mkdir -p "$STAGE/srcstage" cp "$HERE/START-NODE.bat" "$HERE/start-node.ps1" "$HERE/BUILD-NODE.bat" "$HERE/build-node.ps1" \ "$HERE/ALLOW-FIREWALL.bat" "$HERE/allow-firewall.ps1" "$HERE/README.txt" "$STAGE/" cp "$ROOT/proto-cuda/windows-miner/upload-log.bat" "$STAGE/" cp "$ROOT/proto-cuda/WINDOWS-MINER.md" "$STAGE/" MINGW=/opt/homebrew/opt/mingw-w64/toolchain-x86_64/x86_64-w64-mingw32 if [ -f "$EXE" ]; then cp "$EXE" "$STAGE/igneumd.exe"; echo "igneumd.exe: $(ls -la "$EXE" | awk '{print $5}') bytes (cross-compiled)" # The exe imports libstdc++-6.dll (rustc passes the cc crate's -lstdc++ as -Bdynamic, so -static does not cover it); # that DLL needs libgcc_s_seh-1.dll and libwinpthread-1.dll. Ship the three next to the exe (GCC runtime exception). IMPORTS="$(x86_64-w64-mingw32-objdump -p "$EXE" 2>/dev/null | grep 'DLL Name: lib' || true)" # no grep -q: pipefail would turn objdump's SIGPIPE into a miss if [ -n "$IMPORTS" ]; then for dll in lib/libstdc++-6.dll lib/libgcc_s_seh-1.dll bin/libwinpthread-1.dll; do [ -f "$MINGW/$dll" ] || { echo "missing $MINGW/$dll" >&2; exit 1; } cp "$MINGW/$dll" "$STAGE/" x86_64-w64-mingw32-strip "$STAGE/$(basename "$dll")" 2>/dev/null || true # the toolchain's libstdc++-6.dll carries 27 MB of debug symbols done echo "mingw runtime DLLs added next to the exe: libstdc++-6.dll libgcc_s_seh-1.dll libwinpthread-1.dll" fi else echo "no cross-compiled igneumd.exe at $EXE; the package builds on the PC"; fi if [ -f "$MINER" ]; then cp "$MINER" "$STAGE/igneum-miner.exe"; else echo "warning: no cross-compiled igneum-miner.exe at $MINER (BUILD-NODE.bat builds it too)"; fi # the source snapshot NODE_HEAD="$(git -C "$NODE" rev-parse HEAD)" ROOT_HEAD="$(git -C "$ROOT" rev-parse HEAD)" git -C "$NODE" archive --format=tar --prefix=vendor/igneum-node/ HEAD | tar -x -C "$STAGE/srcstage" git -C "$ROOT" archive --format=tar HEAD igneum-pow | tar -x -C "$STAGE/srcstage" { echo "igneum node source snapshot, made $(date -u +%Y-%m-%dT%H:%M:%SZ)" echo "vendor/igneum-node: branch $(git -C "$NODE" rev-parse --abbrev-ref HEAD) commit $NODE_HEAD ($(git -C "$NODE" log -1 --format=%s))" echo "igneum-pow: igneum commit $ROOT_HEAD" echo "build: cd vendor/igneum-node && cargo build --release -p kaspad --features igneum-pow (binary: target/release/igneumd)" } > "$STAGE/srcstage/SNAPSHOT.txt" (cd "$STAGE/srcstage" && zip -qr "../src.zip" .) rm -rf "$STAGE/srcstage" # CRLF for the files Windows tools read as text for f in "$STAGE"/*.bat "$STAGE/README.txt"; do perl -pi -e 's/\r?\n/\r\n/' "$f"; done rm -f "$OUT" (cd "$(dirname "$STAGE")" && zip -qr "$OUT" "$(basename "$STAGE")") ls -la "$OUT" unzip -l "$OUT" | tail -n +4 | awk '{print $1, $4}' | sed '/^ *$/d'