11 KiB
11 KiB
Progress
2026-04-01 — Phase 1.1 started: Guile verified on FreeBSD amd64
Completed work:
- installed/confirmed
guile3-3.0.10 - added a reusable verification harness:
tests/guile/run-phase1-verification.shtests/guile/verify-phase1.scmtests/guile/modules/phase1/sample.scm
- verified the following on
FreeBSD 15.0-STABLEamd64:- module loading
- deterministic output generation
- file I/O
- process handling with
primitive-fork/waitpid - loopback TCP sockets
- FFI calls into libc
- execution of Guix bootstrap-related code from
(guix build make-bootstrap)
- wrote the results to
docs/reports/phase1-guile-freebsd.md
Notable findings:
guile3andguile-3.0are present, but there is no unversionedguilebinarysystem*andopen-pipe*currently segfault on this host (exit 139)- despite that crash, the lower-level process primitives needed for further investigation do work
Current assessment:
- Phase 1.1 has a solid amd64 smoke-verification baseline
- Phase 1.1 is not fully complete yet because
i386has not been checked and the subprocess crash needs investigation - verification harness committed as
e380e88(Add FreeBSD Guile verification harness)
2026-04-01 — Phase 1.1 follow-up: subprocess crash isolated
Completed work:
- added a dedicated subprocess diagnostic harness:
tests/guile/run-subprocess-diagnostics.shtests/guile/posix-spawn-freebsd-diagnostics.c
- reproduced crashes for:
system*spawnopen-pipe*
- confirmed all three fail with
SIGSEGV/exit 139 - confirmed native FreeBSD
posix_spawn+posix_spawn_file_actions_addclosefrom_npworks in a standalone C program - confirmed FreeBSD behavior that triggers gnulib replacement logic:
posix_spawn_file_actions_adddup2accepts an invalid fd in the gnulib probeposix_spawn_file_actions_addopenaccepts an invalid fd in the gnulib probeposix_spawnpaccepts a shebang-less executable script in the gnulib security probe
- wrote the analysis to
docs/reports/phase1-guile-subprocess-crash.md
Conclusion:
- this is most likely an upstream Guile/gnulib ABI bug on FreeBSD, not a Guix-specific problem
- likely sequence:
- gnulib enables
REPLACE_POSIX_SPAWN=1 - Guile still enables
HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSEFROM_NP - Guile passes a gnulib replacement
posix_spawn_file_actions_tobject to nativeposix_spawn_file_actions_addclosefrom_np - libc interprets gnulib struct fields as a native pointer and crashes
- gnulib enables
- evidence from the lldb core matches this hypothesis (
*fa = 0x0000000600000008, consistent with gnulib_allocated=8,_used=6)
Current assessment:
- Phase 1.1 amd64 investigation is now much stronger and has a concrete root-cause hypothesis
- the next practical step is to validate a workaround or patch in Guile so subprocess helpers stop crashing
- after that, continue with Phase 1.2 (minimal native build environment / GNU Hello)
2026-04-01 — Phase 1.1 follow-up: local Guile build validated the fix
Completed work:
- installed the additional build tooling needed for a local Guile checkout build:
autoconfautomakelibtoolgettext-toolstexinfohelp2mangperfpkgconf
- confirmed a FreeBSD-specific bootstrap quirk:
- Guile
autogen.shneeds GNUm4 - FreeBSD base
/usr/bin/m4is not sufficient M4=gm4 ./autogen.shworks
- Guile
- built a disposable validation copy from
~/repos/guile - confirmed
~/repos/guilealready contains upstream commit:eb828801f621d3e130b6fe88cfc4acaa69b98a03Don't use posix_spawn_file_actions_addclosefrom_np with glib posix_spawn
- updated the local test harnesses so they can test non-system Guile builds:
tests/guile/run-phase1-verification.shtests/guile/run-subprocess-diagnostics.sh- both now accept
GUILE_BIN - both now prepend the sibling
../libdirectory toLD_LIBRARY_PATHwhen a matching locallibguile-3.0.so.1exists - subprocess diagnostics now supports
EXPECT_GUILE_SUBPROCESS_CRASH=0for fixed builds
- validated that the packaged Guile still reproduces the crash
- validated that the locally built Guile succeeds for:
system*spawnopen-pipe*
- re-ran the broader Phase 1.1 Scheme verification suite successfully against the local Guile build
- wrote the results to
docs/reports/phase1-guile-local-build-validation.md
Important findings:
- the local Guile executable initially still crashed until it was forced to load its matching local
libguile-3.0.so.1 - once
LD_LIBRARY_PATHpointed at the local install lib directory, subprocess helpers worked correctly - this strongly supports the earlier diagnosis and shows that the upstream Guile fix resolves the problem in practice
- the local
~/repos/bdwgccheckout was not needed for this step; packagedboehm-gc-threadedwas sufficient so far
Current assessment:
- Phase 1.1 now has both a root-cause analysis and a working validated fix path on amd64
- no source changes were needed in
~/repos/guilebecause the local checkout already contains the relevant upstream fix - no source changes were needed in
~/repos/bdwgcyet, but the earlier FreeBSD warning keeps it on the watch list - the project can now move on to Phase 1.2 with a known-good local Guile fallback
2026-04-01 — Phase 1.2 started: native GNU Hello build validated on FreeBSD
Completed work:
- added a reusable native build harness:
tests/native-build/run-gnu-hello.sh
- used the current Guix package definition in
~/repos/guix/gnu/packages/base.scmas the source of truth for:- GNU Hello version
2.12.3 - expected Guix nix-base32 source hash
183a6rxnhixiyykd7qis0y9g9cfqhpkk872a245y3zl28can0pqd
- GNU Hello version
- verified the downloaded tarball against the translated SHA256:
0d5f60154382fee10b114a1c34e785d8b1f492073ae2d3a6f7b147687b366aa0
- successfully executed the standard native build lifecycle on
FreeBSD 15.0-STABLEamd64:- fetch
- hash verification
- extract
- configure
- build
- staged install
- runtime execution
- confirmed the staged binary runs and prints:
Hello, world!
- captured build metadata including:
- compiler and make versions
- host triplet
- configure command
- staged output path
- runtime shared-library dependencies
- wrote the results to
docs/reports/phase1-native-gnu-hello.md
Important findings:
- GNU Hello built successfully with FreeBSD base
make, not justgmake - that contrasts with the earlier local Guile build, which did require GNU
gmake - even this minimal GNU package links against FreeBSD-userland-provided libraries such as
libiconvandlibintl, which is useful data for later Guix package modeling - this step is still a native shell-driven build exercise, not yet a real Guix package build
Current assessment:
- Phase 1.2 now has a concrete native autotools success case on FreeBSD
- the host can perform the basic fetch/verify/configure/build/install/run cycle needed for later
gnu-build-systemadaptation work - Guix-specific build orchestration is still missing, but the environmental baseline is stronger now
Recent commits:
e380e88—Add FreeBSD Guile verification harnesscd721b1—Update progress after Guile verification27916cb—Diagnose Guile subprocess crash on FreeBSD02f7a7f—Validate local Guile fix on FreeBSD
Next recommended step:
- extend Phase 1.2 with at least one additional representative GNU/autotools package build on FreeBSD, or
- prototype a tiny Scheme-based
gnu-build-system-like phase runner using the known-good local Guile path, starting from the GNU Hello flow - continue keeping
~/repos/bdwgcin reserve if later FreeBSD-specific GC/thread issues appear
2026-04-01 — Phase 1.2 follow-up: Guix builder-side GNU Hello phase runner validated
Completed work:
- added a Scheme-driven GNU Hello build prototype:
tests/native-build/gnu-hello-guix-phase-runner.scmtests/native-build/run-gnu-hello-guix-phase-runner.sh
- required the previously validated fixed local Guile build for this harness because it depends on subprocess-heavy Scheme operations
- used Guix modules directly from
~/repos/guix, including:(guix base32)(guix build gnu-build-system)(guix build utils)
- fetched and hash-verified GNU Hello
2.12.3again against the Guix package hash:- nix-base32:
183a6rxnhixiyykd7qis0y9g9cfqhpkk872a245y3zl28can0pqd - SHA256:
0d5f60154382fee10b114a1c34e785d8b1f492073ae2d3a6f7b147687b366aa0
- nix-base32:
- successfully executed a subset of Guix builder-side
%standard-phaseson FreeBSD:set-SOURCE-DATE-EPOCHunpackconfigurebuildcheckinstall
- installed GNU Hello into a store-like output path under the temporary work directory rather than using a
/usr/localDESTDIRstaging layout - executed the resulting binary successfully and confirmed output:
Hello, world!
- captured metadata including:
- host triplet
- selected phase list
- runtime dependencies
- test-suite summary
- wrote the results to
docs/reports/phase1-guix-gnu-hello-phase-runner.md
Important findings:
- this is the first validation step in the repo that successfully exercised actual Guix builder-side GNU build logic on FreeBSD instead of only a shell approximation
- the harness works when driven by the fixed local Guile build, confirming that the earlier Guile subprocess-fix validation is directly useful for FreeBSD Guix build orchestration
- GNU Hello's
make checktest suite also passed in this mode:- total:
7 - pass:
7 - fail:
0
- total:
- the resulting binary's runtime dependencies differ from the earlier
/usr/local-prefixed native shell harness; in this store-like output layout it only showed:libc.so.7libsys.so.7
- that difference is a useful clue that Guix-style output layout/build invocation can materially affect FreeBSD runtime linkage behavior
Current assessment:
- Phase 1.2 now has both:
- a shell-driven native GNU Hello build harness, and
- a Scheme-driven prototype that uses real Guix builder-side GNU phases
- this is still short of a true Guix package/derivation build, but it significantly narrows the gap between host validation and real
gnu-build-systemexecution on FreeBSD - the known-good local Guile path is now validated as part of a practical Guix-adjacent build workflow, not just standalone subprocess diagnostics
Recent commits:
e380e88—Add FreeBSD Guile verification harnesscd721b1—Update progress after Guile verification27916cb—Diagnose Guile subprocess crash on FreeBSD02f7a7f—Validate local Guile fix on FreeBSD4aebea4—Add native GNU Hello FreeBSD build harness
Next recommended step:
- run the Scheme-driven phase-runner pattern against at least one more small GNU/autotools package on FreeBSD, or
- document the concrete gaps between this prototype and a real Guix package/derivation build, especially around store management and build isolation
- continue keeping
~/repos/bdwgcin reserve if later FreeBSD-specific GC/thread issues appear