Files
fruix/docs/reports/phase1-guix-checkout-configure-stack-freebsd.md

7.1 KiB

Phase 1.2 follow-up: remaining Guix checkout Guile prerequisites built on FreeBSD; next blocker is ./pre-inst-env guix --version

Date: 2026-04-01

Summary

This step cleared the remaining mandatory Guile module prerequisites needed by a Guix checkout configure --with-courage run on FreeBSD, and then pushed the checkout investigation past configuration into the next executable boundary.

Added/updated files:

  • tests/guix/build-local-guile-configure-deps.sh
  • updated tests/guix/run-derivation-generation-investigation.sh

The result is:

  1. the remaining required checkout-time Guile modules can be built successfully on FreeBSD against the fixed local Guile build
  2. configure --with-courage now succeeds when run with MAKE=gmake
  3. gmake scripts/guix also succeeds
  4. the next concrete blocker is no longer a missing Guile module; it is a runtime failure from ./pre-inst-env guix --version

Inputs used

Local Guile

The same fixed local Guile build was used:

  • /tmp/guile-freebsd-validate-install/bin/guile

Shared local dependency prefix

This step continued using the shared local prefix already created by earlier prerequisite work:

  • /tmp/guile-gnutls-freebsd-validate-install

At this point the prefix contains at least:

  • Guile-GnuTLS
  • Guile bytestructures
  • Guile-Git
  • Guile-JSON
  • Guile-SQLite3
  • Guile-Gcrypt
  • Guile-zlib
  • Guile-lzlib
  • Guile-semver

Host-side packages installed for this step

This step installed the missing C library dependencies required by the remaining Guile extension stack:

sudo pkg install -y libgcrypt lzlib

Installed host packages included:

  • libgcrypt 1.12.0
  • libgpg-error 1.59
  • lzlib 1.16

The host already had:

  • sqlite3 3.50.4

Guix source-of-truth package definitions used

This step used the current Guix package definitions in:

  • ~/repos/guix/gnu/packages/guile.scm
  • ~/repos/guix/gnu/packages/gnupg.scm
  • ~/repos/guix/gnu/packages/guile-xyz.scm

Packages built:

  • guile-sqlite3 0.1.3
  • guile-gcrypt 0.5.0
  • guile-zlib 0.2.2
  • guile-lzlib 0.3.0
  • guile-semver 0.2.0

Resolved Git commits recorded by the harness:

  • guile-sqlite3 tag v0.1.3
    • 9405dda61347ff26c57e3be7531dc9dc5a19cf40
  • guile-gcrypt tag v0.5.0
    • 1b637955d40b206d2bdebed5443a545a0412f813
  • guile-semver tag v0.2.0
    • 607ca84c24b8950fdb5aca73e9d53d924e49fc24

Verified tarball hashes:

  • guile-zlib 0.2.2
    • Guix nix-base32: 04p9lb3bq5y0k358s8agpksx9x68vzx330cb8jkn4qp3qj7cmnx2
    • SHA256: a2dbca8ec4e36262a7448b8131fadfc8f4d4f5bc4f218dca98c017bcc6a2e912

Important FreeBSD-specific findings

1. guile-gcrypt needed an explicit libgcrypt prefix on this host

guile-gcrypt configure failed initially because its libgcrypt-config --libs parsing logic derived an unusable dynamic library name on FreeBSD when /usr/local/bin/libgcrypt-config emitted both -lgcrypt and -lgpg-error.

For local validation, configuring with:

--with-libgcrypt-prefix=/usr/local

resolved that issue cleanly.

2. Current guile-lzlib source URL no longer matches the Guix hash

The current upstream tarball at:

https://codeberg.org/guile-compression/guile-lzlib/archive/0.3.0.tar.gz

produced this SHA256 on the host:

6a2847a303a141bb95b1b5d1a4b975b4dbff9cc590eba377cc8072682e7637ec

but the current Guix package definition expects:

a7f99c8d2a143e05ea22db2dc8b9ce6c27cae942162b45ee3015ed9027af0ff2

To continue local validation, the harness fell back to the upstream Git tag matching version 0.3.0 and recorded:

  • fallback commit 474cee42116295bc0bd2acf12d4d6a766043090e

This is useful independent evidence that the currently served upstream tarball has drifted relative to the hash recorded in Guix.

3. MAKE=gmake is required for the Guix checkout configure/build path here

Once the remaining Guile modules were available, the Guix checkout no longer failed on missing modules. However, configuration still failed unless it was run with GNU make selected explicitly.

Using:

MAKE=gmake

allowed configure --with-courage to complete successfully on FreeBSD.

Validation commands

Build the remaining required Guile modules

ENV_OUT=/tmp/guile-configure-deps-env.sh \
METADATA_OUT=/tmp/guile-configure-deps-metadata.txt \
./tests/guix/build-local-guile-configure-deps.sh

Re-run the checkout investigation

GUILE_EXTRA_PREFIX=/tmp/guile-gnutls-freebsd-validate-install \
METADATA_OUT=/tmp/guix-derivation-investigation-next-boundary.txt \
./tests/guix/run-derivation-generation-investigation.sh

The investigation still used the requested experimental directories:

  • store: /frx/store
  • local state: /frx/var
  • sysconf: /frx/etc

Module validation results

The remaining module checks all succeeded:

sqlite3 module check: ok
gcrypt module check: ok
zlib module check: ok
lzlib module check: ok
semver module check: ok

The prefix also still satisfied the earlier requirements:

Existing (gnutls) module in prefix: present
Existing (git) module in prefix: present
Existing (json) module in prefix: present

Updated checkout investigation result

After these module builds, the Guix checkout now behaves as follows on FreeBSD:

  1. configure without --with-courage still fails on the explicit unsupported-platform gate
  2. configure --with-courage now succeeds when run with MAKE=gmake
  3. gmake scripts/guix succeeds
  4. ./pre-inst-env guix --version prints the version banner but exits with a Scheme runtime error

Observed failure signature:

ice-9/eval.scm:619:8: Wrong type to apply: #<syntax-transformer leave-on-EPIPE>

The command still printed the expected banner first:

guix (GNU Guix) 1.5.0.7351-62b61

So the current boundary has moved past checkout configuration and script generation into runtime behavior of the uninstalled Guix command itself.

Additional observations

  • configure now reports these required modules as available and recent enough:
    • Guile-JSON
    • Guile-SQLite3
    • Guile-Gcrypt
    • Guile-Git
    • Guile-zlib
    • Guile-lzlib
    • Guile-semver
  • Guile-Lib still does not satisfy the optional versioned requirement, but that remains a warning rather than a blocker
  • Guile-SSH is still unavailable and reported as such during configure, but it also does not block this checkout path here
  • using /frx/store continues to produce the expected warning that substitutes from gnu.org will not be usable

What this step demonstrates

This step demonstrates that:

  1. the Guix checkout has now progressed beyond the long sequence of missing mandatory Guile module prerequisites on FreeBSD
  2. the next blocker is now in actual execution of the checkout command path rather than in missing configure-time dependencies
  3. the current FreeBSD boundary has advanced from “cannot configure” to “configures and builds scripts/guix, but ./pre-inst-env guix --version fails at runtime”

Investigate the leave-on-EPIPE runtime failure in the uninstalled Guix command path, while also completing the remaining Phase 1.3 syscall-interface mapping/documentation work needed to close out Phase 1 foundations.