Wwstage matchscrutt now mirrors cstage's typed-AST scrutinee-type lookup for module-qualified mod.fn(...) callees, restoring per-arm tag dispatch on cross-module shadowed-name 4-arm matches. Class A runtime miscompile, silent across collectfnrets shadowing — was the 8th unmask of session 5. Pre-fix: wwstage's matchscrutt N_DOT branch (cgenutil.ww:2061) called `fnretlookup(c, callee.str)` — name-only resolution. collectfnrets prepends to c.fnrets, so when a caller fn (e.g. lib/strings's `next`) shadows a callee fn-name (utf8's `next`), the prepend chain has the caller's narrower tagged return at the head. matchscrutt then resolved the scrutinee type to the WRONG tagged shape, and variantindex lookups for arms past the shadowing caller's variant count returned -1 → want=0 → match-arm `CMPQ $0, AX` for arms 2 and 3 on a (rune | done | more | invalid) probe. Effect: arms 2/3 silently unreachable even when the runtime tag matched, falling through to default. Cstage gets the scrutinee type via the checker-set callee type on the N_DOT node, so picks the correct utf8.next return shape. Polarity catalog: wwstage UNDER — fnretlookup missing module- preferring discipline. **Third leaf in the same trio**: #27 (aliaslookupmod), #28 (fnparamslookupmod), #31 (fnretlookupmod). Pattern is recurring; full graduation of all leaf-name lookups to same-module-first is a candidate for STATUS-3 task #1 variant-widen consolidation refactor (deferred to next session opener per rob). Fix: new fnretlookupmod helper in cgen.ww (same-module-first walk, fallback to existing first-match — cell-for-cell mirror of fnparamslookupmod from #28). matchscrutt N_DOT branch extracts `cmod` from callee.lhs.str and routes through the helper. Other 13 fnretlookup callsites untouched per #28's "fix only what has a real consumer" discipline. fnret.fmod field + collectfnrets f.fmod assignment already landed in #28. Surfaced by lib/strings commit-2 pre-flight: probe iter+next shape calls utf8.next; the probe's own `fn next` shadows utf8.next at the c.fnrets head. Bootstrap-stable because no selfhost-corpus path shadows a fn name across modules with a wider tagged return on the shadowed side; lib/strings.iter pulling utf8.next under wwstage was the first exerciser. Filed follow-up (NOT in scope here): #32 wwstage runtime stomp on utf8.next via *iterator caller — separate Class A surfaced by 929 direct utf8.next regression row design. #31's fix is correct in isolation; #32 blocks lib/strings commit 2 (#30). Tests: - 728_match_4arm_cross_module pins distinct CMPQ $K, AX tags in TEXT b.next via bitmap covering [0..arms), robust to arm ordering. Three cross-module shadowed-name shapes × cmp -s byte-id. Sentinel-flip-verified: revert fnretlookupmod route → 3/6 wwstage fixtures fail "arm K repeats tag $0 (collapse)". - 929_match_4arm_cross_module_run runtime-pins 6 rows × 2 stages per-arm exit-code shape: 3/4/5/6-arm boundary, mixed (i32|str|rune|u8), reverse arm-order in match source. Confirms bug follows fnretlookup-resolved type, not match source order. 102/102 ok. 995_self_rebuild stays green (ww2==ww3==ww4 byte-id).
905 lines
35 KiB
Makefile
905 lines
35 KiB
Makefile
# ww — Plan 9-organised toolchain. POSIX make.
|
|
#
|
|
# Build a small static frontend library libwcc.a and the user-facing
|
|
# driver `ww`. Per-target tools (w6c, w6a, w6l) and the runtime are added
|
|
# in their own phases. Everything lands under out/.
|
|
|
|
PREFIX ?= /usr/local
|
|
CC ?= cc
|
|
AR ?= ar
|
|
CFLAGS ?= -O0 -g -Wall -Wextra -Wpedantic -Wno-unused-parameter
|
|
CFLAGS += -std=c99 -fno-strict-aliasing -D_POSIX_C_SOURCE=200809L
|
|
INCS = -Icmd/wcc
|
|
|
|
OUT = out
|
|
BIN = $(OUT)/bin
|
|
LIB = $(OUT)/lib
|
|
OBJ = $(OUT)/obj
|
|
|
|
WCC_SRC = cmd/wcc/mem.c cmd/wcc/err.c cmd/wcc/tok.c cmd/wcc/lex.c \
|
|
cmd/wcc/ast.c cmd/wcc/parse.c cmd/wcc/sym.c cmd/wcc/type.c \
|
|
cmd/wcc/check.c
|
|
WCC_OBJ = $(WCC_SRC:cmd/wcc/%.c=$(OBJ)/wcc/%.o)
|
|
|
|
WW_SRC = cmd/ww/main.c
|
|
WW_OBJ = $(WW_SRC:cmd/ww/%.c=$(OBJ)/ww/%.o)
|
|
|
|
WD_SRC = cmd/wwdump/main.c
|
|
WD_OBJ = $(WD_SRC:cmd/wwdump/%.c=$(OBJ)/wwdump/%.o)
|
|
|
|
W6C_SRC = cmd/w6c/main.c cmd/w6c/cgen.c cmd/w6c/txt.c cmd/w6c/swt.c \
|
|
cmd/w6c/peep.c cmd/w6c/reg.c
|
|
W6C_OBJ = $(W6C_SRC:cmd/w6c/%.c=$(OBJ)/w6c/%.o)
|
|
|
|
W6A_SRC = cmd/w6a/main.c cmd/w6a/lex.c cmd/w6a/parse.c cmd/w6a/asm.c cmd/w6a/obj.c
|
|
W6A_OBJ = $(W6A_SRC:cmd/w6a/%.c=$(OBJ)/w6a/%.o)
|
|
|
|
W6L_SRC = cmd/w6l/main.c cmd/w6l/obj.c cmd/w6l/sym.c cmd/w6l/pass.c cmd/w6l/out.c \
|
|
cmd/w6l/dyn.c cmd/w6l/dynout.c
|
|
W6L_OBJ = $(W6L_SRC:cmd/w6l/%.c=$(OBJ)/w6l/%.o)
|
|
|
|
RT_S = rt/start.s rt/syscall.s rt/alloc.s rt/streq.s rt/abort.s
|
|
RT_WW = rt/ensure.ww
|
|
RT_OBJ = $(RT_S:rt/%.s=$(OBJ)/rt/%.o) $(RT_WW:rt/%.ww=$(OBJ)/rt/%.o)
|
|
|
|
# Cstage: one-time C bootstrap (see BOOTSTRAP.md). Built by `cc`.
|
|
# Goes away at v1.0, replaced by a checked-in stage-0 binary.
|
|
CSTAGE_BINS = $(BIN)/ww $(BIN)/w6c $(BIN)/w6a $(BIN)/w6l $(BIN)/wwdump
|
|
|
|
# Wwstage: ww-rewritten toolchain. Built by Cstage today; will be the
|
|
# only toolchain after Phase 10 closeout. Byte-identical to Cstage
|
|
# (tests 990-994).
|
|
WWSTAGE_BINS = $(BIN)/wwdump_ww $(BIN)/w6c_ww $(BIN)/w6a_ww $(BIN)/w6l_ww $(BIN)/ww_ww
|
|
|
|
BINS = $(CSTAGE_BINS) $(WWSTAGE_BINS)
|
|
LIBS = $(LIB)/libwcc.a $(LIB)/libwwrt.a
|
|
|
|
all: cstage wwstage
|
|
|
|
cstage: $(CSTAGE_BINS) $(LIBS)
|
|
wwstage: $(WWSTAGE_BINS)
|
|
|
|
# ---- libwcc.a ----------------------------------------------------------
|
|
$(LIB)/libwcc.a: $(WCC_OBJ) | $(LIB)
|
|
$(AR) rcs $@ $(WCC_OBJ)
|
|
|
|
$(OBJ)/wcc/%.o: cmd/wcc/%.c cmd/wcc/ww.h | $(OBJ)/wcc
|
|
$(CC) $(CFLAGS) $(INCS) -c -o $@ $<
|
|
|
|
# ---- ww driver ---------------------------------------------------------
|
|
$(BIN)/ww: $(WW_OBJ) $(LIB)/libwcc.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $(WW_OBJ) -L$(LIB) -lwcc
|
|
|
|
$(OBJ)/ww/%.o: cmd/ww/%.c cmd/wcc/ww.h | $(OBJ)/ww
|
|
$(CC) $(CFLAGS) $(INCS) -c -o $@ $<
|
|
|
|
# ---- wwdump (lex/AST diff anchor) --------------------------------------
|
|
$(BIN)/wwdump: $(WD_OBJ) $(LIB)/libwcc.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $(WD_OBJ) -L$(LIB) -lwcc
|
|
|
|
$(OBJ)/wwdump/%.o: cmd/wwdump/%.c cmd/wcc/ww.h | $(OBJ)/wwdump
|
|
$(CC) $(CFLAGS) $(INCS) -c -o $@ $<
|
|
|
|
# ---- w6c amd64 compiler ------------------------------------------------
|
|
$(BIN)/w6c: $(W6C_OBJ) $(LIB)/libwcc.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $(W6C_OBJ) -L$(LIB) -lwcc
|
|
|
|
$(OBJ)/w6c/%.o: cmd/w6c/%.c cmd/w6c/gc.h cmd/w6c/6.out.h cmd/wcc/ww.h | $(OBJ)/w6c
|
|
$(CC) $(CFLAGS) $(INCS) -Icmd/w6c -c -o $@ $<
|
|
|
|
# ---- w6a amd64 assembler -----------------------------------------------
|
|
$(BIN)/w6a: $(W6A_OBJ) | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $(W6A_OBJ)
|
|
|
|
$(OBJ)/w6a/%.o: cmd/w6a/%.c cmd/w6a/a.h cmd/w6c/6.out.h | $(OBJ)/w6a
|
|
$(CC) $(CFLAGS) -Icmd/w6a -Icmd/w6c -c -o $@ $<
|
|
|
|
# ---- w6l amd64 linker --------------------------------------------------
|
|
$(BIN)/w6l: $(W6L_OBJ) | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $(W6L_OBJ)
|
|
|
|
$(OBJ)/w6l/%.o: cmd/w6l/%.c cmd/w6l/l.h | $(OBJ)/w6l
|
|
$(CC) $(CFLAGS) -Icmd/w6l -c -o $@ $<
|
|
|
|
# ---- ww-side wwdump (the lexer port, exercised by 990_selfhost) --------
|
|
# Built via the user-facing ww driver. The introspection ports (lex,
|
|
# tok, ast, parse, typ, sym) live in lib/ww/; the compiler-only bits
|
|
# (mem, check, cgen*) stay in selfhost/cmd/wcc/. Output named wwdump_ww
|
|
# to avoid colliding with the C-side wwdump in $(BIN).
|
|
$(BIN)/wwdump_ww: selfhost/cmd/wwdump/main.ww \
|
|
lib/ww/lex/lex.ww lib/ww/lex/tok.ww lib/ww/ast.ww \
|
|
lib/ww/parse/parse.ww lib/ww/parse/expr.ww lib/ww/parse/stmt.ww lib/ww/parse/decl.ww lib/ww/typ.ww lib/ww/sym.ww \
|
|
selfhost/cmd/wcc/mem.ww selfhost/cmd/wcc/check.ww \
|
|
selfhost/cmd/wcc/cgen.ww selfhost/cmd/wcc/cgenexpr.ww \
|
|
selfhost/cmd/wcc/cgenstmt.ww selfhost/cmd/wcc/cgenutil.ww \
|
|
selfhost/cmd/wcc/cgendecl.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/../../lib/encoding/utf8 \
|
|
-I $$PWD/../../selfhost/cmd/wcc \
|
|
$$PWD/../../selfhost/cmd/wwdump/main.ww
|
|
mv $(BIN)/main $@
|
|
|
|
# ---- ww-side w6c (compiler port, exercised by 994_w6c_ww) -------------
|
|
# Thin driver: parse + cgen. The frontend (lex/parse/ast/...) lives in
|
|
# lib/ww/; cgen + check live in selfhost/cmd/wcc/.
|
|
$(BIN)/w6c_ww: selfhost/cmd/w6c/main.ww \
|
|
lib/ww/lex/lex.ww lib/ww/lex/tok.ww lib/ww/ast.ww \
|
|
lib/ww/parse/parse.ww lib/ww/parse/expr.ww lib/ww/parse/stmt.ww lib/ww/parse/decl.ww lib/ww/typ.ww lib/ww/sym.ww \
|
|
selfhost/cmd/wcc/mem.ww selfhost/cmd/wcc/check.ww \
|
|
selfhost/cmd/wcc/cgen.ww selfhost/cmd/wcc/cgenexpr.ww \
|
|
selfhost/cmd/wcc/cgenstmt.ww selfhost/cmd/wcc/cgenutil.ww \
|
|
selfhost/cmd/wcc/cgendecl.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/../../lib/encoding/utf8 \
|
|
-I $$PWD/../../selfhost/cmd/wcc \
|
|
$$PWD/../../selfhost/cmd/w6c/main.ww
|
|
mv $(BIN)/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/
|
|
# parse/asm/obj modules and -I selfhost/cmd/wcc to find `mem`.
|
|
$(BIN)/w6a_ww: selfhost/cmd/w6a/main.ww selfhost/cmd/w6a/types.ww \
|
|
selfhost/cmd/w6a/lex.ww selfhost/cmd/w6a/parse.ww \
|
|
selfhost/cmd/w6a/asm.ww selfhost/cmd/w6a/obj.ww \
|
|
selfhost/cmd/wcc/mem.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 $@
|
|
|
|
# ---- 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/
|
|
# out modules and -I selfhost/cmd/wcc to find `mem`.
|
|
$(BIN)/w6l_ww: selfhost/cmd/w6l/main.ww selfhost/cmd/w6l/sym.ww \
|
|
selfhost/cmd/w6l/obj.ww selfhost/cmd/w6l/dyn.ww \
|
|
selfhost/cmd/w6l/pass.ww selfhost/cmd/w6l/dynout.ww \
|
|
selfhost/cmd/w6l/out.ww selfhost/cmd/wcc/mem.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 $@
|
|
|
|
# ---- ww-side ww driver (exercised by 993_ww_ww) ------------------------
|
|
# The driver pulls in lib/os (default search path) and selfhost/cmd/wcc
|
|
# (for the bump arena). It then orchestrates w6c/w6a/w6l like the C driver.
|
|
$(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 $@
|
|
|
|
# ---- runtime (libwwrt.a, assembled by our own w6a) ---------------------
|
|
$(OBJ)/rt/%.o: rt/%.s $(BIN)/w6a | $(OBJ)/rt
|
|
$(BIN)/w6a -o $@ $<
|
|
|
|
# ww-side runtime helpers (rt/*.ww): compile via w6c to .s, then w6a.
|
|
# Each .ww module is standalone — uses @symbol FFI for rt_alloc/rt_free
|
|
# rather than `use os;` so no bundling is required.
|
|
$(OBJ)/rt/%.s: rt/%.ww $(BIN)/w6c | $(OBJ)/rt
|
|
$(BIN)/w6c $< > $@
|
|
$(OBJ)/rt/%.o: $(OBJ)/rt/%.s $(BIN)/w6a | $(OBJ)/rt
|
|
$(BIN)/w6a -o $@ $<
|
|
|
|
$(LIB)/libwwrt.a: $(RT_OBJ) | $(LIB)
|
|
$(AR) rcs $@ $(RT_OBJ)
|
|
|
|
# ---- directories -------------------------------------------------------
|
|
$(BIN) $(LIB) $(OBJ)/wcc $(OBJ)/ww $(OBJ)/wwdump $(OBJ)/w6c $(OBJ)/w6a $(OBJ)/w6l $(OBJ)/rt:
|
|
mkdir -p $@
|
|
|
|
# ---- tests -------------------------------------------------------------
|
|
# Each phase adds a $(BIN)/test_<name> target; the runner walks them.
|
|
TESTS = $(BIN)/test_smoke $(BIN)/test_lex $(BIN)/test_parse $(BIN)/test_check \
|
|
$(BIN)/test_w6c $(BIN)/test_w6a $(BIN)/test_dataw $(BIN)/test_datar \
|
|
$(BIN)/test_w6l $(BIN)/test_data_link \
|
|
$(BIN)/test_arch \
|
|
$(BIN)/test_e2e $(BIN)/test_ffi $(BIN)/test_dyn $(BIN)/test_stdlib \
|
|
$(BIN)/test_at_test $(BIN)/test_let_global $(BIN)/test_def_neg_global \
|
|
$(BIN)/test_int_cast_signed $(BIN)/test_dot_chain \
|
|
$(BIN)/test_amp_dot $(BIN)/test_arr_elem_field \
|
|
$(BIN)/test_arr_elem_field_write \
|
|
$(BIN)/test_dot_str_chained_arg \
|
|
$(BIN)/test_dot_slice_arg \
|
|
$(BIN)/test_dot_tagged_source \
|
|
$(BIN)/test_tagged_store_intlit \
|
|
$(BIN)/test_match_bind_struct \
|
|
$(BIN)/test_modtype_leaf_collision \
|
|
$(BIN)/test_samemod_prefer \
|
|
$(BIN)/test_cgreturn_struct \
|
|
$(BIN)/test_cgassign_struct \
|
|
$(BIN)/test_dot_explicit_deref \
|
|
$(BIN)/test_nested_structlit \
|
|
$(BIN)/test_dot_structlit \
|
|
$(BIN)/test_nested_call_rhs \
|
|
$(BIN)/test_fnlabel_mangle \
|
|
$(BIN)/test_cgreturn_variant_zero \
|
|
$(BIN)/test_arrlit_str_full \
|
|
$(BIN)/test_redecl \
|
|
$(BIN)/test_struct_field_index \
|
|
$(BIN)/test_tagged_return_scratch \
|
|
$(BIN)/test_tagged_widen_f64 \
|
|
$(BIN)/test_match_spill_pointer_payload \
|
|
$(BIN)/test_struct_byval_param \
|
|
$(BIN)/test_struct_multi_return_scratch \
|
|
$(BIN)/test_signed_data_emit \
|
|
$(BIN)/test_signed_data_emit_run \
|
|
$(BIN)/test_tagged_call_arg \
|
|
$(BIN)/test_tagged_call_arg_run \
|
|
$(BIN)/test_sret_struct_return \
|
|
$(BIN)/test_sret_struct_return_run \
|
|
$(BIN)/test_match_slice_variant \
|
|
$(BIN)/test_match_slice_variant_run \
|
|
$(BIN)/test_composite_call_arg \
|
|
$(BIN)/test_composite_call_arg_run \
|
|
$(BIN)/test_letdecl_zeroinit \
|
|
$(BIN)/test_nested_if_labels \
|
|
$(BIN)/test_alias_leaf_collision \
|
|
$(BIN)/test_modcall_widen_slice \
|
|
$(BIN)/test_match_4arm_cross_module \
|
|
$(BIN)/test_match_4arm_cross_module_run \
|
|
$(BIN)/test_param_shadow_mod \
|
|
$(BIN)/test_localoff_scope \
|
|
$(BIN)/test_cast_enum_movl \
|
|
$(BIN)/test_use_promote_alias \
|
|
$(BIN)/test_field_signed $(BIN)/test_frame_argcount \
|
|
$(BIN)/test_selfhost $(BIN)/test_w6a_ww $(BIN)/test_w6l_ww \
|
|
$(BIN)/test_w6c_ww $(BIN)/test_ww_ww $(BIN)/test_self_rebuild \
|
|
$(BIN)/test_dyn_ww $(BIN)/test_selfcheck $(BIN)/test_at_test_ww \
|
|
$(BIN)/test_fmt_run $(BIN)/test_log_run $(BIN)/test_fnmatch_run \
|
|
$(BIN)/test_shlex_run $(BIN)/test_getenv_run $(BIN)/test_dirs_run \
|
|
$(BIN)/test_stat_run $(BIN)/test_time_run \
|
|
$(BIN)/test_intdiv_signed \
|
|
$(BIN)/test_strings_run \
|
|
$(BIN)/test_hex_run $(BIN)/test_utf8_run $(BIN)/test_bytes_run \
|
|
$(BIN)/test_memio_run $(BIN)/test_temp_run $(BIN)/test_getopt_run \
|
|
$(BIN)/test_base32_run $(BIN)/test_base64_run \
|
|
$(BIN)/test_adler32_run $(BIN)/test_crc16_run \
|
|
$(BIN)/test_crc32_run $(BIN)/test_crc64_run \
|
|
$(BIN)/test_siphash_run \
|
|
$(BIN)/test_bufio_run $(BIN)/test_random_run
|
|
|
|
$(BIN)/test_smoke: test/wcc/000_smoke.c $(LIB)/libwcc.a | $(BIN)
|
|
$(CC) $(CFLAGS) $(INCS) -o $@ $< -L$(LIB) -lwcc
|
|
|
|
$(BIN)/test_lex: test/wcc/100_lex.c $(LIB)/libwcc.a | $(BIN)
|
|
$(CC) $(CFLAGS) $(INCS) -o $@ $< -L$(LIB) -lwcc
|
|
|
|
$(BIN)/test_parse: test/wcc/200_parse.c $(LIB)/libwcc.a | $(BIN)
|
|
$(CC) $(CFLAGS) $(INCS) -o $@ $< -L$(LIB) -lwcc
|
|
|
|
$(BIN)/test_check: test/wcc/300_check.c $(LIB)/libwcc.a | $(BIN)
|
|
$(CC) $(CFLAGS) $(INCS) -o $@ $< -L$(LIB) -lwcc
|
|
|
|
$(BIN)/test_w6c: test/wcc/400_w6c.c $(BIN)/w6c | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_w6a: test/wcc/500_w6a.c $(BIN)/w6c $(BIN)/w6a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_dataw: test/wcc/510_dataw.c $(BIN)/w6a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_datar: test/wcc/520_datar.c $(BIN)/w6a $(BIN)/w6l | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_w6l: test/wcc/600_w6l.c $(BIN)/w6c $(BIN)/w6a $(BIN)/w6l | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_data_link: test/wcc/620_data_link.c $(BIN)/w6a $(BIN)/w6l | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_arch: test/wcc/610_arch.c $(BIN)/w6c $(BIN)/w6a $(BIN)/w6l \
|
|
$(OBJ)/rt/start.o | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_e2e: test/wcc/700_e2e.c $(BIN)/ww $(BIN)/w6c $(BIN)/w6a $(BIN)/w6l \
|
|
$(LIB)/libwwrt.a $(OBJ)/rt/start.o | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_ffi: test/wcc/800_ffi.c $(BIN)/w6c | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_dyn: test/wcc/810_dyn.c $(BIN)/ww $(BIN)/w6c $(BIN)/w6a $(BIN)/w6l \
|
|
$(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_stdlib: test/wcc/900_stdlib.c $(BIN)/w6c | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_at_test: test/wcc/910_at_test.c $(BIN)/ww $(BIN)/w6c $(BIN)/w6a \
|
|
$(BIN)/w6l $(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_let_global: test/wcc/630_let_global.c $(BIN)/ww $(BIN)/w6c \
|
|
$(BIN)/w6a $(BIN)/w6l $(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_def_neg_global: test/wcc/631_def_neg_global.c $(BIN)/ww \
|
|
$(BIN)/w6c $(BIN)/w6a $(BIN)/w6l \
|
|
$(BIN)/ww_ww $(BIN)/w6c_ww $(BIN)/w6a_ww $(BIN)/w6l_ww \
|
|
$(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_int_cast_signed: test/wcc/640_int_cast_signed.c $(BIN)/ww \
|
|
$(BIN)/w6c $(BIN)/w6a $(BIN)/w6l \
|
|
$(BIN)/ww_ww $(BIN)/w6c_ww $(BIN)/w6a_ww $(BIN)/w6l_ww \
|
|
$(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_dot_chain: test/wcc/650_dot_chain.c $(BIN)/ww \
|
|
$(BIN)/w6c $(BIN)/w6a $(BIN)/w6l \
|
|
$(BIN)/ww_ww $(BIN)/w6c_ww $(BIN)/w6a_ww $(BIN)/w6l_ww \
|
|
$(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_amp_dot: test/wcc/690_amp_dot.c $(BIN)/ww \
|
|
$(BIN)/w6c $(BIN)/w6a $(BIN)/w6l \
|
|
$(BIN)/ww_ww $(BIN)/w6c_ww $(BIN)/w6a_ww $(BIN)/w6l_ww \
|
|
$(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_arr_elem_field: test/wcc/680_arr_elem_field.c $(BIN)/ww \
|
|
$(BIN)/w6c $(BIN)/w6a $(BIN)/w6l \
|
|
$(BIN)/ww_ww $(BIN)/w6c_ww $(BIN)/w6a_ww $(BIN)/w6l_ww \
|
|
$(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_arr_elem_field_write: test/wcc/681_arr_elem_field_write.c $(BIN)/ww \
|
|
$(BIN)/w6c $(BIN)/w6a $(BIN)/w6l \
|
|
$(BIN)/ww_ww $(BIN)/w6c_ww $(BIN)/w6a_ww $(BIN)/w6l_ww \
|
|
$(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_dot_str_chained_arg: test/wcc/692_dot_str_chained_arg.c $(BIN)/ww \
|
|
$(BIN)/w6c $(BIN)/w6a $(BIN)/w6l \
|
|
$(BIN)/ww_ww $(BIN)/w6c_ww $(BIN)/w6a_ww $(BIN)/w6l_ww \
|
|
$(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_dot_slice_arg: test/wcc/691_dot_slice_arg.c $(BIN)/ww \
|
|
$(BIN)/w6c $(BIN)/w6a $(BIN)/w6l \
|
|
$(BIN)/ww_ww $(BIN)/w6c_ww $(BIN)/w6a_ww $(BIN)/w6l_ww \
|
|
$(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_dot_tagged_source: test/wcc/693_dot_tagged_source.c $(BIN)/ww \
|
|
$(BIN)/w6c $(BIN)/w6a $(BIN)/w6l \
|
|
$(BIN)/ww_ww $(BIN)/w6c_ww $(BIN)/w6a_ww $(BIN)/w6l_ww \
|
|
$(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_tagged_store_intlit: test/wcc/694_tagged_store_intlit.c $(BIN)/ww \
|
|
$(BIN)/w6c $(BIN)/w6a $(BIN)/w6l \
|
|
$(BIN)/ww_ww $(BIN)/w6c_ww $(BIN)/w6a_ww $(BIN)/w6l_ww \
|
|
$(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_match_bind_struct: test/wcc/695_match_bind_struct.c $(BIN)/ww \
|
|
$(BIN)/w6c $(BIN)/w6a $(BIN)/w6l \
|
|
$(BIN)/ww_ww $(BIN)/w6c_ww $(BIN)/w6a_ww $(BIN)/w6l_ww \
|
|
$(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_modtype_leaf_collision: test/wcc/696_modtype_leaf_collision.c \
|
|
$(BIN)/ww $(BIN)/w6c $(BIN)/w6a $(BIN)/w6l \
|
|
$(BIN)/ww_ww $(BIN)/w6c_ww $(BIN)/w6a_ww $(BIN)/w6l_ww \
|
|
$(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_samemod_prefer: test/wcc/697_samemod_prefer.c \
|
|
$(BIN)/ww $(BIN)/w6c $(BIN)/w6a $(BIN)/w6l \
|
|
$(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_cgreturn_struct: test/wcc/698_cgreturn_struct.c \
|
|
$(BIN)/ww $(BIN)/w6c $(BIN)/w6a $(BIN)/w6l \
|
|
$(BIN)/ww_ww $(BIN)/w6c_ww $(BIN)/w6a_ww $(BIN)/w6l_ww \
|
|
$(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_cgassign_struct: test/wcc/701_cgassign_struct.c \
|
|
$(BIN)/ww $(BIN)/w6c $(BIN)/w6a $(BIN)/w6l \
|
|
$(BIN)/ww_ww $(BIN)/w6c_ww $(BIN)/w6a_ww $(BIN)/w6l_ww \
|
|
$(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_dot_explicit_deref: test/wcc/702_dot_explicit_deref.c \
|
|
$(BIN)/ww $(BIN)/w6c $(BIN)/w6a $(BIN)/w6l \
|
|
$(BIN)/ww_ww $(BIN)/w6c_ww $(BIN)/w6a_ww $(BIN)/w6l_ww \
|
|
$(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_nested_structlit: test/wcc/703_nested_structlit.c \
|
|
$(BIN)/ww $(BIN)/w6c $(BIN)/w6a $(BIN)/w6l \
|
|
$(BIN)/ww_ww $(BIN)/w6c_ww $(BIN)/w6a_ww $(BIN)/w6l_ww \
|
|
$(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_dot_structlit: test/wcc/704_dot_structlit.c \
|
|
$(BIN)/ww $(BIN)/w6c $(BIN)/w6a $(BIN)/w6l \
|
|
$(BIN)/ww_ww $(BIN)/w6c_ww $(BIN)/w6a_ww $(BIN)/w6l_ww \
|
|
$(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_nested_call_rhs: test/wcc/705_nested_call_rhs.c \
|
|
$(BIN)/ww $(BIN)/w6c $(BIN)/w6a $(BIN)/w6l \
|
|
$(BIN)/ww_ww $(BIN)/w6c_ww $(BIN)/w6a_ww $(BIN)/w6l_ww \
|
|
$(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_fnlabel_mangle: test/wcc/706_fnlabel_mangle.c \
|
|
$(BIN)/ww $(BIN)/w6c $(BIN)/w6a $(BIN)/w6l \
|
|
$(BIN)/ww_ww $(BIN)/w6c_ww $(BIN)/w6a_ww $(BIN)/w6l_ww \
|
|
$(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_cgreturn_variant_zero: test/wcc/707_cgreturn_variant_zero.c \
|
|
$(BIN)/ww $(BIN)/w6c $(BIN)/w6a $(BIN)/w6l \
|
|
$(BIN)/ww_ww $(BIN)/w6c_ww $(BIN)/w6a_ww $(BIN)/w6l_ww \
|
|
$(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_param_shadow_mod: test/wcc/708_param_shadow_mod.c \
|
|
$(BIN)/ww $(BIN)/w6c $(BIN)/w6a $(BIN)/w6l \
|
|
$(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_localoff_scope: test/wcc/709_localoff_scope.c \
|
|
$(BIN)/ww $(BIN)/w6c $(BIN)/w6a $(BIN)/w6l \
|
|
$(BIN)/ww_ww $(BIN)/w6c_ww $(BIN)/w6a_ww $(BIN)/w6l_ww \
|
|
$(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_cast_enum_movl: test/wcc/710_cast_enum_movl.c \
|
|
$(BIN)/ww $(BIN)/w6c $(BIN)/w6a $(BIN)/w6l \
|
|
$(BIN)/ww_ww $(BIN)/w6c_ww $(BIN)/w6a_ww $(BIN)/w6l_ww \
|
|
$(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_arrlit_str_full: test/wcc/711_arrlit_str_full.c \
|
|
$(BIN)/ww $(BIN)/w6c $(BIN)/w6a $(BIN)/w6l \
|
|
$(BIN)/ww_ww $(BIN)/w6c_ww $(BIN)/w6a_ww $(BIN)/w6l_ww \
|
|
$(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_redecl: test/wcc/712_redecl.c \
|
|
$(BIN)/ww $(BIN)/w6c $(BIN)/w6a $(BIN)/w6l \
|
|
$(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_struct_field_index: test/wcc/713_struct_field_index.c \
|
|
$(BIN)/ww $(BIN)/w6c $(BIN)/w6a $(BIN)/w6l \
|
|
$(BIN)/ww_ww $(BIN)/w6c_ww $(BIN)/w6a_ww $(BIN)/w6l_ww \
|
|
$(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_tagged_return_scratch: test/wcc/714_tagged_return_scratch.c \
|
|
$(BIN)/ww $(BIN)/w6c $(BIN)/w6a $(BIN)/w6l \
|
|
$(BIN)/ww_ww $(BIN)/w6c_ww $(BIN)/w6a_ww $(BIN)/w6l_ww \
|
|
$(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_tagged_widen_f64: test/wcc/715_tagged_widen_f64.c \
|
|
$(BIN)/ww $(BIN)/w6c $(BIN)/w6a $(BIN)/w6l \
|
|
$(BIN)/ww_ww $(BIN)/w6c_ww $(BIN)/w6a_ww $(BIN)/w6l_ww \
|
|
$(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_match_spill_pointer_payload: test/wcc/716_match_spill_pointer_payload.c \
|
|
$(BIN)/ww $(BIN)/w6c $(BIN)/w6a $(BIN)/w6l \
|
|
$(BIN)/ww_ww $(BIN)/w6c_ww $(BIN)/w6a_ww $(BIN)/w6l_ww \
|
|
$(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_struct_byval_param: test/wcc/717_struct_byval_param.c \
|
|
$(BIN)/ww $(BIN)/w6c $(BIN)/w6a $(BIN)/w6l \
|
|
$(BIN)/ww_ww $(BIN)/w6c_ww $(BIN)/w6a_ww $(BIN)/w6l_ww \
|
|
$(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_struct_multi_return_scratch: test/wcc/718_struct_multi_return_scratch.c \
|
|
$(BIN)/ww $(BIN)/w6c $(BIN)/w6a $(BIN)/w6l \
|
|
$(BIN)/ww_ww $(BIN)/w6c_ww $(BIN)/w6a_ww $(BIN)/w6l_ww \
|
|
$(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_signed_data_emit: test/wcc/719_signed_data_emit.c \
|
|
$(BIN)/w6c $(BIN)/w6c_ww | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_signed_data_emit_run: test/wcc/923_signed_data_emit_run.c \
|
|
$(BIN)/ww $(BIN)/w6c $(BIN)/w6a $(BIN)/w6l \
|
|
$(BIN)/ww_ww $(BIN)/w6c_ww $(BIN)/w6a_ww $(BIN)/w6l_ww \
|
|
$(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_tagged_call_arg: test/wcc/720_tagged_call_arg.c \
|
|
$(BIN)/w6c $(BIN)/w6c_ww | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_tagged_call_arg_run: test/wcc/924_tagged_call_arg_run.c \
|
|
$(BIN)/ww $(BIN)/w6c $(BIN)/w6a $(BIN)/w6l \
|
|
$(BIN)/ww_ww $(BIN)/w6c_ww $(BIN)/w6a_ww $(BIN)/w6l_ww \
|
|
$(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_sret_struct_return: test/wcc/721_sret_struct_return.c \
|
|
$(BIN)/w6c $(BIN)/w6c_ww | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_sret_struct_return_run: test/wcc/925_sret_struct_return_run.c \
|
|
$(BIN)/ww $(BIN)/w6c $(BIN)/w6a $(BIN)/w6l \
|
|
$(BIN)/ww_ww $(BIN)/w6c_ww $(BIN)/w6a_ww $(BIN)/w6l_ww \
|
|
$(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_match_slice_variant: test/wcc/722_match_slice_variant.c \
|
|
$(BIN)/w6c $(BIN)/w6c_ww | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_match_slice_variant_run: test/wcc/926_match_slice_variant_run.c \
|
|
$(BIN)/ww $(BIN)/w6c $(BIN)/w6a $(BIN)/w6l \
|
|
$(BIN)/ww_ww $(BIN)/w6c_ww $(BIN)/w6a_ww $(BIN)/w6l_ww \
|
|
$(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_composite_call_arg: test/wcc/723_composite_call_arg.c \
|
|
$(BIN)/w6c $(BIN)/w6c_ww | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_composite_call_arg_run: test/wcc/927_composite_call_arg_run.c \
|
|
$(BIN)/ww $(BIN)/w6c $(BIN)/w6a $(BIN)/w6l \
|
|
$(BIN)/ww_ww $(BIN)/w6c_ww $(BIN)/w6a_ww $(BIN)/w6l_ww \
|
|
$(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_letdecl_zeroinit: test/wcc/724_letdecl_zeroinit.c \
|
|
$(BIN)/w6c $(BIN)/w6c_ww | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_nested_if_labels: test/wcc/725_nested_if_labels.c \
|
|
$(BIN)/w6c $(BIN)/w6c_ww | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_alias_leaf_collision: test/wcc/726_alias_leaf_collision.c \
|
|
$(BIN)/w6c $(BIN)/w6c_ww | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_modcall_widen_slice: test/wcc/727_modcall_widen_slice.c \
|
|
$(BIN)/w6c $(BIN)/w6c_ww | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_match_4arm_cross_module: test/wcc/728_match_4arm_cross_module.c \
|
|
$(BIN)/w6c $(BIN)/w6c_ww | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_match_4arm_cross_module_run: test/wcc/929_match_4arm_cross_module_run.c \
|
|
$(BIN)/ww $(BIN)/w6c $(BIN)/w6a $(BIN)/w6l \
|
|
$(BIN)/ww_ww $(BIN)/w6c_ww $(BIN)/w6a_ww $(BIN)/w6l_ww \
|
|
$(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_use_promote_alias: test/wcc/699_use_promote_alias.c \
|
|
$(BIN)/ww $(BIN)/w6c $(BIN)/w6a $(BIN)/w6l \
|
|
$(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_field_signed: test/wcc/660_field_signed.c $(BIN)/ww \
|
|
$(BIN)/w6c $(BIN)/w6a $(BIN)/w6l \
|
|
$(BIN)/ww_ww $(BIN)/w6c_ww $(BIN)/w6a_ww $(BIN)/w6l_ww \
|
|
$(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_frame_argcount: test/wcc/670_frame_argcount.c $(BIN)/ww \
|
|
$(BIN)/w6c $(BIN)/w6a $(BIN)/w6l \
|
|
$(BIN)/ww_ww $(BIN)/w6c_ww $(BIN)/w6a_ww $(BIN)/w6l_ww \
|
|
$(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_selfhost: test/wcc/990_selfhost.c $(BIN)/w6c $(BIN)/w6a $(BIN)/w6l \
|
|
$(BIN)/ww $(BIN)/wwdump $(BIN)/wwdump_ww $(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_w6a_ww: test/wcc/991_w6a_ww.c $(BIN)/w6a $(BIN)/w6a_ww | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_w6l_ww: test/wcc/992_w6l_ww.c $(BIN)/w6l $(BIN)/w6l_ww \
|
|
$(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_w6c_ww: test/wcc/994_w6c_ww.c $(BIN)/w6c_ww $(BIN)/wwdump_ww | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_ww_ww: test/wcc/993_ww_ww.c $(BIN)/ww $(BIN)/ww_ww \
|
|
$(BIN)/w6c $(BIN)/w6a $(BIN)/w6l $(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_self_rebuild: test/wcc/995_self_rebuild.c $(BIN)/ww_ww \
|
|
$(BIN)/w6c_ww $(BIN)/w6a_ww $(BIN)/w6l_ww $(BIN)/wwdump_ww \
|
|
$(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_selfcheck: test/wcc/950_selfcheck.c $(BIN)/wwdump_ww | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_dyn_ww: test/wcc/996_dyn_ww.c $(BIN)/ww $(BIN)/w6l $(BIN)/w6l_ww \
|
|
$(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_at_test_ww: test/wcc/997_at_test_ww.c $(BIN)/ww_ww $(BIN)/w6c_ww \
|
|
$(BIN)/w6a_ww $(BIN)/w6l_ww $(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_fmt_run: test/wcc/970_fmt_run.c $(BIN)/ww $(BIN)/w6c \
|
|
$(BIN)/w6a $(BIN)/w6l $(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_log_run: test/wcc/971_log_run.c $(BIN)/ww $(BIN)/w6c \
|
|
$(BIN)/w6a $(BIN)/w6l $(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_fnmatch_run: test/wcc/972_fnmatch_run.c $(BIN)/ww $(BIN)/w6c \
|
|
$(BIN)/w6a $(BIN)/w6l $(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_shlex_run: test/wcc/973_shlex_run.c $(BIN)/ww $(BIN)/w6c \
|
|
$(BIN)/w6a $(BIN)/w6l $(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_getenv_run: test/wcc/974_getenv_run.c $(BIN)/ww $(BIN)/w6c \
|
|
$(BIN)/w6a $(BIN)/w6l $(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_dirs_run: test/wcc/975_dirs_run.c $(BIN)/ww $(BIN)/w6c \
|
|
$(BIN)/w6a $(BIN)/w6l $(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_stat_run: test/wcc/976_stat_run.c $(BIN)/ww $(BIN)/w6c \
|
|
$(BIN)/w6a $(BIN)/w6l $(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_time_run: test/wcc/977_time_run.c $(BIN)/ww $(BIN)/w6c \
|
|
$(BIN)/w6a $(BIN)/w6l $(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_intdiv_signed: test/wcc/978_intdiv_signed.c $(BIN)/ww $(BIN)/w6c \
|
|
$(BIN)/w6a $(BIN)/w6l $(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_hex_run: test/wcc/979_hex_run.c $(BIN)/ww $(BIN)/w6c \
|
|
$(BIN)/w6a $(BIN)/w6l $(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_utf8_run: test/wcc/968_utf8_run.c $(BIN)/ww $(BIN)/w6c \
|
|
$(BIN)/w6a $(BIN)/w6l $(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_bytes_run: test/wcc/967_bytes_run.c $(BIN)/ww $(BIN)/w6c \
|
|
$(BIN)/w6a $(BIN)/w6l $(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_strings_run: test/wcc/966_strings_run.c $(BIN)/ww $(BIN)/w6c \
|
|
$(BIN)/w6a $(BIN)/w6l $(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_memio_run: test/wcc/980_memio_run.c $(BIN)/ww $(BIN)/w6c \
|
|
$(BIN)/w6a $(BIN)/w6l $(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_temp_run: test/wcc/981_temp_run.c $(BIN)/ww $(BIN)/w6c \
|
|
$(BIN)/w6a $(BIN)/w6l $(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_getopt_run: test/wcc/982_getopt_run.c $(BIN)/ww $(BIN)/w6c \
|
|
$(BIN)/w6a $(BIN)/w6l $(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_base32_run: test/wcc/983_base32_run.c $(BIN)/ww $(BIN)/w6c \
|
|
$(BIN)/w6a $(BIN)/w6l $(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_base64_run: test/wcc/984_base64_run.c $(BIN)/ww $(BIN)/w6c \
|
|
$(BIN)/w6a $(BIN)/w6l $(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_adler32_run: test/wcc/985_adler32_run.c $(BIN)/ww $(BIN)/w6c \
|
|
$(BIN)/w6a $(BIN)/w6l $(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_crc16_run: test/wcc/986_crc16_run.c $(BIN)/ww $(BIN)/w6c \
|
|
$(BIN)/w6a $(BIN)/w6l $(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_crc32_run: test/wcc/987_crc32_run.c $(BIN)/ww $(BIN)/w6c \
|
|
$(BIN)/w6a $(BIN)/w6l $(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_crc64_run: test/wcc/988_crc64_run.c $(BIN)/ww $(BIN)/w6c \
|
|
$(BIN)/w6a $(BIN)/w6l $(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_siphash_run: test/wcc/989_siphash_run.c $(BIN)/ww $(BIN)/w6c \
|
|
$(BIN)/w6a $(BIN)/w6l $(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_bufio_run: test/wcc/998_bufio_run.c $(BIN)/ww $(BIN)/w6c \
|
|
$(BIN)/w6a $(BIN)/w6l $(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
$(BIN)/test_random_run: test/wcc/999_random_run.c $(BIN)/ww $(BIN)/w6c \
|
|
$(BIN)/w6a $(BIN)/w6l $(LIB)/libwwrt.a | $(BIN)
|
|
$(CC) $(CFLAGS) -o $@ $<
|
|
|
|
test: all $(TESTS)
|
|
@WW=$(BIN)/ww BIN=$(BIN) sh test/run
|
|
|
|
install: all
|
|
mkdir -p $(PREFIX)/bin $(PREFIX)/lib
|
|
cp $(BIN)/ww $(PREFIX)/bin/
|
|
cp $(LIB)/libwcc.a $(PREFIX)/lib/
|
|
|
|
clean:
|
|
rm -rf $(OUT)
|
|
|
|
# ---- bootstrap (phase 10) ----------------------------------------------
|
|
# Four-stage self-host: Cstage (these C tools) → ww1 → ww2 → ww3 → ww4
|
|
# with cmp ww2 == ww3 and cmp ww3 == ww4. Stage 1 is wwdump_ww (the
|
|
# ww-built frontend); stages 2/3/4 assemble with w6a_ww and link with
|
|
# w6l_ww — every tool below the driver is now in ww. The C `ww` driver
|
|
# still orchestrates the pipeline (porting it is the remaining phase-10
|
|
# work).
|
|
#
|
|
# Why a fourth stage? Stage 3 proves ww1 and ww2 (which differ in how
|
|
# they were built) emit the same machine code. Stage 4 proves ww3 is
|
|
# byte-stable when used as a compiler — i.e. the fixed point is truly
|
|
# fixed, not merely a coincidental two-stage equilibrium.
|
|
BS = $(OUT)/bootstrap
|
|
bootstrap: all
|
|
@echo "=== stage 0 (Cstage): C-built tools ==="
|
|
@echo " $(BIN)/ww $(BIN)/w6c $(BIN)/w6a $(BIN)/w6l"
|
|
@echo
|
|
@echo "=== stage 1: ww-built tools, used to drive stages 2/3/4 ==="
|
|
@ls -l $(BIN)/wwdump_ww $(BIN)/w6a_ww $(BIN)/w6l_ww $(BIN)/ww_ww
|
|
@rm -rf $(BS) && mkdir -p $(BS)
|
|
@echo
|
|
@echo "=== stage 2: ww2 = ww1 self-compiles main.combined.ww ==="
|
|
@$(BIN)/wwdump_ww -c selfhost/cmd/wwdump/main.combined.ww > $(BS)/ww2.s
|
|
@$(BIN)/w6a_ww -o $(BS)/ww2.o $(BS)/ww2.s
|
|
@$(BIN)/w6l_ww -o $(BS)/ww2 $(BS)/ww2.o $(LIB)/libwwrt.a
|
|
@ls -l $(BS)/ww2
|
|
@echo
|
|
@echo "=== stage 3: ww3 = ww2 self-compiles main.combined.ww ==="
|
|
@$(BS)/ww2 -c selfhost/cmd/wwdump/main.combined.ww > $(BS)/ww3.s
|
|
@$(BIN)/w6a_ww -o $(BS)/ww3.o $(BS)/ww3.s
|
|
@$(BIN)/w6l_ww -o $(BS)/ww3 $(BS)/ww3.o $(LIB)/libwwrt.a
|
|
@ls -l $(BS)/ww3
|
|
@echo
|
|
@echo "=== stage 4: ww4 = ww3 self-compiles main.combined.ww ==="
|
|
@$(BS)/ww3 -c selfhost/cmd/wwdump/main.combined.ww > $(BS)/ww4.s
|
|
@$(BIN)/w6a_ww -o $(BS)/ww4.o $(BS)/ww4.s
|
|
@$(BIN)/w6l_ww -o $(BS)/ww4 $(BS)/ww4.o $(LIB)/libwwrt.a
|
|
@ls -l $(BS)/ww4
|
|
@echo
|
|
@echo "=== fixed-point gates ==="
|
|
@cmp $(BS)/ww2.s $(BS)/ww3.s && echo " ww2.s == ww3.s ✓"
|
|
@cmp $(BS)/ww2.o $(BS)/ww3.o && echo " ww2.o == ww3.o ✓ (byte-identical .o)"
|
|
@cmp $(BS)/ww2 $(BS)/ww3 && echo " ww2 == ww3 ✓ (byte-identical exe)"
|
|
@cmp $(BS)/ww3.s $(BS)/ww4.s && echo " ww3.s == ww4.s ✓"
|
|
@cmp $(BS)/ww3.o $(BS)/ww4.o && echo " ww3.o == ww4.o ✓ (byte-identical .o)"
|
|
@cmp $(BS)/ww3 $(BS)/ww4 && echo " ww3 == ww4 ✓ (byte-identical exe, ww3 is byte-stable as a compiler)"
|
|
@echo
|
|
@echo "BOOTSTRAP OK: ww-cgen + w6a_ww + w6l_ww reach a fixed point that holds across two iterations."
|
|
@echo
|
|
@echo "Phase 10 remaining work:"
|
|
@echo " - delete cmd/wcc/ cmd/w6c/ cmd/w6a/ cmd/w6l/ cmd/ww/ in the final commit"
|
|
@echo
|
|
@echo "Already in selfhost/:"
|
|
@echo " - cmd/wcc/ : ww-cgen (lex/parse/check/cgen) — bootstrap fixed point"
|
|
@echo " - cmd/w6c/ : ww-w6c (lex/parse/cgen front-end) — matches wwdump_ww -c (test 994)"
|
|
@echo " - cmd/w6a/ : ww-w6a (lex/parse/asm/obj) — byte-identical to C w6a (test 991)"
|
|
@echo " - cmd/w6l/ : ww-w6l (linker w/ archive support) — byte-identical to C w6l (test 992)"
|
|
@echo " - cmd/ww/ : ww-driver (build/run/version) — byte-identical to C ww (test 993)"
|
|
|
|
# ---- nocc: bootstrap from a checked-in stage-0 binary, no cc -----------
|
|
# A fresh-checkout flow that never invokes cc. Mirrors `make bootstrap`'s
|
|
# fixed-point check but uses `bootstrap/$(ARCH)/{ww,w6c,w6a,w6l}` as the
|
|
# starting point and lands in $(OUT)/nocc/ so the cstage build under
|
|
# $(OUT)/ stays untouched. See bootstrap/README.md and BOOTSTRAP.md.
|
|
#
|
|
# `make bootstrap-snapshot` populates bootstrap/$(ARCH)/ from the
|
|
# currently-built wwstage so you can verify locally before deciding
|
|
# to commit the binaries.
|
|
ARCH ?= amd64
|
|
STAGE0 = bootstrap/$(ARCH)
|
|
NOCC_OUT = $(OUT)/nocc
|
|
NOCC_BIN = $(NOCC_OUT)/bin
|
|
NOCC_LIB = $(NOCC_OUT)/lib
|
|
NOCC_OBJ = $(NOCC_OUT)/obj
|
|
|
|
bootstrap-snapshot: wwstage
|
|
@mkdir -p $(STAGE0)
|
|
@cp $(BIN)/ww_ww $(STAGE0)/ww
|
|
@cp $(BIN)/w6c_ww $(STAGE0)/w6c
|
|
@cp $(BIN)/w6a_ww $(STAGE0)/w6a
|
|
@cp $(BIN)/w6l_ww $(STAGE0)/w6l
|
|
@echo "snapshot: $(STAGE0)/{ww,w6c,w6a,w6l} populated from $(BIN)/*_ww"
|
|
@echo " (gitignored — 'git add -f bootstrap/$(ARCH)/*' to ship)"
|
|
|
|
nocc:
|
|
@for f in ww w6c w6a w6l; do \
|
|
test -x $(STAGE0)/$$f || { \
|
|
echo "$@: missing $(STAGE0)/$$f"; \
|
|
echo "$@: run 'make bootstrap-snapshot' first, or read bootstrap/README.md"; \
|
|
exit 1; \
|
|
}; \
|
|
done
|
|
@echo "=== nocc: starting from $(STAGE0) (no cc invoked) ==="
|
|
@rm -rf $(NOCC_OUT)
|
|
@mkdir -p $(NOCC_BIN) $(NOCC_LIB) $(NOCC_OBJ)
|
|
@# Stage 0: drop bootstrap binaries under both natural names and
|
|
@# the _ww-suffixed names the driver expects when shelling out.
|
|
@for f in ww w6c w6a w6l; do \
|
|
cp $(STAGE0)/$$f $(NOCC_BIN)/$$f; \
|
|
cp $(STAGE0)/$$f $(NOCC_BIN)/$${f}_ww; \
|
|
done
|
|
@# Assemble libwwrt.a using stage-0 w6a — the linker needs it for
|
|
@# every wwstage-built binary in the next stage. Member order
|
|
@# follows $(RT_S) so the embedded symbol table matches the
|
|
@# cstage-built libwwrt.a (cstage uses ar rcs $(RT_OBJ), same
|
|
@# order).
|
|
@objs=""; for s in $(RT_S); do \
|
|
b=`basename $$s .s`; \
|
|
$(NOCC_BIN)/w6a -o $(NOCC_OBJ)/$$b.o $$s; \
|
|
objs="$$objs $(NOCC_OBJ)/$$b.o"; \
|
|
done; $(AR) rcs $(NOCC_LIB)/libwwrt.a $$objs
|
|
@echo "=== stage 1: stage-0 rebuilds the wwstage tools from source ==="
|
|
@# The driver's default lib path is $self_dir/../../lib — under
|
|
@# $(NOCC_BIN) that resolves to $(NOCC_OUT)/lib (libwwrt only).
|
|
@# Pass -I $(CURDIR)/lib so `use os` etc. resolve to source.
|
|
@cd $(NOCC_BIN) && ./ww build \
|
|
-I $(CURDIR)/lib/ww \
|
|
-I $(CURDIR)/lib/ww/lex \
|
|
-I $(CURDIR)/lib/ww/parse \
|
|
-I $(CURDIR)/selfhost/cmd/wcc \
|
|
-I $(CURDIR)/lib $(CURDIR)/selfhost/cmd/w6c/main.ww && mv main w6c_ww1
|
|
@cd $(NOCC_BIN) && ./ww build -I $(CURDIR)/selfhost/cmd/w6a \
|
|
-I $(CURDIR)/selfhost/cmd/wcc -I $(CURDIR)/lib \
|
|
$(CURDIR)/selfhost/cmd/w6a/main.ww && mv main w6a_ww1
|
|
@cd $(NOCC_BIN) && ./ww build -I $(CURDIR)/selfhost/cmd/w6l \
|
|
-I $(CURDIR)/selfhost/cmd/wcc -I $(CURDIR)/lib \
|
|
$(CURDIR)/selfhost/cmd/w6l/main.ww && mv main w6l_ww1
|
|
@cd $(NOCC_BIN) && ./ww build -I $(CURDIR)/selfhost/cmd/wcc \
|
|
-I $(CURDIR)/lib $(CURDIR)/selfhost/cmd/ww/main.ww && mv main ww_ww1
|
|
@echo "=== fixed-point gates: rebuilt tools == stage-0 binaries? ==="
|
|
@cmp $(NOCC_BIN)/w6c_ww1 $(STAGE0)/w6c && echo " w6c ✓"
|
|
@cmp $(NOCC_BIN)/w6a_ww1 $(STAGE0)/w6a && echo " w6a ✓"
|
|
@cmp $(NOCC_BIN)/w6l_ww1 $(STAGE0)/w6l && echo " w6l ✓"
|
|
@cmp $(NOCC_BIN)/ww_ww1 $(STAGE0)/ww && echo " ww ✓"
|
|
@echo
|
|
@echo "NOCC OK: $(STAGE0)/* reproduces itself from source. cc not invoked."
|
|
|
|
.PHONY: all cstage wwstage test install clean bootstrap nocc bootstrap-snapshot
|