5.1 KiB
Phase 20.1: Fruix-managed development environment for native FreeBSD base work
Date: 2026-04-05
Goal
Validate that a booted Fruix-managed FreeBSD system can expose a usable development environment for deeper native base work without collapsing the runtime/development boundary back into one broad profile.
This step explicitly builds on the Phase 14 split between:
- native runtime/boot artifacts for the running system
- separate development-facing artifacts such as headers and toolchain pieces
The goal is not full self-hosting yet.
It is to prove that a running Fruix system can expose the tools and paths needed for native FreeBSD build work in a controlled way.
Implementation
New operating-system field
modules/fruix/system/freebsd/model.scm now supports:
#:development-packagesoperating-system-development-packages
The default remains empty, so existing systems do not change unless they opt in.
Separate development profile inside the system closure
modules/fruix/system/freebsd/media.scm now materializes an additional profile tree when development-packages is non-empty:
/frx/store/...-fruix-system-.../development-profile
The main runtime tree remains:
/frx/store/...-fruix-system-.../profile
This preserves the runtime/development split:
- runtime stays under
profile - development tooling stays under
development-profile
The development stores are also now part of the closure references and recorded in metadata/store-layout.scm.
In-guest development environment helper
Opt-in systems with development packages now ship:
/usr/local/bin/fruix-development-environment
and expose a stable runtime link:
/run/current-development -> /run/current-system/development-profile
The helper emits shell exports for the active development profile, including at least:
FRUIX_DEVELOPMENT_PROFILEFRUIX_DEVELOPMENT_INCLUDEFRUIX_DEVELOPMENT_SHARE_MKFRUIX_CCFRUIX_CXXFRUIX_ARFRUIX_RANLIBFRUIX_NMFRUIX_BMAKECPPFLAGSMAKEFLAGSPATH
Intended use:
eval "$(/usr/local/bin/fruix-development-environment)"
Chosen development overlay for this phase
For the validated Phase 20.1 guest path, the development overlay is intentionally narrow:
freebsd-native-headersfreebsd-clang-toolchain
This was chosen deliberately.
The earlier standalone Phase 14 development-profile package set was designed for broad profile composition, but for a running Fruix system it unnecessarily duplicated runtime pieces already present in the system profile.
For native base work, the important additions here are:
usr/includeusr/share/mk- Clang/binutils-style frontend tools
while the running system already supplies:
- base runtime
/usr/bin/make- system libraries and boot/runtime state
That keeps the Phase 20.1 environment focused on native base development rather than reintroducing a broad mixed profile.
New files
Added:
tests/system/phase20-development-operating-system.scm.intests/system/run-phase20-development-environment-xcpng.sh
Validation
Passing run:
PASS phase20-development-environment-xcpng- workdir:
/tmp/fruix-phase20-development-xcpng
Validated on the approved real XCP-ng path:
- VM
90490f2e-e8fc-4b7a-388e-5c26f0157289 - VDI
0f1f90d3-48ca-4fa2-91d8-fc6339b95743
Representative result:
closure_path=/frx/store/c0ad43d7ef72323d4270a4f1e96ca1f5cc99566c-fruix-system-fruix-freebsd
development_profile_path=/frx/store/c0ad43d7ef72323d4270a4f1e96ca1f5cc99566c-fruix-system-fruix-freebsd/development-profile
development_profile_guest=/run/current-system/development-profile
cc_version=FreeBSD clang version 19.1.7 (https://github.com/llvm/llvm-project.git llvmorg-19.1.7-0-gcd708029e0b2)
hello_direct=hello-from-direct-dev-env
hello_make=hello-from-make-dev-env
development_environment=ok
The harness verified all of the following on the real booted Fruix guest:
- runtime boot/regression still succeeds on XCP-ng
- the closure contains a separate
development-profile - runtime
profiledoes not regain headers orusr/share/mk /usr/local/bin/fruix-development-environmentexists and emits the expected exports/run/current-developmentpoints at/run/current-system/development-profile- direct compilation works with the exported Clang toolchain and headers
- a simple native FreeBSD
makebuild using.include <bsd.prog.mk>also succeeds
Result
Phase 20.1 is complete.
Fruix now validates a real booted FreeBSD system path where:
- the running system remains lean and runtime-focused
- native development artifacts are exposed separately and explicitly
- the guest can compile code directly with the Fruix-provided toolchain
- the guest can also drive a simple
bsd.prog.mkbuild using the exported development environment
This is enough to say that Fruix can host a controlled native FreeBSD base-development environment, without yet claiming full self-hosting.
Next step
Per docs/PLAN_4.md, the next planned step is:
- Phase 20.2 — run host-initiated native base builds inside a Fruix-managed environment