diff --git a/test/wcc/995_self_rebuild.c b/test/wcc/995_self_rebuild.c index 592f5ab6..ac0f072a 100644 --- a/test/wcc/995_self_rebuild.c +++ b/test/wcc/995_self_rebuild.c @@ -82,15 +82,21 @@ struct buildjob { /* Fork a child that runs the `ww_ww build` for this tool. The child * inherits no concurrent siblings — system() spawns a fresh /bin/sh -c. * stderr lands in /build.err so concurrent builds don't merge - * their diagnostics. */ + * their diagnostics. + * + * The source is staged at /build.ww before the build so the + * driver writes its .combined.ww/.s/.o intermediates inside workdir — + * not next to the canonical selfhost/cmd//main.ww, where 991/992/ + * 994 read main.s as a fixture. Without staging, parallel test/run sees + * 991 race against 995's wwdump-build mid-write of main.s. */ static int spawn_build(const char *bin, const char *cwd, struct buildjob *j) { snprintf(j->workdir, sizeof j->workdir, "/tmp/wwsr_%d_%s", getpid(), j->tool); - char setup[256]; - snprintf(setup, sizeof setup, "rm -rf %s && mkdir -p %s", - j->workdir, j->workdir); + char setup[4096]; + snprintf(setup, sizeof setup, "rm -rf %s && mkdir -p %s && cp %s/%s %s/build.ww", + j->workdir, j->workdir, cwd, j->src_rel, j->workdir); if (runwait(setup) != 0) return -1; char cmd[4096]; @@ -98,15 +104,15 @@ spawn_build(const char *bin, const char *cwd, struct buildjob *j) snprintf(cmd, sizeof cmd, "cd %s && timeout 180 %s/ww_ww build -I %s/%s " "-I %s/lib/ww -I %s/lib/ww/lex -I %s/lib/ww/parse " - "-I %s/selfhost/cmd/wcc %s/%s >/dev/null 2>%s/build.err", + "-I %s/selfhost/cmd/wcc build.ww >/dev/null 2>%s/build.err", j->workdir, bin, cwd, j->inc_local, - cwd, cwd, cwd, cwd, cwd, j->src_rel, j->workdir); + cwd, cwd, cwd, cwd, j->workdir); } else { snprintf(cmd, sizeof cmd, "cd %s && timeout 180 %s/ww_ww build " "-I %s/lib/ww -I %s/lib/ww/lex -I %s/lib/ww/parse " - "-I %s/selfhost/cmd/wcc %s/%s >/dev/null 2>%s/build.err", - j->workdir, bin, cwd, cwd, cwd, cwd, cwd, j->src_rel, j->workdir); + "-I %s/selfhost/cmd/wcc build.ww >/dev/null 2>%s/build.err", + j->workdir, bin, cwd, cwd, cwd, cwd, j->workdir); } pid_t p = fork(); @@ -146,7 +152,7 @@ collect_build(const char *bin, struct buildjob *j) rc = -1; } else { char rebuilt[256], canonical[256]; - snprintf(rebuilt, sizeof rebuilt, "%s/main", j->workdir); + snprintf(rebuilt, sizeof rebuilt, "%s/build", j->workdir); snprintf(canonical, sizeof canonical, "%s/%s_ww", bin, j->tool); rc = slurp_eq(rebuilt, canonical); if (rc != 0) {