make: isolate wwstage rules in per-target build dirs to fix -j rename race (#29)
The five $(BIN)/*_ww rules all built via `cd $(BIN) && ./ww build ... ; mv $(BIN)/main $@`. The ww driver writes the linker output to <cwd>/<basename(src)> and has no -o flag, so every wwstage rule landed on out/bin/main before its mv. Under `make -j8` the writes and renames interleaved, leaving w6c_ww with a wwdump_ww (or other) payload — silent under -j because the mv usually succeeded against whatever `main` happened to exist at that instant. Symptom downstream: test runs failing with `wwdump: cannot open -o`, recovered only by falling back to -j1. Build each rule in its own $(BIN)/<target>.d/ so the shared `main` name is per-target. Switch -I and source args to $(CURDIR)/... absolute paths and invoke ww by absolute path so the driver's self_dir-relative libwwrt.a lookup still resolves to out/lib. Side files (.combined.ww/.s/.o) land next to source via the parser's source-path stem derivation, not cwd — unaffected. nocc target has similar shape but its 4 builds are sequential recipe lines inside one target so make -j can't parallelize them; not at risk today. 115/115 ok under both -j8 and -j1 from clean. ww2 == ww3 == ww4 byte-id holds.
This commit is contained in:
61
Makefile
61
Makefile
@@ -116,13 +116,14 @@ $(BIN)/wwdump_ww: selfhost/cmd/wwdump/main.ww \
|
||||
lib/os/os.ww lib/time/time.ww lib/strconv/strconv.ww lib/strings/strings.ww lib/bytes/bytes.ww lib/encoding/utf8/utf8.ww lib/ascii/ascii.ww lib/io/io.ww lib/memio/memio.ww lib/fmt/fmt.ww \
|
||||
$(BIN)/ww $(BIN)/w6c $(BIN)/w6a $(BIN)/w6l \
|
||||
$(LIB)/libwwrt.a | $(BIN)
|
||||
cd $(BIN) && ./ww build \
|
||||
-I $$PWD/../../lib/ww \
|
||||
-I $$PWD/../../lib/ww/lex \
|
||||
-I $$PWD/../../lib/ww/parse \
|
||||
-I $$PWD/../../selfhost/cmd/wcc \
|
||||
$$PWD/../../selfhost/cmd/wwdump/main.ww
|
||||
mv $(BIN)/main $@
|
||||
@mkdir -p $(BIN)/wwdump_ww.d
|
||||
cd $(BIN)/wwdump_ww.d && $(CURDIR)/$(BIN)/ww build \
|
||||
-I $(CURDIR)/lib/ww \
|
||||
-I $(CURDIR)/lib/ww/lex \
|
||||
-I $(CURDIR)/lib/ww/parse \
|
||||
-I $(CURDIR)/selfhost/cmd/wcc \
|
||||
$(CURDIR)/selfhost/cmd/wwdump/main.ww
|
||||
mv $(BIN)/wwdump_ww.d/main $@
|
||||
|
||||
# ---- ww-side w6c (compiler port, exercised by 994_w6c_ww) -------------
|
||||
# Thin driver: parse + cgen. The frontend (lex/parse/ast/...) lives in
|
||||
@@ -137,13 +138,14 @@ $(BIN)/w6c_ww: selfhost/cmd/w6c/main.ww \
|
||||
lib/os/os.ww lib/time/time.ww lib/strconv/strconv.ww lib/strings/strings.ww lib/bytes/bytes.ww lib/encoding/utf8/utf8.ww lib/ascii/ascii.ww lib/io/io.ww lib/memio/memio.ww lib/fmt/fmt.ww \
|
||||
$(BIN)/ww $(BIN)/w6c $(BIN)/w6a $(BIN)/w6l \
|
||||
$(LIB)/libwwrt.a | $(BIN)
|
||||
cd $(BIN) && ./ww build \
|
||||
-I $$PWD/../../lib/ww \
|
||||
-I $$PWD/../../lib/ww/lex \
|
||||
-I $$PWD/../../lib/ww/parse \
|
||||
-I $$PWD/../../selfhost/cmd/wcc \
|
||||
$$PWD/../../selfhost/cmd/w6c/main.ww
|
||||
mv $(BIN)/main $@
|
||||
@mkdir -p $(BIN)/w6c_ww.d
|
||||
cd $(BIN)/w6c_ww.d && $(CURDIR)/$(BIN)/ww build \
|
||||
-I $(CURDIR)/lib/ww \
|
||||
-I $(CURDIR)/lib/ww/lex \
|
||||
-I $(CURDIR)/lib/ww/parse \
|
||||
-I $(CURDIR)/selfhost/cmd/wcc \
|
||||
$(CURDIR)/selfhost/cmd/w6c/main.ww
|
||||
mv $(BIN)/w6c_ww.d/main $@
|
||||
|
||||
# ---- ww-side w6a (assembler port, exercised by 991_w6a_ww) ------------
|
||||
# Built like wwdump_ww. Needs -I selfhost/cmd/w6a for the local types/lex/
|
||||
@@ -155,11 +157,12 @@ $(BIN)/w6a_ww: selfhost/cmd/w6a/main.ww selfhost/cmd/w6a/types.ww \
|
||||
lib/os/os.ww lib/time/time.ww \
|
||||
$(BIN)/ww $(BIN)/w6c $(BIN)/w6a $(BIN)/w6l \
|
||||
$(LIB)/libwwrt.a | $(BIN)
|
||||
cd $(BIN) && ./ww build \
|
||||
-I $$PWD/../../selfhost/cmd/w6a \
|
||||
-I $$PWD/../../selfhost/cmd/wcc \
|
||||
$$PWD/../../selfhost/cmd/w6a/main.ww
|
||||
mv $(BIN)/main $@
|
||||
@mkdir -p $(BIN)/w6a_ww.d
|
||||
cd $(BIN)/w6a_ww.d && $(CURDIR)/$(BIN)/ww build \
|
||||
-I $(CURDIR)/selfhost/cmd/w6a \
|
||||
-I $(CURDIR)/selfhost/cmd/wcc \
|
||||
$(CURDIR)/selfhost/cmd/w6a/main.ww
|
||||
mv $(BIN)/w6a_ww.d/main $@
|
||||
|
||||
# ---- ww-side w6l (linker port, exercised by 992_w6l_ww) ---------------
|
||||
# Built like 6a_ww. Needs -I selfhost/cmd/w6l for the local sym/obj/pass/
|
||||
@@ -171,11 +174,12 @@ $(BIN)/w6l_ww: selfhost/cmd/w6l/main.ww selfhost/cmd/w6l/sym.ww \
|
||||
lib/os/os.ww lib/time/time.ww \
|
||||
$(BIN)/ww $(BIN)/w6c $(BIN)/w6a $(BIN)/w6l \
|
||||
$(LIB)/libwwrt.a | $(BIN)
|
||||
cd $(BIN) && ./ww build \
|
||||
-I $$PWD/../../selfhost/cmd/w6l \
|
||||
-I $$PWD/../../selfhost/cmd/wcc \
|
||||
$$PWD/../../selfhost/cmd/w6l/main.ww
|
||||
mv $(BIN)/main $@
|
||||
@mkdir -p $(BIN)/w6l_ww.d
|
||||
cd $(BIN)/w6l_ww.d && $(CURDIR)/$(BIN)/ww build \
|
||||
-I $(CURDIR)/selfhost/cmd/w6l \
|
||||
-I $(CURDIR)/selfhost/cmd/wcc \
|
||||
$(CURDIR)/selfhost/cmd/w6l/main.ww
|
||||
mv $(BIN)/w6l_ww.d/main $@
|
||||
|
||||
# ---- ww-side ww driver (exercised by 993_ww_ww) ------------------------
|
||||
# The driver pulls in lib/os (default search path) and selfhost/cmd/wcc
|
||||
@@ -184,10 +188,11 @@ $(BIN)/ww_ww: selfhost/cmd/ww/main.ww selfhost/cmd/wcc/mem.ww lib/os/os.ww \
|
||||
lib/time/time.ww lib/strconv/strconv.ww \
|
||||
$(BIN)/ww $(BIN)/w6c $(BIN)/w6a $(BIN)/w6l \
|
||||
$(LIB)/libwwrt.a | $(BIN)
|
||||
cd $(BIN) && ./ww build \
|
||||
-I $$PWD/../../selfhost/cmd/wcc \
|
||||
$$PWD/../../selfhost/cmd/ww/main.ww
|
||||
mv $(BIN)/main $@
|
||||
@mkdir -p $(BIN)/ww_ww.d
|
||||
cd $(BIN)/ww_ww.d && $(CURDIR)/$(BIN)/ww build \
|
||||
-I $(CURDIR)/selfhost/cmd/wcc \
|
||||
$(CURDIR)/selfhost/cmd/ww/main.ww
|
||||
mv $(BIN)/ww_ww.d/main $@
|
||||
|
||||
# ---- runtime (libwwrt.a, assembled by our own w6a) ---------------------
|
||||
$(OBJ)/rt/%.o: rt/%.s $(BIN)/w6a | $(OBJ)/rt
|
||||
|
||||
Reference in New Issue
Block a user