make: wire test-run into make test (pre-push reject gate)

test-run drives runww.ww over the test/wcc/data/*/case.ww behavior and
//ww:error cases, but was not a prerequisite of any aggregate, so the
reject surface was ungated. With runww's arm now dual-stage, gate it.

Added to the pre-push `test` target only -- not test-unit, not the
test-commit content-key tier. runww execve's its children with nil envp,
so a WW_PKGCACHE override cannot reach them; they fall back to the default
out/.pkgcache that $(TESTS) and the byte-id gates also use. A normal
prereq would let make -j overlap test-run with those writers, so test-run
carries an order-only prereq (| $(TESTS) test-lang test-lang-byteid) and
is scheduled strictly after every default-cache writer. No cache
isolation is added: it would be inert under nil envp, and the ordering
prevents the race.

True per-run cache isolation stays blocked on an os envp() forwarder.
This commit is contained in:
2026-06-22 15:34:36 +09:00
parent d48b53d04d
commit e57fcf230b

View File

@@ -3256,7 +3256,7 @@ sizelint:
peellint:
@sh tools/peellint
test: all sizelint peellint $(TESTS) test-lang test-lang-byteid
test: all sizelint peellint $(TESTS) test-lang test-lang-byteid test-run
@WW=$(BIN)/ww BIN=$(BIN) sh test/run
test-unit: all sizelint peellint $(TESTS)
@@ -3264,12 +3264,22 @@ test-unit: all sizelint peellint $(TESTS)
# ---- test-run: ww-native behavior harness (fold 2) ---------------------
# Drives test/runww.ww over every test/wcc/data/<name>/case.ww, building
# and running each case through the cstage `ww` driver (T1) and checking
# its leading `//ww:` directive. The harness prints `runww: all ok` and exits
# 0 only if every case passes; the target propagates that exit code. NOT
# yet wired into `make test` (fold 6). See test/runww.ww header.
# and running each case through the cstage `ww` driver (T1, plus the ERROR
# arm's wwstage w6c_ww leg) and checking its leading `//ww:` directive. The
# harness prints `runww: all ok` and exits 0 only if every case passes; the
# target propagates that exit code. Wired into `make test` (pre-push only).
#
# runww execve's its child `ww`/`w6c_ww` with a NIL envp, so a WW_PKGCACHE=
# override can't reach them — the children write the DEFAULT out/.pkgcache,
# the same cache the recipe's $(TESTS)/byte-id gates use. The order-only
# prereqs (after `|`) force `make test -j` to schedule test-run strictly
# LAST among the prereqs, so it cannot run concurrently with any default-
# cache writer (`all`'s selfhost builds are already ordered via the normal
# `all` prereq; test-lang/test-lang-byteid use isolated caches, but ordering
# after them is belt-and-suspenders). The recipe's 990-997/pkgcache default-
# cache tests run only after ALL prereqs complete, so no overlap there.
RUNWW_CASES = $(wildcard test/wcc/data/*/case.ww)
test-run: all
test-run: all | $(TESTS) test-lang test-lang-byteid
@BIN=$(BIN) $(BIN)/ww run test/runww.ww $(RUNWW_CASES)
# ---- test-lang: in-language @test behavior corpus (fold 2) -------------