diff --git a/local/docs/NATIVE-TOOLCHAIN-WORKSTREAM.md b/local/docs/NATIVE-TOOLCHAIN-WORKSTREAM.md index 4e1210f972..60772f9b6c 100644 --- a/local/docs/NATIVE-TOOLCHAIN-WORKSTREAM.md +++ b/local/docs/NATIVE-TOOLCHAIN-WORKSTREAM.md @@ -1,8 +1,9 @@ # Native Toolchain Workstream — `gcc-native` / `rust-native` -**Status:** DEFERRED. Explicit operator decision, 2026-08-03: *"Treat -gcc-native/rust-native as a separate workstream, explicitly deferred by me, for -now."* +**Status:** ACTIVE. Deferred 2026-08-03 (*"Treat gcc-native/rust-native as a +separate workstream, explicitly deferred by me, for now."*), then RE-ENABLED by +explicit operator decision, 2026-08-05: *"Build and add gcc-native and +rust-native to project."* Both are `= {}` in `config/redbear-full.toml` again. **Scope:** `local/recipes/dev/gcc-native/`, `local/recipes/dev/rust-native/`. **Not deferred:** `binutils-native` and `llvm-native` build and remain in `config/redbear-full.toml`. `llvm-native` is **required**, not optional — it @@ -124,9 +125,26 @@ numbering, not glibc's. error: missing binary operator before token '(' ``` -The **host's** libstdc++ headers are being pulled into a target compile — -`__GLIBC_PREREQ` evaluated where there is no glibc. A host/target header leak, -and the natural next thing to investigate. +**Root cause identified 2026-08-05 while unblocking `rust-native` — it is the +same defect, and it is now understood.** The initial reading above ("host +libstdc++ headers pulled into a target compile") had the direction backwards. +What actually happens is the reverse: `${HOME}/.redoxer/${TARGET}/toolchain/include` +is a MIXED directory holding relibc's **target** headers (`stdlib.h`, +`features.h`, `fenv.h`, …) beside the `llvm/` and `clang/` ones. When that +directory reaches a **host** compile via `-I`, relibc's `features.h` shadows +glibc's, `__GLIBC_PREREQ` is never defined, and every host libstdc++/glibc +header testing it fails. Reproducible in three lines, no rustc or GCC build +involved: + +``` +printf '#include \nint main(){}' > t.cpp +c++ -std=c++17 -I${HOME}/.redoxer/x86_64-unknown-redox/toolchain/include -c t.cpp +``` + +So this is a target→host leak, not a host→target one. See the `rust-native` +finding #5 below for the fix pattern (`host:` packages stage into +`COOKBOOK_TOOLCHAIN`, which is a separate tree from the target sysroot); the +same approach should apply here. ## `rust-native` — four findings, one open @@ -136,18 +154,30 @@ and the natural next thing to investigate. | 2 | in-tree `miri` pinned `nix = "0.30.1"` and held the broken version in the graph | bumped; carried as `local/patches/rust/01-miri-nix-0.31.patch` | | 3 | `CLD_EXITED` / `P_ALL` etc. not in crate `libc` — its **Redox bindings** never exposed the `waitid` surface relibc implements, still absent in 0.2.189 | vendored fork, see `VENDORED-LIBC-FORK.md` | | 4 | `llvm/Config/llvm-config.h: No such file` — `llvm-native.dev` (which stages the headers) missing from dependencies | added | +| 5 | ~200 errors in the HOST's own glibc/libstdc++ headers building `rustc_llvm` for the host triple. `rustc_llvm`'s build script feeds `llvm-config --includedir` straight to the host `c++`, and the redoxer toolchain's `include/` is the mixed dir described under gcc-native above | `host:llvm-native` (+ `.dev`/`.runtime`). Host deps stage into `COOKBOOK_TOOLCHAIN`, a tree SEPARATE from the target sysroot, so the host LLVM and the Redox `llvm21` coexist instead of overwriting each other — which is the collision the recipe's `llvm21` comment records | +| 6 | `c++: error: unknown argument: '-fno-hardened'`. `DYNAMIC_INIT` exports `CXXFLAGS=-fno-hardened` for the GCC 16 **cross** compiler; the recipe's `unset` list dropped `CC`/`CXX`/`LDFLAGS` but not `CFLAGS`/`CXXFLAGS`/`CPPFLAGS`, so it leaked into the host stage1 build, where `c++` now resolves through `COOKBOOK_TOOLCHAIN/bin` to llvm-native's clang++ | added `CFLAGS CXXFLAGS CPPFLAGS` to the unset. Pre-existing leak; the cross `recipes/dev/rust` has the same list and never hit it only because nothing puts a clang on its PATH | +| 7 | `'_POSIX_THREADS' redefined [-Werror]` building `rustc_llvm` for the **target**. relibc defined it twice: `unistd.h` `202405L` (correct — POSIX puts it there) and `pthread.h` `1`, emitted from a `pub const` in `src/header/pthread/mod.rs` that had zero users | deleted the dead constant in the relibc fork (`851a505f` on `submodule/relibc`), + prefix rebuild | -**Open:** five `error: unreachable 'pub' item` diagnostics, crate not yet -identified. Not investigated. +**Findings 5 and 6 were pre-existing latent defects**, not regressions: #5 is +the same root cause as gcc-native's stopping point, and #6 only becomes +reachable once a clang is on PATH. #7 broke any `-Werror` C++ TU including both +headers, which is every C++ TU — libstdc++'s `` chain reaches +`pthread.h` via `gthr-default.h`. + +**Closed:** the five `error: unreachable 'pub' item` diagnostics are resolved by +`deny-warnings = false` in `config.toml` (documented in that file: the vendored +libc fork arrives as a PATH dependency, so cargo's `--cap-lints allow` for +registry deps does not apply to it). ## Re-enabling -The recipes are **fixed and committed, not reverted**. To resume: +Both were re-enabled in `config/redbear-full.toml` on 2026-08-05; nothing needs +un-ignoring. Build with +`./local/scripts/build-redbear.sh --upstream redbear-full`. -1. In `config/redbear-full.toml`, change `gcc-native = "ignore"` and - `rust-native = "ignore"` back to `= {}`. -2. `./local/scripts/build-redbear.sh --upstream redbear-full`. -3. Expect to resume at the host/libstdc++ header leak above. +`gcc-native` should now resume past its recorded stopping point using the +finding-#5 pattern (a `host:` package, so the host compile never sees the mixed +redoxer include dir) rather than by patching GCC's header model incrementally. Diagnose failures **in isolation** — `COOKBOOK_COOK_JOBS=1 ./target/release/repo cook `. The aggregate build multiplexes output from parallel cooks, and @@ -163,3 +193,6 @@ Two findings belong upstream rather than in Red Bear indefinitely: `VENDORED-LIBC-FORK.md`. - relibc's missing GNU `fnmatch` extensions — now fixed in the fork, and worth offering upstream. +- relibc's duplicate `_POSIX_THREADS` (finding #7) — the `pthread.h` copy is + both misplaced per POSIX and carries an invalid value. Fixed in the fork and + worth offering upstream.