Files
2026-06-16 15:10:20 -04:00

122 lines
5.0 KiB
Makefile

# WasmForge Makefile
# Ensures build_assets.tar.gz is regenerated before compiling.
.DELETE_ON_ERROR:
BINARY := wasmforge
ASSETS := internal/build/build_assets.tar.gz
ASSET_SRC := internal/hostmod internal/runtime internal/names wazero
# Source files that feed into the archive.
ASSET_DEPS := $(shell find $(ASSET_SRC) \( -name '*.go' -not -name '*_test.go' \) -o -name '*.s' -o -name 'go.mod' -o -name 'go.sum' 2>/dev/null)
# Docker build environment for .NET (NativeAOT-WASI) targets — see
# Dockerfile.build for details.
DOCKER_IMAGE := wasmforge/build:latest
DOCKER_OUT_DIR ?= $(CURDIR)/out
DOCKER_SRC ?=
DOCKER_PROJECT ?= seatbelt
.PHONY: all build clean generate docker-build docker-run test-parity-seatbelt test-parity-rubeus test-parity-sharpdpapi test-parity-certify test-parity-sharpup test-parity-sharpview test-parity-all verify-ast-equivalence
all: build
# Regenerate build assets archive when source files change.
$(ASSETS): $(ASSET_DEPS)
GOWORK=off go run ./cmd/gen-build-assets
generate: $(ASSETS)
# Build wasmforge binary, regenerating assets if stale.
build: $(ASSETS)
GOWORK=off go build -trimpath -o $(BINARY) ./cmd/wasmforge
clean:
rm -f $(BINARY) $(ASSETS)
rm -rf ~/.wasmforge/cache/
# ── Docker build environment ────────────────────────────────────────────
# Builds the wasmforge/build image used for .NET (NativeAOT-WASI) targets.
# The image bundles Go 1.25.3, .NET SDK 10, WASI SDK 24, and the
# wasm-component-ld bypass wrapper required by our env imports.
docker-build:
docker build -f Dockerfile.build -t $(DOCKER_IMAGE) .
# Forge a .NET project as a Windows PE via the Docker image. Mount this
# wasmforge source tree as /wasmforge and the target project as /src.
#
# Example:
# make docker-run DOCKER_SRC=/tmp/seatbelt-fresh DOCKER_PROJECT=seatbelt
# → out/seatbelt.exe
#
# DOCKER_SRC defaults to the seatbelt-fresh dir in /tmp (the canonical
# upstream Seatbelt source tree we ship through).
docker-run:
@if [ -z "$(DOCKER_SRC)" ]; then \
echo "ERROR: DOCKER_SRC must be set, e.g. DOCKER_SRC=/tmp/seatbelt-fresh"; \
echo " (the path to the .NET project source tree on the host)"; \
exit 2; \
fi
@mkdir -p $(DOCKER_OUT_DIR)
docker run --rm \
-v "$(CURDIR):/wasmforge:ro" \
-v "$(DOCKER_SRC):/src:ro" \
-v "$(DOCKER_OUT_DIR):/out" \
$(DOCKER_IMAGE) $(DOCKER_PROJECT)
# ── Parity test harness ─────────────────────────────────────────────────
# Per-tool parity sweep: pushes the built .exe to the Win11 lab, runs each
# command listed in test/parity/<tool>/, normalizes the output, and diffs
# against the committed golden baselines under testdata/parity-baselines/.
#
# WASMFORGE_TEST_BINARY can override the default binary path.
# Tests SKIP cleanly when the lab is unreachable (not FAIL).
#
# GOWORK=off because test/ is a separate Go module (github.com/praetorian-inc/wftest)
# that is intentionally not in the parent go.work use directive.
test-parity-seatbelt:
cd test && \
WASMFORGE_TEST_BINARY=$${WASMFORGE_TEST_BINARY:-$(DOCKER_OUT_DIR)/seatbelt.exe} \
GOWORK=off go test -tags parity ./parity/seatbelt/ -v
# Per-tool parity sweep for Rubeus. Same structure as Seatbelt.
test-parity-rubeus:
cd test && \
WASMFORGE_TEST_BINARY=$${WASMFORGE_TEST_BINARY:-$(DOCKER_OUT_DIR)/rubeus.exe} \
GOWORK=off go test -tags parity ./parity/rubeus/ -v
test-parity-sharpdpapi:
cd test && \
WASMFORGE_TEST_BINARY=$${WASMFORGE_TEST_BINARY:-$(DOCKER_OUT_DIR)/sharpdpapi.exe} \
GOWORK=off go test -tags parity ./parity/sharpdpapi/ -v
test-parity-certify:
cd test && \
WASMFORGE_TEST_BINARY=$${WASMFORGE_TEST_BINARY:-$(DOCKER_OUT_DIR)/certify.exe} \
GOWORK=off go test -tags parity ./parity/certify/ -v
test-parity-sharpup:
cd test && \
WASMFORGE_TEST_BINARY=$${WASMFORGE_TEST_BINARY:-$(DOCKER_OUT_DIR)/sharpup.exe} \
GOWORK=off go test -tags parity ./parity/sharpup/ -v
test-parity-sharpview:
cd test && \
WASMFORGE_TEST_BINARY=$${WASMFORGE_TEST_BINARY:-$(DOCKER_OUT_DIR)/sharpview.exe} \
GOWORK=off go test -tags parity ./parity/sharpview/ -v
# Aggregate parity target — runs all 6 tool sweeps.
test-parity-all: test-parity-seatbelt test-parity-rubeus test-parity-sharpdpapi test-parity-certify test-parity-sharpup test-parity-sharpview
# ── AST patcher equivalence verification ────────────────────────────────────
# Verify that the AST patcher produces byte-identical output to the legacy text
# patcher for every .cs file it touches. Use this to gate B.2+ rule migrations.
#
# Usage: make verify-ast-equivalence SRC=/tmp/seatbelt-fresh
#
verify-ast-equivalence:
@if [ -z "$(SRC)" ]; then echo "ERROR: SRC must be set, e.g. SRC=/tmp/seatbelt-fresh"; exit 2; fi
@rm -rf /tmp/wasmforge-ast-verify
@cp -r $(SRC) /tmp/wasmforge-ast-verify
GOWORK=off go run ./cmd/wasmforge dotnet-patch --ast-verify /tmp/wasmforge-ast-verify