Port every package to package-v2 and give libxml2 back to Emacs
Dependencies are now sibling package VALUES. editors.sgl says dependencies: (list ncurses) and (list ncurses zlib libxml2 sqlite tree-sitter), imported from the modules that define them. The sealed object records a (name, package-identity) pair and the engine turns that into a realized output hash only when it constructs the build, so publishing a dependency tree is one channel publish instead of a human transcribing store-local hashes between topological levels.
(core outputs) is deleted. Its header explained at length why the values in it were not the same kind of thing as core-buildenv -- uncomputable without building, never checked against the package they were named after, wrong on any other machine or store root. All of that is now structurally impossible rather than documented.
ncurses declares search-paths: (("CPATH" . "include/ncursesw")). The generic builder used to emit -I<dep>/include/ncursesw for every dependency of every package -- one package's directory layout compiled into every other package's command line. It says it itself now. Measured, on the channel-built ncurses: include/ contains nothing but the ncursesw/ subdirectory, so zig cc -I<ncurses>/include -c on a file including <curses.h> fails with 'curses.h' file not found, and the same command with CPATH set succeeds. The export is load-bearing, not decorative.
Phase arguments use ${out}. It expands to exactly the string the old /out and /tmp/sigil/build/out spellings did, so for every existing argument this is a rename with no behavioural change.
libxml2 carries the channel's first patch, and Emacs is --with-xml2 again.
The port had to write --without-xml2 and say so in a comment, because the seed's pkgconf 1.9.5 ABORTS on any .pc file with an empty dependency-list field and libxml2 installs Requires: empty. Emacs finds libxml2 through PKGCHECKMODULES, which reads any non-zero status as "not present", so a crashing tool impersonated a calm absence and configure still exited 0. The build silently produced an Emacs missing a feature its own definition asked for.
The patch deletes the Requires line from libxml-2.0.pc.in, before configure ever substitutes it, so no empty field is generated. Measured against the seed's own pkg-config, both directions: with the empty field, --exists libxml-2.0 exits 134 with a Zig pointer-overflow panic; with the line gone it exits 0 and --cflags --libs returns exactly what Emacs needs.
This fixes libxml2 and nothing else. gnutls' closure is found the same way and will hit the same wall; the general fix is a seed re-pin onto a pkgconf past the bug, which is still owed.
The patch lives under src/, which is the signed unit, so the existing source-closure hash authenticates it -- editing it makes sigil channel check report stale artifacts. The realizer also re-hashes it against the recorded sha256 before use, and that is not belt-and-braces: busybox patch exits 0 on a corrupted, hunkless patch file, so the sha is the only thing between a mangled patch and a quietly unpatched build.
Republished with the TEST key (445EB31E44E11C34) only. Snapshot sequence 7 -> 8, registry seq 515/516. Superseded objects/ pruned: 18 on disk, 9 kept by the catalogue, 9 removed, and the channel still verifies clean afterwards.
Rebuilt all nine bindings from scratch in a truly cold store -- XDGCACHEHOME and --store both fresh, zero items present at the start -- in 816s, and ran one real operation per package rather than a version banner.
channel.catalogue.sgl | 20 +++++++--------
channel.catalogue.sgl.minisig | 6 ++---
objects/0ce8358539b08b08b5fa371db7285f5476de4d16e91e595e11efb51b3a782e62.sgl | 1 +
objects/27ff3f5f94dd23996dd7d8f771672a6eeaaf68a16b445b5185b73dd802eb1563.sgl | 1 +
objects/350a3b31937cea8b40e29b10c3120b70c646f2c4dc1507b33ab870f532ab7265.sgl | 1 -
objects/39a80e18e85b9f228b147d47a3243c0276f639e30f72d841320abbeedc28900a.sgl | 1 -
objects/4b55a7c1959668ea8fd26c702350a1640deb4d360bc6877f14985da587552ca7.sgl | 1 -
objects/4dae8c22fafe6d9b7a5a2afc008f6b2966a985da20c589d4dff4e551f43716ab.sgl | 1 +
...0a30847b070ffb09e397182d2ef50eda2ceb3fded2a58.sgl => 6e0dbd2843d3455641c71d3bf58820a71e87fd3db48efd35aff92649d269a185.sgl} | 2 +-
objects/742abcb95f5fd47c50a61f3be7c690fa74eb9ee1dd79dc8ed7f51112c04464b1.sgl | 1 +
objects/870ba86f60d2a5663ebf7208e9d7335ace0f824d7491b82c4eaedcb2be1655e7.sgl | 1 -
objects/8effb861ef78508caec490398edbfee1f329e40eb3bef05a08668b6d488d31fc.sgl | 1 +
objects/90fc3c5e9b0c35deada7f219417fb5d64f27d2cf88564c46ede646a7a3721a7e.sgl | 1 -
objects/c42a467516e51a842439971ea106c4da137fbe3a8824e66daede6e4fae247db4.sgl | 1 +
objects/cc4c7518170d4f5db3c72025a429c57c83e8d07244c06f922a0e2af3ffd9120c.sgl | 1 -
objects/e803a7f68e4a55eac49be30b3dc84855749037be91aa48ec7315f73dd5c0d1b3.sgl | 1 -
objects/e8374dee05f0fda96f07b639c83bbe6daa8abdfeefaa12c28a6311f033a9a6ed.sgl | 1 +
objects/ef59035716fe957378c12680f11c954a9eb93202214cfb2efd86fb0f94c7abc3.sgl | 1 -
objects/f066eed1971ad83193ed52cd12f784aed6fd5da941132c5cda24135179be8ae4.sgl | 1 +
snapshot.sgl | 4 +--
snapshot.sgl.minisig | 6 ++---
src/core/outputs.sgl | 60 --------------------------------------------
src/core/packages/compression.sgl | 2 +-
src/core/packages/databases.sgl | 2 +-
src/core/packages/demo.sgl | 2 +-
src/core/packages/editors.sgl | 92 +++++++++++++++++++++++++++++++------------------------------------
src/core/packages/parsing.sgl | 17 ++++++-------
src/core/packages/terminal.sgl | 37 ++++++++++++++++++++-------
src/core/packages/xml.sgl | 34 ++++++++++++++++++++++++-
src/patches/libxml2-pc-drop-empty-requires.patch | 9 +++++++
30 files changed, 151 insertions(+), 158 deletions(-)channel.catalogue.sglmodified
(catalogue schema: 1 sequence: 7 snapshot: "core-stable@7:sha256:294dc1ea624fa9b017ab7c772736dce8637392a09424a29a6624c459c7d1afe7" channel-source: "sha256:1a799a581d3b1bf8ccb767af93363b454086ca31ca06d03e215f5655da31de8c" content-hash: "sha256:5f0d2783911a04630d731168206062742139b4d058e4355cc9d8e30f1d4981d7")(binding name: "core/binaryen" package: "sha256:014baf016eec17892f30a30847b070ffb09e397182d2ef50eda2ceb3fded2a58")(binding name: "core/emacs" package: "sha256:90fc3c5e9b0c35deada7f219417fb5d64f27d2cf88564c46ede646a7a3721a7e")(binding name: "core/hello" package: "sha256:350a3b31937cea8b40e29b10c3120b70c646f2c4dc1507b33ab870f532ab7265")(binding name: "core/libxml2" package: "sha256:cc4c7518170d4f5db3c72025a429c57c83e8d07244c06f922a0e2af3ffd9120c")(binding name: "core/ncurses" package: "sha256:e803a7f68e4a55eac49be30b3dc84855749037be91aa48ec7315f73dd5c0d1b3")(binding name: "core/sqlite" package: "sha256:39a80e18e85b9f228b147d47a3243c0276f639e30f72d841320abbeedc28900a")(binding name: "core/tree-sitter" package: "sha256:870ba86f60d2a5663ebf7208e9d7335ace0f824d7491b82c4eaedcb2be1655e7")(binding name: "core/vim" package: "sha256:ef59035716fe957378c12680f11c954a9eb93202214cfb2efd86fb0f94c7abc3")(binding name: "core/zlib" package: "sha256:4b55a7c1959668ea8fd26c702350a1640deb4d360bc6877f14985da587552ca7")(catalogue schema: 1 sequence: 8 snapshot: "core-stable@8:sha256:bb7b284dcdfc044efe56f63e09ed9930828676e221e6e66351ecf5d40999c81f" channel-source: "sha256:bda512b60d6f06d6e30e29abe866e6c6ad5df1465b806befab9e7be452610ddf" content-hash: "sha256:cac186d4ee64658e0de5a2fa315f6488ae63a1f2035cf38c4e7ddde0a881dc76")(binding name: "core/binaryen" package: "sha256:6e0dbd2843d3455641c71d3bf58820a71e87fd3db48efd35aff92649d269a185")(binding name: "core/emacs" package: "sha256:27ff3f5f94dd23996dd7d8f771672a6eeaaf68a16b445b5185b73dd802eb1563")(binding name: "core/hello" package: "sha256:8effb861ef78508caec490398edbfee1f329e40eb3bef05a08668b6d488d31fc")(binding name: "core/libxml2" package: "sha256:742abcb95f5fd47c50a61f3be7c690fa74eb9ee1dd79dc8ed7f51112c04464b1")(binding name: "core/ncurses" package: "sha256:c42a467516e51a842439971ea106c4da137fbe3a8824e66daede6e4fae247db4")(binding name: "core/sqlite" package: "sha256:0ce8358539b08b08b5fa371db7285f5476de4d16e91e595e11efb51b3a782e62")(binding name: "core/tree-sitter" package: "sha256:4dae8c22fafe6d9b7a5a2afc008f6b2966a985da20c589d4dff4e551f43716ab")(binding name: "core/vim" package: "sha256:f066eed1971ad83193ed52cd12f784aed6fd5da941132c5cda24135179be8ae4")(binding name: "core/zlib" package: "sha256:e8374dee05f0fda96f07b639c83bbe6daa8abdfeefaa12c28a6311f033a9a6ed")channel.catalogue.sgl.minisigmodified
untrusted comment: signature from minisign secret keyRUQ0HOFEHrNeRG0BDlMF6stQEny2YvB1bPIhzuImESNglLsM1uW8mcnrFMR+HgkxxDSO3CF553EUvJfIQA3vUbcFXLmj0TizlQQ=trusted comment: registry=pkg.usesigil.org path=/v1/channels/core-stable/channel.catalogue.sgl seq=514 ts=2026-07-30T22:45:00ZoYopFaBMOojOiXVf4f+sPNCCTW6QBb9nEnE8fAW2uQEITD5SNCFiGzg7aCfMtJ8H4tVHSS9L1oyFWMPctI2ZAA==RUQ0HOFEHrNeRCJB1c70nTmRB3eyOVuHoJi4Pm2bzZolie1VWjtLtl/ae04YmWEYzeCWKtOFDiYwnMrgpu+0mvbo9PIkTbnGlQE=trusted comment: registry=pkg.usesigil.org path=/v1/channels/core-stable/channel.catalogue.sgl seq=516 ts=2026-07-31T00:30:00Z8hU04PwMnnK20xdJvBfL9NQIZt20nhs2HPw46phoqdctDA7x+eBTj6rRainwWCbjHAszdCiJC2hpKWAgbiNMCQ==objects/0ce8358539b08b08b5fa371db7285f5476de4d16e91e595e11efb51b3a782e62.sgladded
(package-v2 name: "sqlite" version: "3.46.1" source: (source location: "https://www.sqlite.org/2024/sqlite-autoconf-3460100.tar.gz" sha256: "67d3fe6d268e6eaddcae3727fce58fcc8e9c53869bdd07a0c61e38ddf2965071") buildenv: "894ca74bdb03c25d79f00ce915bbe25c56eba192334963c69e1846e6c84526cb" toolchain: #f dependencies: () build-inputs: () env: () search-paths: () phases: ((phase kind: configure args: ("--prefix=${out}" "--disable-shared" "--enable-static" "--disable-readline") patches: ()) (phase kind: make args: () patches: ()) (phase kind: install args: () patches: ())) divergences: ())objects/27ff3f5f94dd23996dd7d8f771672a6eeaaf68a16b445b5185b73dd802eb1563.sgladded
(package-v2 name: "emacs" version: "30.2" source: (source location: "https://ftp.gnu.org/gnu/emacs/emacs-30.2.tar.xz" sha256: "b3f36f18a6dd2715713370166257de2fae01f9d38cfe878ced9b1e6ded5befd9") buildenv: "894ca74bdb03c25d79f00ce915bbe25c56eba192334963c69e1846e6c84526cb" toolchain: #f dependencies: ((dep name: "libxml2" identity: "742abcb95f5fd47c50a61f3be7c690fa74eb9ee1dd79dc8ed7f51112c04464b1") (dep name: "ncurses" identity: "c42a467516e51a842439971ea106c4da137fbe3a8824e66daede6e4fae247db4") (dep name: "sqlite" identity: "0ce8358539b08b08b5fa371db7285f5476de4d16e91e595e11efb51b3a782e62") (dep name: "tree-sitter" identity: "4dae8c22fafe6d9b7a5a2afc008f6b2966a985da20c589d4dff4e551f43716ab") (dep name: "zlib" identity: "e8374dee05f0fda96f07b639c83bbe6daa8abdfeefaa12c28a6311f033a9a6ed")) build-inputs: () env: () search-paths: () phases: ((phase kind: configure args: ("--prefix=${out}" "--disable-build-details" "--with-tree-sitter" "--with-modules" "--with-xml2" "--without-x" "--with-x-toolkit=no" "--without-xft" "--without-harfbuzz" "--without-libotf" "--without-m17n-flt" "--without-cairo" "--without-lcms2" "--without-gif" "--without-jpeg" "--without-png" "--without-rsvg" "--without-tiff" "--without-webp" "--without-xpm" "--without-dbus" "--without-gsettings" "--without-libsystemd" "--without-selinux" "--without-sound" "--without-gnutls" "--without-gpm" "--without-pop" "--without-mailutils") patches: ()) (phase kind: make args: () patches: ()) (phase kind: install args: () patches: ())) divergences: ((divergence file-glob: "libexec/emacs/*/*.pdmp" max-differing-bytes: 64)))objects/350a3b31937cea8b40e29b10c3120b70c646f2c4dc1507b33ab870f532ab7265.sgldeleted
(package-v1 name: "hello" version: "2.12.2" source: (source location: "https://ftp.gnu.org/gnu/hello/hello-2.12.2.tar.gz" sha256: "5a9a996dc292cc24dcf411cee87e92f6aae5b8d13bd9c6819b4c7a9dce0818ab") buildenv: "894ca74bdb03c25d79f00ce915bbe25c56eba192334963c69e1846e6c84526cb" dependencies: () phases: ((phase kind: configure args: ("--prefix=/out") patches: ()) (phase kind: make args: () patches: ()) (phase kind: install args: () patches: ())) divergences: ())objects/39a80e18e85b9f228b147d47a3243c0276f639e30f72d841320abbeedc28900a.sgldeleted
(package-v1 name: "sqlite" version: "3.46.1" source: (source location: "https://www.sqlite.org/2024/sqlite-autoconf-3460100.tar.gz" sha256: "67d3fe6d268e6eaddcae3727fce58fcc8e9c53869bdd07a0c61e38ddf2965071") buildenv: "894ca74bdb03c25d79f00ce915bbe25c56eba192334963c69e1846e6c84526cb" dependencies: () phases: ((phase kind: configure args: ("--prefix=/out" "--disable-shared" "--enable-static" "--disable-readline") patches: ()) (phase kind: make args: () patches: ()) (phase kind: install args: () patches: ())) divergences: ())objects/4b55a7c1959668ea8fd26c702350a1640deb4d360bc6877f14985da587552ca7.sgldeleted
(package-v1 name: "zlib" version: "1.3.1" source: (source location: "https://zlib.net/fossils/zlib-1.3.1.tar.gz" sha256: "9a93b2b7dfdac77ceba5a558a580e74667dd6fede4585b91eefb60f03b72df23") buildenv: "894ca74bdb03c25d79f00ce915bbe25c56eba192334963c69e1846e6c84526cb" dependencies: () phases: ((phase kind: configure args: ("--prefix=/out") patches: ()) (phase kind: make args: () patches: ()) (phase kind: install args: () patches: ())) divergences: ())objects/4dae8c22fafe6d9b7a5a2afc008f6b2966a985da20c589d4dff4e551f43716ab.sgladded
(package-v2 name: "tree-sitter" version: "0.24.7" source: (source location: "https://github.com/tree-sitter/tree-sitter/archive/refs/tags/v0.24.7.tar.gz" sha256: "7cbc13c974d6abe978cafc9da12d1e79e07e365c42af75e43ec1b5cdc03ed447") buildenv: "894ca74bdb03c25d79f00ce915bbe25c56eba192334963c69e1846e6c84526cb" toolchain: #f dependencies: () build-inputs: () env: () search-paths: () phases: ((phase kind: make args: ("PREFIX=${out}") patches: ()) (phase kind: install args: ("PREFIX=${out}") patches: ())) divergences: ())objects/014baf016eec17892f30a30847b070ffb09e397182d2ef50eda2ceb3fded2a58.sgl → objects/6e0dbd2843d3455641c71d3bf58820a71e87fd3db48efd35aff92649d269a185.sglrenamed
(package-v1 name: "binaryen" version: "112" source: (source location: "https://github.com/WebAssembly/binaryen/releases/download/version_112/binaryen-version_112-x86_64-linux.tar.gz" sha256: "25a94f8129a532b4d84b6fa305ae630bcbd379d56416c895b3daa48d5fb2523e") buildenv: "894ca74bdb03c25d79f00ce915bbe25c56eba192334963c69e1846e6c84526cb" dependencies: () phases: ((phase kind: install-tree args: () patches: ())) divergences: ())(package-v2 name: "binaryen" version: "112" source: (source location: "https://github.com/WebAssembly/binaryen/releases/download/version_112/binaryen-version_112-x86_64-linux.tar.gz" sha256: "25a94f8129a532b4d84b6fa305ae630bcbd379d56416c895b3daa48d5fb2523e") buildenv: "894ca74bdb03c25d79f00ce915bbe25c56eba192334963c69e1846e6c84526cb" toolchain: #f dependencies: () build-inputs: () env: () search-paths: () phases: ((phase kind: install-tree args: () patches: ())) divergences: ())objects/742abcb95f5fd47c50a61f3be7c690fa74eb9ee1dd79dc8ed7f51112c04464b1.sgladded
(package-v2 name: "libxml2" version: "2.13.5" source: (source location: "https://download.gnome.org/sources/libxml2/2.13/libxml2-2.13.5.tar.xz" sha256: "74fc163217a3964257d3be39af943e08861263c4231f9ef5b496b6f6d4c7b2b6") buildenv: "894ca74bdb03c25d79f00ce915bbe25c56eba192334963c69e1846e6c84526cb" toolchain: #f dependencies: () build-inputs: () env: () search-paths: () phases: ((phase kind: patch args: () patches: ((channel-patch path: "patches/libxml2-pc-drop-empty-requires.patch" sha256: "386f08e511d8f45fd649aacc2a55c7fcd52bdbc9ed11fac8fc613aa63eebf441"))) (phase kind: configure args: ("--prefix=${out}" "--disable-shared" "--enable-static" "--without-python" "--without-lzma" "--without-zlib" "--without-http" "--without-modules") patches: ()) (phase kind: make args: () patches: ()) (phase kind: install args: () patches: ())) divergences: ())objects/870ba86f60d2a5663ebf7208e9d7335ace0f824d7491b82c4eaedcb2be1655e7.sgldeleted
(package-v1 name: "tree-sitter" version: "0.24.7" source: (source location: "https://github.com/tree-sitter/tree-sitter/archive/refs/tags/v0.24.7.tar.gz" sha256: "7cbc13c974d6abe978cafc9da12d1e79e07e365c42af75e43ec1b5cdc03ed447") buildenv: "894ca74bdb03c25d79f00ce915bbe25c56eba192334963c69e1846e6c84526cb" dependencies: () phases: ((phase kind: make args: ("PREFIX=/out") patches: ()) (phase kind: install args: ("PREFIX=/out") patches: ())) divergences: ())objects/8effb861ef78508caec490398edbfee1f329e40eb3bef05a08668b6d488d31fc.sgladded
(package-v2 name: "hello" version: "2.12.2" source: (source location: "https://ftp.gnu.org/gnu/hello/hello-2.12.2.tar.gz" sha256: "5a9a996dc292cc24dcf411cee87e92f6aae5b8d13bd9c6819b4c7a9dce0818ab") buildenv: "894ca74bdb03c25d79f00ce915bbe25c56eba192334963c69e1846e6c84526cb" toolchain: #f dependencies: () build-inputs: () env: () search-paths: () phases: ((phase kind: configure args: ("--prefix=${out}") patches: ()) (phase kind: make args: () patches: ()) (phase kind: install args: () patches: ())) divergences: ())objects/90fc3c5e9b0c35deada7f219417fb5d64f27d2cf88564c46ede646a7a3721a7e.sgldeleted
(package-v1 name: "emacs" version: "30.2" source: (source location: "https://ftp.gnu.org/gnu/emacs/emacs-30.2.tar.xz" sha256: "b3f36f18a6dd2715713370166257de2fae01f9d38cfe878ced9b1e6ded5befd9") buildenv: "894ca74bdb03c25d79f00ce915bbe25c56eba192334963c69e1846e6c84526cb" dependencies: ("82b7de949e90992450f57ce5b4eb0cb3f1107d3731376dc19bd56c009bf38aad" "8695c98c7ed14c29bd12a3e4bc9d0287e1d55fccb25f568662909296d8e51781" "9625c2c1a633c79836e4ad7a13c2532af92b7b423ced098ca20d31c984e54818" "b575d0e29ea3f15262d850a4732a007779037f2ba55b67153738430eb91c8736" "e7026efe2fe0fc17c068cab9bad5277f9131f6fc4d379acd2bc7373477cbb9ce") phases: ((phase kind: configure args: ("--prefix=/out" "--disable-build-details" "--with-tree-sitter" "--with-modules" "--without-x" "--with-x-toolkit=no" "--without-xft" "--without-harfbuzz" "--without-libotf" "--without-m17n-flt" "--without-cairo" "--without-lcms2" "--without-gif" "--without-jpeg" "--without-png" "--without-rsvg" "--without-tiff" "--without-webp" "--without-xpm" "--without-xml2" "--without-dbus" "--without-gsettings" "--without-libsystemd" "--without-selinux" "--without-sound" "--without-gnutls" "--without-gpm" "--without-pop" "--without-mailutils") patches: ()) (phase kind: make args: () patches: ()) (phase kind: install args: () patches: ())) divergences: ((divergence file-glob: "libexec/emacs/*/*.pdmp" max-differing-bytes: 64)))objects/c42a467516e51a842439971ea106c4da137fbe3a8824e66daede6e4fae247db4.sgladded
(package-v2 name: "ncurses" version: "6.6" source: (source location: "https://ftp.gnu.org/gnu/ncurses/ncurses-6.6.tar.gz" sha256: "355b4cbbed880b0381a04c46617b7656e362585d52e9cf84a67e2009b749ff11") buildenv: "894ca74bdb03c25d79f00ce915bbe25c56eba192334963c69e1846e6c84526cb" toolchain: #f dependencies: () build-inputs: () env: () search-paths: (("CPATH" . "include/ncursesw")) phases: ((phase kind: configure args: ("--prefix=${out}" "--without-ada" "--without-tests" "--without-cxx" "--without-cxx-binding" "--without-debug" "--disable-stripping" "--without-shared" "--with-normal" "--enable-widec" "--with-default-terminfo-dir=${out}/share/terminfo" "--with-terminfo-dirs=${out}/share/terminfo") patches: ()) (phase kind: make args: () patches: ()) (phase kind: install args: ("ticdir=${out}/share/terminfo") patches: ())) divergences: ())objects/cc4c7518170d4f5db3c72025a429c57c83e8d07244c06f922a0e2af3ffd9120c.sgldeleted
(package-v1 name: "libxml2" version: "2.13.5" source: (source location: "https://download.gnome.org/sources/libxml2/2.13/libxml2-2.13.5.tar.xz" sha256: "74fc163217a3964257d3be39af943e08861263c4231f9ef5b496b6f6d4c7b2b6") buildenv: "894ca74bdb03c25d79f00ce915bbe25c56eba192334963c69e1846e6c84526cb" dependencies: () phases: ((phase kind: configure args: ("--prefix=/out" "--disable-shared" "--enable-static" "--without-python" "--without-lzma" "--without-zlib" "--without-http" "--without-modules") patches: ()) (phase kind: make args: () patches: ()) (phase kind: install args: () patches: ())) divergences: ())objects/e803a7f68e4a55eac49be30b3dc84855749037be91aa48ec7315f73dd5c0d1b3.sgldeleted
(package-v1 name: "ncurses" version: "6.6" source: (source location: "https://ftp.gnu.org/gnu/ncurses/ncurses-6.6.tar.gz" sha256: "355b4cbbed880b0381a04c46617b7656e362585d52e9cf84a67e2009b749ff11") buildenv: "894ca74bdb03c25d79f00ce915bbe25c56eba192334963c69e1846e6c84526cb" dependencies: () phases: ((phase kind: configure args: ("--prefix=/out" "--without-ada" "--without-tests" "--without-cxx" "--without-cxx-binding" "--without-debug" "--disable-stripping" "--without-shared" "--with-normal" "--enable-widec" "--with-default-terminfo-dir=/out/share/terminfo" "--with-terminfo-dirs=/out/share/terminfo") patches: ()) (phase kind: make args: () patches: ()) (phase kind: install args: ("ticdir=/tmp/sigil/build/out/share/terminfo") patches: ())) divergences: ())objects/e8374dee05f0fda96f07b639c83bbe6daa8abdfeefaa12c28a6311f033a9a6ed.sgladded
(package-v2 name: "zlib" version: "1.3.1" source: (source location: "https://zlib.net/fossils/zlib-1.3.1.tar.gz" sha256: "9a93b2b7dfdac77ceba5a558a580e74667dd6fede4585b91eefb60f03b72df23") buildenv: "894ca74bdb03c25d79f00ce915bbe25c56eba192334963c69e1846e6c84526cb" toolchain: #f dependencies: () build-inputs: () env: () search-paths: () phases: ((phase kind: configure args: ("--prefix=${out}") patches: ()) (phase kind: make args: () patches: ()) (phase kind: install args: () patches: ())) divergences: ())objects/ef59035716fe957378c12680f11c954a9eb93202214cfb2efd86fb0f94c7abc3.sgldeleted
(package-v1 name: "vim" version: "9.1.1164" source: (source location: "https://github.com/vim/vim/archive/refs/tags/v9.1.1164.tar.gz" sha256: "101526fa580d015edc5b5fb059d8b396cd8b05c29b0ec9ceb2a8763083293979") buildenv: "894ca74bdb03c25d79f00ce915bbe25c56eba192334963c69e1846e6c84526cb" dependencies: ("8695c98c7ed14c29bd12a3e4bc9d0287e1d55fccb25f568662909296d8e51781") phases: ((phase kind: configure args: ("--prefix=/out" "--with-features=normal" "--with-tlib=ncursesw" "--enable-multibyte" "--disable-gui" "--without-x" "--disable-gtk2-check" "--disable-gnome-check" "--disable-motif-check" "--disable-athena-check" "--disable-fontset" "--disable-acl" "--disable-gpm" "--disable-canberra" "--disable-libsodium" "--disable-selinux" "--disable-nls" "--disable-netbeans" "--with-compiledby=Sigil") patches: ()) (phase kind: make args: ("VIMRCLOC=/out/share/vim" "VIMRUNTIMEDIR=/out/share/vim/vim91") patches: ()) (phase kind: install args: () patches: ())) divergences: ())objects/f066eed1971ad83193ed52cd12f784aed6fd5da941132c5cda24135179be8ae4.sgladded
(package-v2 name: "vim" version: "9.1.1164" source: (source location: "https://github.com/vim/vim/archive/refs/tags/v9.1.1164.tar.gz" sha256: "101526fa580d015edc5b5fb059d8b396cd8b05c29b0ec9ceb2a8763083293979") buildenv: "894ca74bdb03c25d79f00ce915bbe25c56eba192334963c69e1846e6c84526cb" toolchain: #f dependencies: ((dep name: "ncurses" identity: "c42a467516e51a842439971ea106c4da137fbe3a8824e66daede6e4fae247db4")) build-inputs: () env: () search-paths: () phases: ((phase kind: configure args: ("--prefix=${out}" "--with-features=normal" "--with-tlib=ncursesw" "--enable-multibyte" "--disable-gui" "--without-x" "--disable-gtk2-check" "--disable-gnome-check" "--disable-motif-check" "--disable-athena-check" "--disable-fontset" "--disable-acl" "--disable-gpm" "--disable-canberra" "--disable-libsodium" "--disable-selinux" "--disable-nls" "--disable-netbeans" "--with-compiledby=Sigil") patches: ()) (phase kind: make args: ("VIMRCLOC=${out}/share/vim" "VIMRUNTIMEDIR=${out}/share/vim/vim91") patches: ()) (phase kind: install args: () patches: ())) divergences: ())snapshot.sglmodified
(snapshot schema: 1 id: "core-stable" sequence: 7 content-hash: "sha256:294dc1ea624fa9b017ab7c772736dce8637392a09424a29a6624c459c7d1afe7")(snapshot schema: 1 id: "core-stable" sequence: 8 content-hash: "sha256:bb7b284dcdfc044efe56f63e09ed9930828676e221e6e66351ecf5d40999c81f")(toolchain id: "toolchain/zig" version: "0.16.0" recipe: "sha256:5bc02f4c7abc6055b1f5fc37c57c4b063c18f9e3431ba2cab0cc9f30f313e33b" output: "sha256:70e49664a74374b48b51e6f3fdfbf437f6395d42509050588bd49abe52ba3d00")(pkg id: "core/packages/wasm" version: "0.1.0" recipe: "sha256:1a799a581d3b1bf8ccb767af93363b454086ca31ca06d03e215f5655da31de8c")(pkg id: "core/packages/wasm" version: "0.1.0" recipe: "sha256:bda512b60d6f06d6e30e29abe866e6c6ad5df1465b806befab9e7be452610ddf")snapshot.sgl.minisigmodified
untrusted comment: signature from minisign secret keyRUQ0HOFEHrNeROhyRbNt5daUpkpKype+BfkS5FBg6xhpm1Jthyzv2m3LtE00tC16bsyDSXiXpbi+4zoBDzTjn1wxF40iedBBUQw=trusted comment: registry=pkg.usesigil.org path=/v1/channels/core-stable/snapshot.sgl seq=513 ts=2026-07-30T22:45:00ZpleqaNbjD3BA+FmxtJxZazwn9wt1BeAnMdaTJcgPut+rEUFPre5KEaDymDXHakea58T1KdqnECs/SxDYtlSYBw==RUQ0HOFEHrNeRD9l5nKsdlk5jYj408rdxlgxInDq1ehL3efYnv+cnGRTkds5ICi2X++WIuoOrqKj2xUFC4Q2b62bXzVcQOtJ7Qw=trusted comment: registry=pkg.usesigil.org path=/v1/channels/core-stable/snapshot.sgl seq=515 ts=2026-07-31T00:30:00Z6tzL2sL5uxrUxzi9yHZ1Oak1K1JAx20PFZ8ka426+VsRV6L58DgNkN0aCrEv/VJFevVFUU9eTyEZi77j6XgTDg==src/core/outputs.sgldeleted
;;; Realized dependency output identities.;;;;;; `(sigil env package)` requires every entry of a package's `dependencies:`;;; list to be a bare 64-character SHA-256 string, and `(sigil build external)`;;; resolves each one with `store-lookup-output`. A dependency is therefore;;; **the content hash of an already-realized output tree**, not the identity of;;; a sibling package. Package modules import the names below so that no;;; package definition carries a raw hash that is not an upstream artifact pin.;;;;;; READ THIS BEFORE ADDING AN ENTRY. Naming these values does not make them;;; well-behaved, and they are NOT the same kind of thing as `core-buildenv` in;;; (core build-environments):;;;;;; * `core-buildenv` pins an EXTERNAL artifact the channel consumes -- the;;; published seed tarball, whose hash is in `seed/MANIFEST` and which the;;; realizer re-verifies against the file on disk before every build. It is;;; the same category of value as a source `sha256:`.;;;;;; * The values below are PRODUCTS OF THIS CHANNEL. They cannot be computed;;; without building; nothing checks that a given hash is in fact the output;;; of the package it is named after; and, measured on 2026-07-30, they are;;; **not portable between machines or even between store locations**.;;; Building this channel's `zlib` into three different store roots produced;;; three different output hashes, because the realizer bakes the store;;; prefix into installed files (`lib/pkgconfig/zlib.pc` `prefix=` is the;;; minimal example) while `libz.a` stays byte-identical. The store prefix;;; contains the derivation hash, and the derivation record contains the;;; store root, so output identity is self-referentially store-local.;;;;;; Consequence: the hashes below are correct for a build whose store is the;;; default `$XDG_CACHE_HOME/sigil/store` (i.e. `~/.cache/sigil/store`) on;;; x86_64-linux with this channel's pinned seed and Zig toolchain, and they are;;; wrong everywhere else. They are a development convenience, not a durable;;; part of a published channel. See the task note for the API change that;;; would let a dependency be an actual package binding.(define-library (core outputs) (import (sigil core)) (export zlib-output ncurses-output libxml2-output sqlite-output tree-sitter-output) (begin ;; core/zlib 1.3.1 (define zlib-output "e7026efe2fe0fc17c068cab9bad5277f9131f6fc4d379acd2bc7373477cbb9ce") ;; core/ncurses 6.6 (define ncurses-output "8695c98c7ed14c29bd12a3e4bc9d0287e1d55fccb25f568662909296d8e51781") ;; core/libxml2 2.13.5 (define libxml2-output "b575d0e29ea3f15262d850a4732a007779037f2ba55b67153738430eb91c8736") ;; core/sqlite 3.46.1 (define sqlite-output "9625c2c1a633c79836e4ad7a13c2532af92b7b423ced098ca20d31c984e54818") ;; core/tree-sitter 0.24.7 (define tree-sitter-output "82b7de949e90992450f57ce5b4eb0cb3f1107d3731376dc19bd56c009bf38aad")))src/core/packages/compression.sglmodified
sha256: "9a93b2b7dfdac77ceba5a558a580e74667dd6fede4585b91eefb60f03b72df23") buildenv: core-buildenv phases: (list (external-phase kind: 'configure args: (list "--prefix=/out")) (external-phase kind: 'configure args: (list "--prefix=${out}")) (external-phase kind: 'make) (external-phase kind: 'install))))))src/core/packages/databases.sglmodified
phases: (list (external-phase kind: 'configure args: (list "--prefix=/out" args: (list "--prefix=${out}" "--disable-shared" "--enable-static" "--disable-readline"))src/core/packages/demo.sglmodified
sha256: "5a9a996dc292cc24dcf411cee87e92f6aae5b8d13bd9c6819b4c7a9dce0818ab") buildenv: core-buildenv phases: (list (external-phase kind: 'configure args: (list "--prefix=/out")) (external-phase kind: 'configure args: (list "--prefix=${out}")) (external-phase kind: 'make) (external-phase kind: 'install))))))src/core/packages/editors.sglmodified
;;; Terminal editors.;;;;;; vim is the first package in this channel with a real dependency, so it is;;; where the dependency-reference pattern is established: the dependency is;;; named by an imported binding from (core outputs) rather than by a raw hash;;; literal in this module. Read the header of (core outputs) before adding a;;; dependency -- the binding is a name for a realized output tree, not for the;;; sibling package, and it does not travel between machines.;;; This is where the dependency model shows itself. A dependency is now a;;; SIBLING PACKAGE VALUE -- `dependencies: (list ncurses)` -- imported from;;; another channel module like any other binding. The sealed object records a;;; (name, package-identity) pair, and the engine turns that identity into a;;; realized output hash when, and only when, it constructs the build.;;;;;; What that replaced: `dependencies:` used to be a bare SHA-256 of an;;; already-realized output tree. It could not be computed without building,;;; nothing checked it was the output of the package it was named after, and it;;; differed on every machine and in every store root -- so publishing a;;; dependency tree meant a human transcribing hashes between topological;;; levels. The `(core outputs)` module that named those hashes is gone.(define-library (core packages editors) (import (sigil core) (core build-environments) (core outputs) (core packages compression) (core packages terminal) (core packages xml) (core packages databases) (core packages parsing) (sigil env package) (sigil build external)) (export vim emacs) location: "https://github.com/vim/vim/archive/refs/tags/v9.1.1164.tar.gz" sha256: "101526fa580d015edc5b5fb059d8b396cd8b05c29b0ec9ceb2a8763083293979") buildenv: core-buildenv dependencies: (list ncurses-output) ;; ncurses' own `search-paths:` puts include/ncursesw on the compile ;; path. vim does not have to know that layout, and neither does the ;; builder any more. dependencies: (list ncurses) phases: (list (external-phase kind: 'configure args: (list "--prefix=/out" args: (list "--prefix=${out}" "--with-features=normal" "--with-tlib=ncursesw" "--enable-multibyte" "--with-compiledby=Sigil")) (external-phase kind: 'make args: (list "VIMRCLOC=/out/share/vim" "VIMRUNTIMEDIR=/out/share/vim/vim91")) args: (list "VIMRCLOC=${out}/share/vim" "VIMRUNTIMEDIR=${out}/share/vim/vim91")) (external-phase kind: 'install)))) ;; A terminal Emacs that is actually worth using, as opposed to the ;; so jansson, which Guix still lists for emacs-no-x, is not a dependency of ;; this version. ;; ;; DEPENDENCIES ARE A FLAT CLOSURE, NOT A GRAPH. The builder derives -I, ;; -L and PKG_CONFIG_PATH only from the entries listed here, so this list ;; must eventually name every transitive dependency, not just the direct ;; ones. With gnutls added that means nettle, gmp, libtasn1, libunistring ;; and p11-kit appear here too. See (core outputs). ;; Dependencies are DIRECT only; the engine computes the closure. Every ;; package listed here happens to be a leaf today, so this list is both. ;; When gnutls lands, its own module names nettle/gmp/libtasn1/libunistring/ ;; p11-kit and this list gains ONE entry, not six. ;; ;; Deliberately absent, decided rather than forgotten: ;; * native compilation (libgccjit) -- means building GCC itself, which ;; needs a multi-stage bootstrap, arbitrary build commands and ;; per-package environment control. None of the five phase kinds can ;; express any of those. It is the largest performance win in the ;; target set and it is not reachable in this model. ;; * libxml2 -- BLOCKED BY A BUG IN THE PINNED SEED, not by choice. The ;; seed's pkgconf 1.9.5 aborts (SIGABRT, Zig pointer-overflow panic) on ;; any .pc file containing an EMPTY dependency-list field, and libxml2 ;; installs `Requires:` empty. Emacs finds libxml2 through ;; PKG_CHECK_MODULES, reads the crash as "not present", and CONFIGURE ;; STILL EXITS 0 -- so leaving this to the default would silently ;; produce an Emacs without a feature the definition asked for. Saying ;; --without-xml2 makes the absence a stated fact instead. ;; The remedy is known and was verified: setting LIBXML2_CFLAGS and ;; LIBXML2_LIBS makes PKG_CHECK_MODULES skip pkg-config entirely, and ;; detection then succeeds. It cannot be written here, because those ;; values need libxml2's own store prefix and **a phase argument has no ;; way to name a dependency's path** -- `replace-prefix` only rewrites ;; /out to the package's OWN prefix. Flip this back to the default the ;; day the seed's pkgconf is fixed. ;; * gnutls and gpm -- not yet ported; the flags below flip to ;; --with-gnutls / --with-gpm once they land. NOTE that gnutls is also ;; found via PKG_CHECK_MODULES, so it is exposed to the same seed bug if ;; its .pc or anything in its Requires chain has an empty field. ;; needs a multi-stage bootstrap and a per-package toolchain. The ;; format can express both now; whether GCC bootstraps under `zig cc` ;; is unmeasured, so it stays out until someone measures it. ;; * gnutls and gpm -- not yet ported; these flags flip to --with-gnutls ;; and --with-gpm once they land. NOTE that gnutls is also found via ;; PKG_CHECK_MODULES, so any .pc in its Requires chain is exposed to the ;; same seed pkgconf bug that libxml2 needed a patch for. (define emacs (package name: "emacs" location: "https://ftp.gnu.org/gnu/emacs/emacs-30.2.tar.xz" sha256: "b3f36f18a6dd2715713370166257de2fae01f9d38cfe878ced9b1e6ded5befd9") buildenv: core-buildenv dependencies: (list ncurses-output zlib-output libxml2-output sqlite-output tree-sitter-output) dependencies: (list ncurses zlib libxml2 sqlite tree-sitter) ;; A portable dump is a memory image written once the build root is ;; known. external-normalize-build-root! pads build-root strings inside ;; outputs, but it cannot make a dump bit-identical across two runs, so phases: (list (external-phase kind: 'configure args: (list "--prefix=/out" args: (list "--prefix=${out}" ;; omit host name and build date from the ;; binary; this channel cares about ;; reproducibility more than about `M-x ;; features we are deliberately turning ON "--with-tree-sitter" "--with-modules" ;; This was --without-xml2 in the port, blocked ;; by the seed's pkgconf aborting on libxml2's ;; empty `Requires:` field. The channel patch ;; in (core packages xml) deletes that field at ;; its source, so detection runs for real again. "--with-xml2" ;; no window system "--without-x" "--with-x-toolkit=no" "--without-tiff" "--without-webp" "--without-xpm" ;; blocked by the seed pkgconf bug above, not a ;; preference; stated so the build cannot ;; quietly differ from the definition "--without-xml2" ;; no system integration we cannot pin "--without-dbus" "--without-gsettings"src/core/packages/parsing.sglmodified
;;; channel that does not fit the configure/make/install shape the phase model;;; assumes. tree-sitter ships **no configure script** -- it is a plain;;; Makefile driven by `PREFIX`/`DESTDIR` -- so the `configure` phase is simply;;; omitted and `PREFIX=/out` is passed to both remaining phases. The builder;;; rewrites the literal `/out` in phase arguments to the real store prefix, and;;; a command-line assignment overrides the Makefile's `PREFIX ?= /usr/local`.;;; omitted and `PREFIX=${out}` is passed to both remaining phases. `${out}`;;; expands to this package's own store prefix, and a command-line assignment;;; overrides the Makefile's `PREFIX ?= /usr/local`.;;;;;; This works, but only because tree-sitter's Makefile happens to accept the;;; two variables the model already passes. A package needing an `autoreconf`,;;; a CMake configure step, or any per-package environment variable has no;;; expression in this model at all; see (core packages compilers) for the case;;; where that becomes fatal.;;; two variables the model already passes. A package needing an `autoreconf`;;; or a CMake configure step still has no expression here: `run` phases and;;; `env:` are sealed by package-v2 but refused at publish until Stage 2.(define-library (core packages parsing) (import (sigil core) (core build-environments) phases: (list ;; PREFIX is needed at build time too: `tree-sitter.pc` is ;; generated by the `all` target with the prefix baked in. (external-phase kind: 'make args: (list "PREFIX=/out")) (external-phase kind: 'install args: (list "PREFIX=/out"))))))) (external-phase kind: 'make args: (list "PREFIX=${out}")) (external-phase kind: 'install args: (list "PREFIX=${out}")))))))src/core/packages/terminal.sglmodified
location: "https://ftp.gnu.org/gnu/ncurses/ncurses-6.6.tar.gz" sha256: "355b4cbbed880b0381a04c46617b7656e362585d52e9cf84a67e2009b749ff11") buildenv: core-buildenv ;; ncurses with `--enable-widec` installs its headers ONLY into ;; `include/ncursesw/`; `include/` itself holds no headers at all ;; (measured on both built store items). A consumer compiling ;; `#include <curses.h>` therefore needs that directory on its include ;; path. ;; ;; This declaration is what replaced a hardcode. The generic builder ;; used to emit `-I<dep>/include/ncursesw` for EVERY dependency of ;; EVERY package: one package's directory layout baked into the builder ;; for all packages alike. Now ncurses says it itself, and only ;; ncurses' consumers hear it. ;; ;; CPATH rather than a `-I` flag because a search path is a path list, ;; and measured: zig cc 0.16.0 honours CPATH in both directions ;; (without it the compile fails `fatal error: 'curses.h' file not ;; found`; with it, it succeeds). search-paths: (list (cons "CPATH" "include/ncursesw")) phases: (list (external-phase kind: 'configure args: (list "--prefix=/out" args: (list "--prefix=${out}" "--without-ada" "--without-tests" "--without-cxx" "--without-shared" "--with-normal" "--enable-widec" "--with-default-terminfo-dir=/out/share/terminfo" "--with-terminfo-dirs=/out/share/terminfo")) "--with-default-terminfo-dir=${out}/share/terminfo" "--with-terminfo-dirs=${out}/share/terminfo")) (external-phase kind: 'make) ;; `ticdir` is passed as an absolute path under the staged ;; DESTDIR tree. The builder rewrites the literal prefixes ;; "/out" and "/tmp/sigil/build/out" in phase arguments to the ;; real store prefix, so this string is the portable spelling ;; of "the terminfo directory inside the staged install root". ;; ncurses' own install rule otherwise writes the compiled ;; terminfo database outside DESTDIR, so `ticdir` has to be ;; pinned. This was spelled `/tmp/sigil/build/out/...` under ;; the old model; `${out}` expands to exactly the same string ;; (the builder rewrote both `/out` and `/tmp/sigil/build/out` ;; to the package's own prefix), so this is a rename, not a ;; behaviour change. (external-phase kind: 'install args: (list "ticdir=/tmp/sigil/build/out/share/terminfo"))))))) args: (list "ticdir=${out}/share/terminfo")))))))src/core/packages/xml.sglmodified
;;; and eww. Built static and deliberately narrow: no Python bindings, no;;; loadable modules, and no HTTP client, because Emacs uses libxml2 purely as;;; a parser and its network stack is its own.;;;;;; It also carries the channel's first patch, and the reason is worth reading;;; before touching it -- see the note beside the `patch` phase.(define-library (core packages xml) (import (sigil core) (core build-environments) sha256: "74fc163217a3964257d3be39af943e08861263c4231f9ef5b496b6f6d4c7b2b6") buildenv: core-buildenv phases: (list ;; WHY THIS PATCH EXISTS. The pinned seed's pkgconf 1.9.5 ;; ABORTS (SIGABRT, a Zig pointer-overflow panic) on any .pc ;; file carrying an EMPTY dependency-list field, and libxml2 ;; installs `Requires:` empty because it is built ;; --without-zlib. Emacs finds libxml2 through ;; PKG_CHECK_MODULES, which runs `pkg-config --exists` and ;; reads ANY non-zero status as "not present" -- so a ;; crashing tool impersonates a calm, plausible absence and ;; configure still exits 0. That is how the port build lost ;; libxml2 with no error and no warning. ;; ;; Measured against the seed's own pkg-config, both ;; directions: with the empty `Requires:` line, ;; `pkg-config --exists libxml-2.0` exits 134 with the panic; ;; with the line deleted it exits 0 and `--cflags --libs` ;; returns exactly what Emacs needs. ;; ;; This patch deletes the line from the TEMPLATE, before ;; configure substitutes it, so no empty field is ever ;; generated. It fixes libxml2 only. The general fix is a ;; seed re-pin onto a pkgconf past the bug ;; (investigations/seed-pkgconf-empty-field-abort), which is ;; still owed -- gnutls' closure will hit the same wall. (external-phase kind: 'patch patches: (list (channel-patch path: "patches/libxml2-pc-drop-empty-requires.patch" sha256: "386f08e511d8f45fd649aacc2a55c7fcd52bdbc9ed11fac8fc613aa63eebf441"))) (external-phase kind: 'configure args: (list "--prefix=/out" args: (list "--prefix=${out}" "--disable-shared" "--enable-static" "--without-python"src/patches/libxml2-pc-drop-empty-requires.patchadded
--- a/libxml-2.0.pc.in+++ b/libxml-2.0.pc.in@@ -7,6 +7,5 @@ Name: libXML Version: @VERSION@ Description: libXML library version2.-Requires@XML_PC_PRIVATE@: @XML_PC_REQUIRES@ Libs: -L${libdir} @XML_LIBS@ @XML_PC_LIBS_PRIVATE@ @XML_PC_LIBS@ @LIBS@ Cflags: @XML_INCLUDEDIR@ @XML_CFLAGS@