mirror of
https://github.com/praetorian-inc/wasmforge
synced 2026-06-22 22:52:31 +00:00
122 lines
5.0 KiB
Makefile
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
|