granja: cargar cola base-system — 18 esenciales del userland foundational
Los huecos reales para una distro completa (el sistema ya está: bootstrap/ self-host/kernel/init/EFI/paquetería). Cola aislada en incoming-clib: git rsync bash ca-certificates sudo doas util-linux sed tzdata e2fsprogs dosfstools parted iproute2 iputils dhcpcd vim dbus foot. Import 18/18 (17 alpine + 1 nix), deps ya-canónicas podadas. Patches musl viajan. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Semántico sayk'uy
Mana ima sutichaypas t'ikrakurqanchu: qillqalla, yachachiylla utaq willaylla t'ikrakurqan.
58 qillqakuna · +1912 −697
- recipes/incoming-clib/0001-Use-getopt_long-for-opt-parsing-in-ping.patch +34 −0
- recipes/incoming-clib/0001-posixtz-ensure-the-file-offset-we-pass-to-lseek-is-o.patch +27 −0
- recipes/incoming-clib/0002-fix-implicit-declaration-warnings-by-including-strin.patch +28 −0
- recipes/incoming-clib/adwaita-hello.toml +0 −47
- recipes/incoming-clib/bash.toml +50 −0
- recipes/incoming-clib/busybox-logger.patch +13 −0
- recipes/incoming-clib/ca-certificates.toml +60 −0
- recipes/incoming-clib/change-PATH.patch +19 −0
- recipes/incoming-clib/configuration-directory.patch +447 −0
- recipes/incoming-clib/curl.toml +0 −21
- recipes/incoming-clib/dbus.toml +48 −0
- recipes/incoming-clib/dhcpcd.toml +54 −0
- recipes/incoming-clib/doas.toml +47 −0
- recipes/incoming-clib/dont-use-nobody.patch +15 −0
- recipes/incoming-clib/dosfstools.toml +46 −0
- recipes/incoming-clib/e2fsprogs.toml +61 −0
- recipes/incoming-clib/expat.toml +0 −14
- recipes/incoming-clib/fix-chrony-conf-location.patch +11 −0
- recipes/incoming-clib/fix-includes.patch +10 −0
- recipes/incoming-clib/fix-libintl-header-s390x.patch +58 −0
- recipes/incoming-clib/fix-t4219-with-sticky-bit.patch +48 −0
- recipes/incoming-clib/fix-truncate-tests.patch +48 −0
- recipes/incoming-clib/foot.toml +60 −0
- recipes/incoming-clib/freetype.toml +0 −22
- recipes/incoming-clib/git.toml +54 −0
- recipes/incoming-clib/gtk4-hello.toml +0 −47
- recipes/incoming-clib/gtk4.toml +0 −39
- recipes/incoming-clib/gtksourceview.toml +0 −23
- recipes/incoming-clib/hammer-edit.toml +0 −138
- recipes/incoming-clib/iproute2.toml +40 −0
- recipes/incoming-clib/iputils.toml +59 −0
- recipes/incoming-clib/libadwaita.toml +0 −22
- recipes/incoming-clib/libffi.toml +0 −42
- recipes/incoming-clib/libpng.toml +0 −16
- recipes/incoming-clib/libxkbcommon.toml +0 −16
- recipes/incoming-clib/libxml2.toml +0 −16
- recipes/incoming-clib/libyaml.toml +0 −20
- recipes/incoming-clib/make-tests.patch +50 −0
- recipes/incoming-clib/manpage-example-path.patch +16 −0
- recipes/incoming-clib/pango.toml +0 −16
- recipes/incoming-clib/parted-include-sysmacros.patch +10 −0
- recipes/incoming-clib/parted.toml +45 −0
- recipes/incoming-clib/pcre2.toml +0 −14
- recipes/incoming-clib/pixman.toml +0 −21
- recipes/incoming-clib/rowhammer.patch +73 −0
- recipes/incoming-clib/rsync.toml +62 −0
- recipes/incoming-clib/sed.toml +50 −0
- recipes/incoming-clib/skip-duplicate-bsd-test-on-s390x.patch +16 −0
- recipes/incoming-clib/skip-test-memset_explicit-on-arm.patch +17 −0
- recipes/incoming-clib/sourceview-hello.toml +0 −57
- recipes/incoming-clib/sudo.toml +62 −0
- recipes/incoming-clib/tzdata.toml +51 −0
- recipes/incoming-clib/util-linux.toml +22 −0
- recipes/incoming-clib/vim.toml +64 −0
- recipes/incoming-clib/xz.toml +0 −53
- recipes/incoming-clib/zlib.toml +0 −40
- recipes/incoming-clib/zstd.toml +0 −13
- tandas/base-system-1.txt +37 −0
diff --git a/recipes/incoming-clib/0001-Use-getopt_long-for-opt-parsing-in-ping.patch b/recipes/incoming-clib/0001-Use-getopt_long-for-opt-parsing-in-ping.patch
new file mode 100644
index 00000000..cd499f71
--- /dev/null
+++ b/recipes/incoming-clib/0001-Use-getopt_long-for-opt-parsing-in-ping.patch
@@ -0,0 +1,34 @@
+From a8591bcd8b5585e3de774a715802be3434f8cfe7 Mon Sep 17 00:00:00 2001
+From: Jens Reidel <adrian@travitia.xyz>
+Date: Fri, 5 Dec 2025 16:18:03 +0100
+Subject: [PATCH] Use getopt_long for opt parsing in ping
+
+Signed-off-by: Jens Reidel <adrian@travitia.xyz>
+---
+ ping/ping.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/ping/ping.c b/ping/ping.c
+index 1e976a9..1993fc7 100644
+--- a/ping/ping.c
++++ b/ping/ping.c
+@@ -54,6 +54,7 @@
+ #include "ping.h"
+
+ #include <assert.h>
++#include <getopt.h>
+ #include <netinet/ip.h>
+ #include <netinet/ip_icmp.h>
+ #include <ifaddrs.h>
+@@ -390,7 +391,7 @@ main(int argc, char **argv)
+ }
+
+ /* Parse command line options */
+- while ((ch = getopt(argc, argv, "h?" "4bRT:" "6F:N:" "3aABc:CdDe:fHi:I:l:Lm:M:nOp:qQ:rs:S:t:UvVw:W:")) != EOF) {
++ while ((ch = getopt_long(argc, argv, "h?" "4bRT:" "6F:N:" "3aABc:CdDe:fHi:I:l:Lm:M:nOp:qQ:rs:S:t:UvVw:W:", NULL, NULL)) != EOF) {
+ switch(ch) {
+ /* IPv4 specific options */
+ case '4':
+--
+2.52.0
+
diff --git a/recipes/incoming-clib/0001-posixtz-ensure-the-file-offset-we-pass-to-lseek-is-o.patch b/recipes/incoming-clib/0001-posixtz-ensure-the-file-offset-we-pass-to-lseek-is-o.patch
new file mode 100644
index 00000000..c4ae70b0
--- /dev/null
+++ b/recipes/incoming-clib/0001-posixtz-ensure-the-file-offset-we-pass-to-lseek-is-o.patch
@@ -0,0 +1,27 @@
+From e6765bd363d2dd1dcaeeae5117cc25aae53fb944 Mon Sep 17 00:00:00 2001
+From: William Pitcock <nenolod@dereferenced.org>
+Date: Thu, 28 Apr 2011 02:56:42 -0500
+Subject: [PATCH 1/2] posixtz: ensure the file offset we pass to lseek is off_t
+
+on 32-bit systems, sizeof(off_t) is 4, on 64-bit sizeof(off_t) is 8
+causing a word masking issue.
+---
+ posixtz.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/posixtz.c b/posixtz.c
+index cddcb3e..972ca31 100644
+--- a/posixtz-0.5/posixtz.c
++++ b/posixtz-0.5/posixtz.c
+@@ -36,7 +36,7 @@ char *posix_tz(const char *filename)
+ if (r != TZ_BUFLEN
+ || strncmp(buf, "TZif", 4) != 0
+ || (unsigned char)buf[4] < 2
+- || lseek(fd, -TZ_BUFLEN, SEEK_END) < 0
++ || lseek(fd, (off_t) -TZ_BUFLEN, SEEK_END) < 0
+ )
+ goto ERROR;
+
+--
+2.16.2
+
diff --git a/recipes/incoming-clib/0002-fix-implicit-declaration-warnings-by-including-strin.patch b/recipes/incoming-clib/0002-fix-implicit-declaration-warnings-by-including-strin.patch
new file mode 100644
index 00000000..6f61b25b
--- /dev/null
+++ b/recipes/incoming-clib/0002-fix-implicit-declaration-warnings-by-including-strin.patch
@@ -0,0 +1,28 @@
+From 89d4aece7ba679703060393ac95086fd514c7fc7 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?S=C3=B6ren=20Tempel?= <soeren+git@soeren-tempel.net>
+Date: Tue, 27 Mar 2018 19:09:44 +0200
+Subject: [PATCH 2/2] fix implicit declaration warnings by including string.h
+ and unistd.h
+
+string.h is needed for strncmp(3) and unistd.h is needed for read(3),
+close(3) and lseek(3).
+---
+ posixtz.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/posixtz.c b/posixtz.c
+index 972ca31..4a36e10 100644
+--- a/posixtz-0.5/posixtz.c
++++ b/posixtz-0.5/posixtz.c
+@@ -14,6 +14,8 @@
+ #include <fcntl.h>
+ #include <limits.h>
+ #include <stdio.h>
++#include <string.h>
++#include <unistd.h>
+
+ #include "posixtz.h"
+
+--
+2.16.2
+
diff --git a/recipes/incoming-clib/adwaita-hello.toml b/recipes/incoming-clib/adwaita-hello.toml
deleted file mode 100644
index 10376968..00000000
--- a/recipes/incoming-clib/adwaita-hello.toml
+++ /dev/null
@@ -1,47 +0,0 @@
-# adwaita-hello — app Adwaita mínima de VALIDACIÓN: prueba que libadwaita-1.a es linkeable de verdad.
-# AdwApplication + AdwApplicationWindow + AdwToolbarView. Link 100% estático vía pkg-config --static
-# libadwaita-1 + las privadas de gdk/gsk/appstream que el .pc no declara. Mismo patrón que gtk4-hello.
-name = "adwaita-hello"
-version = "1.7.6"
-
-[source]
-tarball = "https://download.gnome.org/sources/libadwaita/1.7/libadwaita-1.7.6.tar.xz"
-sha256 = "5eacc5550f0bdbba6a1568aebf25a3d88f5ee07d6b558becc6fd9487579c9a29"
-
-[build]
-compiler = "zig-cc"
-target = "x86_64-linux-musl"
-link = "static"
-
-[build.phases]
-configure = "true"
-compile = '''
-cat > adw_hello.c <<'CEOF'
-#include <adwaita.h>
-static void activate(GtkApplication *app, gpointer user_data) {
- GtkWidget *win = adw_application_window_new(app);
- gtk_window_set_title(GTK_WINDOW(win), "Adwaita en hammer");
- gtk_window_set_default_size(GTK_WINDOW(win), 400, 260);
- GtkWidget *toolbar = adw_toolbar_view_new();
- adw_toolbar_view_add_top_bar(ADW_TOOLBAR_VIEW(toolbar), adw_header_bar_new());
- GtkWidget *status = adw_status_page_new();
- adw_status_page_set_title(ADW_STATUS_PAGE(status), "libadwaita static-musl ✓");
- adw_toolbar_view_set_content(ADW_TOOLBAR_VIEW(toolbar), status);
- adw_application_window_set_content(ADW_APPLICATION_WINDOW(win), toolbar);
- gtk_window_present(GTK_WINDOW(win));
-}
-int main(int argc, char **argv) {
- AdwApplication *app = adw_application_new("org.hammer.adw", G_APPLICATION_DEFAULT_FLAGS);
- g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);
- int status = g_application_run(G_APPLICATION(app), argc, argv);
- g_object_unref(app);
- return status;
-}
-CEOF
-export PKG_CONFIG_PATH=/usr/lib/pkgconfig
-zig cc -mcpu=baseline -static adw_hello.c -o adwaita-hello $(pkg-config --cflags --libs --static libadwaita-1 harfbuzz-subset epoxy xkbcommon wayland-client wayland-egl libtiff-4 libjpeg cairo-script-interpreter)
-'''
-install = "mkdir -p /out/usr/bin && cp adwaita-hello /out/usr/bin/adwaita-hello"
-
-[deps]
-build = ["pkgconf", "libadwaita", "appstream", "libyaml", "curl", "openssl", "libxmlb", "libxml2", "zstd", "gtk4", "pango", "gdk-pixbuf", "cairo", "graphene", "glib", "harfbuzz", "fribidi", "fontconfig", "freetype", "pixman", "libpng", "expat", "libjpeg-turbo", "libtiff", "libepoxy", "wayland", "libxkbcommon", "libdrm", "pcre2", "libffi", "zlib", "mesa"]
diff --git a/recipes/incoming-clib/bash.toml b/recipes/incoming-clib/bash.toml
new file mode 100644
index 00000000..08681cee
--- /dev/null
+++ b/recipes/incoming-clib/bash.toml
@@ -0,0 +1,50 @@
+# Importada de Alpine aports por `hammer import-alpine` (Etapa G). PUNTO DE PARTIDA — pero
+# YA trae los parches de musl de Alpine (lo que un import de nix pierde). Pendiente: el
+# sha256 del tarball (el wrapper lo calcula), y adaptar build/install del shell de abuild.
+name = "bash"
+version = "5.3.9"
+
+[source]
+tarball = "https://ftp.gnu.org/gnu/bash/bash-$_myver-patches/bash$_patchbase-$_pad$_i"
+# FIXME sha256: el wrapper lo calcula (Alpine publica sha512). sha512 de Alpine:
+# sha512 = "426702c8b0fb9e0c9956259973ce5b657890fd47f4f807a64febf20077bb48d0b91474ed6e843d2ef277186b46c5fffa79b808da9b48d4ec027d5e2de1b28ed8"
+sha256 = "FIXME-sha256"
+
+[build]
+compiler = "zig-cc"
+target = "x86_64-linux-musl"
+link = "static"
+flags = []
+
+[build.phases]
+# de build() de Alpine (traducido; el lab provee $CBUILD/$CHOST — Etapa G Fase 3; revisá --shared para estático):
+compile = '''
+_abuild_phase() {
+./configure \
+ --build=$CBUILD \
+ --host=$CHOST \
+ --prefix=/usr \
+ --bindir=/bin \
+ --mandir=/usr/share/man \
+ --infodir=/usr/share/info \
+ --with-curses \
+ --disable-nls \
+ --enable-readline \
+ --without-bash-malloc \
+ --with-installed-readline
+ # parallel build workarounds
+ make y.tab.c && make builtins/libbuiltins.a && make
+}
+_abuild_phase
+'''
+# de package() de Alpine (traducido $pkgdir→/out):
+install = '''
+_abuild_phase() {
+mkdir -p "/out"/etc/bash
+ make DESTDIR="/out" install
+ install -Dm644 "$srcdir"/bashrc "/out"/etc/bash/bashrc
+ install -Dm644 "$srcdir"/profile-bashrc.sh "/out"/etc/profile.d/00-bashrc.sh
+ rm -rf "/out"/usr/share/locale
+}
+_abuild_phase
+'''
diff --git a/recipes/incoming-clib/busybox-logger.patch b/recipes/incoming-clib/busybox-logger.patch
new file mode 100644
index 00000000..220b914b
--- /dev/null
+++ b/recipes/incoming-clib/busybox-logger.patch
@@ -0,0 +1,13 @@
+diff --git a/hooks/dhcpcd-run-hooks.in b/hooks/dhcpcd-run-hooks.in
+index 91df64b..c6fb8c6 100644
+--- a/hooks/dhcpcd-run-hooks.in
++++ b/hooks/dhcpcd-run-hooks.in
+@@ -179,7 +179,7 @@ syslog()
+ *) echo "$interface: $*";;
+ esac
+ if command -v logger >/dev/null 2>&1; then
+- logger -i -p daemon."$lvl" -t dhcpcd-run-hooks "$interface: $*"
++ logger -p daemon."$lvl" -t dhcpcd-run-hooks "$interface: $*"
+ fi
+ }
+
diff --git a/recipes/incoming-clib/ca-certificates.toml b/recipes/incoming-clib/ca-certificates.toml
new file mode 100644
index 00000000..9d135300
--- /dev/null
+++ b/recipes/incoming-clib/ca-certificates.toml
@@ -0,0 +1,60 @@
+# Importada de Alpine aports por `hammer import-alpine` (Etapa G). PUNTO DE PARTIDA — pero
+# YA trae los parches de musl de Alpine (lo que un import de nix pierde). Pendiente: el
+# sha256 del tarball (el wrapper lo calcula), y adaptar build/install del shell de abuild.
+name = "ca-certificates"
+version = "20260611"
+
+[source]
+tarball = "https://gitlab.alpinelinux.org/alpine/ca-certificates/-/archive/20260611/ca-certificates-20260611.tar.bz2"
+# FIXME sha256: el wrapper lo calcula (Alpine publica sha512). sha512 de Alpine:
+# sha512 = "f473a1111eb508ef5d1096489479dba07db6b0d76ef2b900b3473933d57419429061d83e9c1e881ab61c4b0f17c64859ec74d670da6fc1d83d9b0fa73e1b7d8d"
+sha256 = "32ca73f2e81e2b88dc614f12e1ee04a82b1ec5a8e29d9f359ddf8905a0afcbb0"
+
+[build]
+compiler = "zig-cc"
+target = "x86_64-linux-musl"
+link = "static"
+flags = []
+
+[build.phases]
+# de build() de Alpine (traducido; el lab provee $CBUILD/$CHOST — Etapa G Fase 3; revisá --shared para estático):
+compile = '''
+_abuild_phase() {
+make
+}
+_abuild_phase
+'''
+# de package() de Alpine (traducido $pkgdir→/out):
+install = '''
+_abuild_phase() {
+make install DESTDIR="/out"
+
+ (
+ echo "# Automatically generated by ca-certificates-20260611-r$pkgrel"
+ echo "# $(date -ud@$SOURCE_DATE_EPOCH)"
+ echo "#"
+ cd "/out"/usr/share/ca-certificates
+ find . -name '*.crt' | sort | cut -b3-
+ ) > "/out"/etc/ca-certificates.conf
+
+ # generate the bundle in similar way as update-ca-certificates would do
+ find -- *.crt | sort | while read -r i; do
+ cat "$i"
+ printf "\n"
+ done > "/out"/etc/ssl/certs/ca-certificates.crt
+
+ mkdir -p "/out"/etc/apk/protected_paths.d
+ cat > "/out"/etc/apk/protected_paths.d/ca-certificates.list <<-EOF
+ -etc/ssl/certs/ca-certificates.crt
+ -etc/ssl/certs/ca-cert-*.pem
+ -etc/ssl/certs/[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f].[r0-9]*
+ EOF
+
+ cat > "/out"/etc/ca-certificates/update.d/certhash <<-EOF
+ #!/bin/sh
+ exec /usr/bin/c_rehash /etc/ssl/certs
+ EOF
+ chmod +x "/out"/etc/ca-certificates/update.d/certhash
+}
+_abuild_phase
+'''
diff --git a/recipes/incoming-clib/change-PATH.patch b/recipes/incoming-clib/change-PATH.patch
new file mode 100644
index 00000000..c0fb7a51
--- /dev/null
+++ b/recipes/incoming-clib/change-PATH.patch
@@ -0,0 +1,19 @@
+From: Jakub Jirutka <jakub@jirutka.cz>
+Date: Tue, 28 Jun 2022 22:36:16 +0200
+Subject: [PATCH] Change default PATH to the Alpine's default
+
+Use the same PATH as in openssh, sudo and our /etc/profile.
+
+--- a/doas.c
++++ b/doas.c
+@@ -238,8 +238,8 @@
+ int
+ main(int argc, char **argv)
+ {
+- const char *safepath = "/bin:/sbin:/usr/bin:/usr/sbin:"
+- "/usr/local/bin:/usr/local/sbin";
++ const char *safepath = "/usr/local/sbin:/usr/local/bin:"
++ "/usr/sbin:/usr/bin:/sbin:/bin";
+ const char *confpath = NULL;
+ char *shargv[] = { NULL, NULL };
+ char *sh;
diff --git a/recipes/incoming-clib/configuration-directory.patch b/recipes/incoming-clib/configuration-directory.patch
new file mode 100644
index 00000000..1ab9b968
--- /dev/null
+++ b/recipes/incoming-clib/configuration-directory.patch
@@ -0,0 +1,447 @@
+Patch-Source: https://github.com/Duncaen/OpenDoas/pull/71 (rebased + one extra commit)
+--
+From a6aa77d9f4b9ad4556e478d6779dbebd4143a98a Mon Sep 17 00:00:00 2001
+From: Ariadne Conill <ariadne@dereferenced.org>
+Date: Wed, 4 Aug 2021 04:47:04 -0600
+Subject: [PATCH] add --with-confdir feature
+
+This adds support for an /etc/doas.d configuration directory as discussed in #61. It is disabled by default.
+
+diff --git a/GNUmakefile b/GNUmakefile
+index 9470202..22be971 100644
+--- a/GNUmakefile
++++ b/GNUmakefile
+@@ -27,6 +27,7 @@ install: ${PROG} ${PAM_DOAS} ${MAN}
+ [ -n "${PAM_DOAS}" ] && chmod 0644 ${DESTDIR}${PAMDIR}/doas || true
+ cp -f doas.1 ${DESTDIR}${MANDIR}/man1
+ cp -f doas.conf.5 ${DESTDIR}${MANDIR}/man5
++ cp -f doas.d.5 ${DESTDIR}${MANDIR}/man5
+
+ uninstall:
+ rm -f ${DESTDIR}${BINDIR}/${PROG}
+diff --git a/README.md b/README.md
+index 20ef9f2..92acded 100644
+--- a/README.md
++++ b/README.md
+@@ -43,3 +43,12 @@ similar to sudo.
+
+ See the comment block in `timestamp.c` for an in-depth description on how
+ timestamps are created and checked to be as safe as possible.
++
++### `--with-doas-confdir`
++
++An optional feature can be enabled which will result in `doas` reading configuration
++snippets from `/etc/doas.d`. These configuration snippets have the same requirements
++as `/etc/doas.conf` (owned by root, not world-writable).
++
++If this feature is enabled, only the `/etc/doas.d` directory is read, and the historical
++`/etc/doas.conf` file is ignored.
+\ No newline at end of file
+diff --git a/configure b/configure
+index 1c5d989..22a078e 100755
+--- a/configure
++++ b/configure
+@@ -28,6 +28,7 @@ usage: configure [options]
+ --without-shadow disable shadow support
+
+ --with-timestamp enable timestamp support
++ --with-doas-confdir enable configuration directory support
+
+ --uid-max=NUM set UID_MAX (default 65535)
+ --gid-max=NUM set GID_MAX (default 65535)
+@@ -39,6 +40,7 @@ EOF
+
+ # defaults
+ WITHOUT_TIMESTAMP=yes
++WITHOUT_CONFDIR=yes
+ UID_MAX=65535
+ GID_MAX=65535
+
+@@ -58,6 +60,8 @@ for x; do
+ --target) TARGET=$var ;;
+ --enable-debug) DEBUG=yes ;;
+ --enable-static) BUILD_STATIC=yes ;;
++ --with-doas-confdir) WITHOUT_CONFDIR= ;;
++ --without-doas-confdir) WITHOUT_CONFDIR=yes ;;
+ --with-pam) WITHOUT_PAM=; WITHOUT_SHADOW=yes ;;
+ --with-shadow) WITHOUT_SHADOW=; WITHOUT_PAM=yes ;;
+ --without-pam) WITHOUT_PAM=yes ;;
+@@ -565,4 +569,8 @@ fi
+
+ printf '#define DOAS_CONF "%s/doas.conf"\n' "${SYSCONFDIR}" >>$CONFIG_H
+
++if [ -z "$WITHOUT_CONFDIR" ]; then
++ printf '#define DOAS_CONFDIR "%s/doas.d"\n' "${SYSCONFDIR}" >>$CONFIG_H
++fi
++
+ printf '\n#endif /* CONFIG_H */\n' >>$CONFIG_H
+diff --git a/doas.c b/doas.c
+index ac3a42a..d77186b 100644
+--- a/doas.c
++++ b/doas.c
+@@ -35,6 +35,7 @@
+ #include <syslog.h>
+ #include <errno.h>
+ #include <fcntl.h>
++#include <dirent.h>
+
+ #include "openbsd.h"
+ #include "doas.h"
+@@ -155,6 +156,7 @@ permit(uid_t uid, gid_t *groups, int ngroups, const struct rule **lastr,
+ static void
+ parseconfig(const char *filename, int checkperms)
+ {
++ extern const char *yyfn;
+ extern FILE *yyfp;
+ extern int yyparse(void);
+ struct stat sb;
+@@ -164,6 +166,8 @@ parseconfig(const char *filename, int checkperms)
+ err(1, checkperms ? "doas is not enabled, %s" :
+ "could not open config file %s", filename);
+
++ yyfn = filename;
++
+ if (checkperms) {
+ if (fstat(fileno(yyfp), &sb) != 0)
+ err(1, "fstat(\"%s\")", filename);
+@@ -174,11 +178,82 @@ parseconfig(const char *filename, int checkperms)
+ }
+
+ yyparse();
++ yyfn = NULL;
++
+ fclose(yyfp);
+ if (parse_errors)
+ exit(1);
+ }
+
++#ifdef DOAS_CONFDIR
++static int
++isconfdir(const char *dirpath)
++{
++ struct stat sb;
++
++ if (lstat(dirpath, &sb) != 0) {
++ if (errno != ENOENT)
++ err(1, "lstat(\"%s\")", dirpath);
++
++ errno = ENOTDIR;
++ return 0;
++ }
++
++ if ((sb.st_mode & (S_IFMT)) == S_IFDIR)
++ return 1;
++
++ errno = ENOTDIR;
++ return 0;
++}
++
++static void
++parseconfdir(const char *dirpath, int checkperms)
++{
++ struct dirent **dirent_table;
++ int i, m, dirent_count;
++ char pathbuf[PATH_MAX];
++
++ if (!isconfdir(dirpath))
++ err(1, checkperms ? "doas is not enabled, %s" :
++ "could not open config directory %s", dirpath);
++
++ dirent_count = scandir(dirpath, &dirent_table, NULL, alphasort);
++ if (dirent_count < 0)
++ err(1, checkperms ? "doas is not enabled, %s" :
++ "could not open config directory %s", dirpath);
++
++ for (i = 0, m = 0; i < dirent_count; i++)
++ {
++ struct stat sb;
++ size_t pathlen;
++
++ pathlen = snprintf(pathbuf, sizeof pathbuf, "%s/%s", dirpath, dirent_table[i]->d_name);
++ free(dirent_table[i]);
++
++ /* make sure path ends in .conf */
++ if (pathlen < 6)
++ continue;
++
++ if (strcmp(pathbuf + (pathlen - 5), ".conf"))
++ continue;
++
++ if (stat(pathbuf, &sb) != 0)
++ err(1, "stat(\"%s\")", pathbuf);
++
++ if ((sb.st_mode & (S_IFMT)) != S_IFREG)
++ continue;
++
++ parseconfig(pathbuf, checkperms);
++ m++;
++ }
++
++ free(dirent_table);
++
++ if (!m)
++ errx(1, "doas is not enabled, %s: no matching configuration files found\n", dirpath);
++}
++#endif
++
+ static void __dead
+ checkconfig(const char *confpath, int argc, char **argv,
+ uid_t uid, gid_t *groups, int ngroups, uid_t target)
+@@ -188,6 +263,11 @@ checkconfig(const char *confpath, int argc, char **argv,
+ if (setresuid(uid, uid, uid) != 0)
+ err(1, "setresuid");
+
++#ifdef DOAS_CONFDIR
++ if (isconfdir(confpath))
++ parseconfdir(confpath, 0);
++ else
++#endif
+ parseconfig(confpath, 0);
+ if (!argc)
+ exit(0);
+@@ -330,6 +410,11 @@ main(int argc, char **argv)
+ if (geteuid())
+ errx(1, "not installed setuid");
+
++#ifdef DOAS_CONFDIR
++ if (isconfdir(DOAS_CONFDIR))
++ parseconfdir(DOAS_CONFDIR, 1);
++ else
++#endif
+ parseconfig(DOAS_CONF, 1);
+
+ /* cmdline is used only for logging, no need to abort on truncate */
+diff --git a/doas.conf.5 b/doas.conf.5
+index e98bfbe..e90d512 100644
+--- a/doas.conf.5
++++ b/doas.conf.5
+@@ -143,6 +143,7 @@ permit nopass keepenv setenv { PATH } root as root
+ .Ed
+ .Sh SEE ALSO
+ .Xr doas 1 ,
++.Xr doas.d 5 ,
+ .Xr syslogd 8
+ .Sh HISTORY
+ The
+diff --git a/doas.d.5 b/doas.d.5
+new file mode 100644
+index 0000000..c5eaa72
+--- /dev/null
++++ b/doas.d.5
+@@ -0,0 +1,50 @@
++.\"Copyright (c) 2021 Ariadne Conill <ariadne@dereferenced.org>
++.\"
++.\"Permission to use, copy, modify, and distribute this software for any
++.\"purpose with or without fee is hereby granted, provided that the above
++.\"copyright notice and this permission notice appear in all copies.
++.\"
++.\"THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
++.\"WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
++.\"MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
++.\"ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
++.\"WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
++.\"ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
++.\"OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
++.Dd $Mdocdate: October 9 2020 $
++.Dt DOAS.D 5
++.Os
++.Sh NAME
++.Nm doas.d
++.Nd doas configuration directory
++.Sh DESCRIPTION
++The
++.Xr doas 1
++utility executes commands as other users according to the rules
++configured in either the configuration file or, optionally, the
++configuration directory. The preference to use the configuration
++file or configuration directory is determined at compile time,
++.Xr doas 1
++will only consult one or the other.
++.Pp
++Configuration snippets stored in the configuration directory
++follow the same rules as the classic
++.Xr doas 1
++configuration file, documented in
++.Xr doas.conf 5 .
++They must end with the .conf extension, or they will be ignored.
++.Pp
++These snippets are read in alphabetical order and thus can be
++ordered in the same way as other configuration directories.
++.Sh FILES
++.Bl -tag -width /etc/doas.d -compact
++.It Pa /etc/doas.d
++.Xr doas 1
++configuration directory.
++.Sh SEE ALSO
++.Xr doas 1 ,
++.Xr doas.conf 5
++.Sh HISTORY
++The
++.Nm
++configuration directory first appeared in OpenDoas.
+diff --git a/parse.y b/parse.y
+index 388c2a5..c6d7ebf 100644
+--- a/parse.y
++++ b/parse.y
+@@ -49,6 +49,7 @@ typedef struct {
+ } yystype;
+ #define YYSTYPE yystype
+
++const char *yyfn;
+ FILE *yyfp;
+
+ struct rule **rules;
+@@ -203,7 +204,7 @@ yyerror(const char *fmt, ...)
+ va_start(va, fmt);
+ vfprintf(stderr, fmt, va);
+ va_end(va);
+- fprintf(stderr, " at line %d\n", yylval.lineno + 1);
++ fprintf(stderr, " at %s, line %d\n", yyfn, yylval.lineno + 1);
+ parse_errors++;
+ }
+
+--
+From c871cf723cc4cc1045ffc7de380f5271b4c29acf Mon Sep 17 00:00:00 2001
+From: Jakub Jirutka <jakub@jirutka.cz>
+Date: Sat, 13 May 2023 22:38:23 +0200
+Subject: [PATCH 9/9] read both /etc/doas.conf and /etc/doas.d/*.conf if
+ confdir is enabled
+
+The current behaviour of the configuration directory was required by the
+upstream, but it doesn't conform to established conventions used by
+virtually all programs on Linux that support modular configuration, and
+what the users naturally expect. Also, when someone used to vanilla
+OpenDoas or doas on BSD comes to Alpine, the way they're used to
+configuring it (via /etc/doas.conf) will no work without notice! It
+has already caused some problems and confusion.
+
+The current behaviour is: if /etc/doas.d exists, there must be at least one
+*.conf file and /etc/doas.conf is *ignored*.
+
+Since it doesn't look like the upstream will ever merge this, better to
+fix this patch to work as it should from the beginning...
+
+This new behaviour: /etc/doas.conf must always exist (as in unpatched
+OpenDoas) and will be read first; if /etc/doas.d exists and there are any
+*.conf files, they will be loaded as well.
+---
+ README.md | 7 +++----
+ doas.c | 22 +++++-----------------
+ doas.d.5 | 14 +++++---------
+ 3 files changed, 13 insertions(+), 30 deletions(-)
+
+diff --git a/README.md b/README.md
+index 92acded..d5b2e72 100644
+--- a/README.md
++++ b/README.md
+@@ -48,7 +48,6 @@ timestamps are created and checked to be as safe as possible.
+
+ An optional feature can be enabled which will result in `doas` reading configuration
+ snippets from `/etc/doas.d`. These configuration snippets have the same requirements
+-as `/etc/doas.conf` (owned by root, not world-writable).
+-
+-If this feature is enabled, only the `/etc/doas.d` directory is read, and the historical
+-`/etc/doas.conf` file is ignored.
+\ No newline at end of file
++as `/etc/doas.conf` (owned by root, not world-writable). The main configuration file
++`/etc/doas.conf` is still required to exist and it is read before `/etc/doas.d`. It is
++not an error if `/etc/doas.d` does not exist or no matching files are found there.
+diff --git a/doas.c b/doas.c
+index d77186b..affbe39 100644
+--- a/doas.c
++++ b/doas.c
+@@ -210,19 +210,14 @@ static void
+ parseconfdir(const char *dirpath, int checkperms)
+ {
+ struct dirent **dirent_table;
+- int i, m, dirent_count;
++ int i, dirent_count;
+ char pathbuf[PATH_MAX];
+
+- if (!isconfdir(dirpath))
+- err(1, checkperms ? "doas is not enabled, %s" :
+- "could not open config directory %s", dirpath);
+-
+ dirent_count = scandir(dirpath, &dirent_table, NULL, alphasort);
+ if (dirent_count < 0)
+- err(1, checkperms ? "doas is not enabled, %s" :
+- "could not open config directory %s", dirpath);
++ return;
+
+- for (i = 0, m = 0; i < dirent_count; i++)
++ for (i = 0; i < dirent_count; i++)
+ {
+ struct stat sb;
+ size_t pathlen;
+@@ -244,13 +239,9 @@ parseconfdir(const char *dirpath, int checkperms)
+ continue;
+
+ parseconfig(pathbuf, checkperms);
+- m++;
+ }
+
+ free(dirent_table);
+-
+- if (!m)
+- errx(1, "doas is not enabled, %s: no matching configuration files found\n", dirpath);
+ }
+ #endif
+
+@@ -263,12 +254,11 @@ checkconfig(const char *confpath, int argc, char **argv,
+ if (setresuid(uid, uid, uid) != 0)
+ err(1, "setresuid");
+
++ parseconfig(confpath, 0);
+ #ifdef DOAS_CONFDIR
+ if (isconfdir(confpath))
+ parseconfdir(confpath, 0);
+- else
+ #endif
+- parseconfig(confpath, 0);
+ if (!argc)
+ exit(0);
+
+@@ -410,13 +400,11 @@ main(int argc, char **argv)
+ if (geteuid())
+ errx(1, "not installed setuid");
+
++ parseconfig(DOAS_CONF, 1);
+ #ifdef DOAS_CONFDIR
+ if (isconfdir(DOAS_CONFDIR))
+ parseconfdir(DOAS_CONFDIR, 1);
+- else
+ #endif
+- parseconfig(DOAS_CONF, 1);
+-
+ /* cmdline is used only for logging, no need to abort on truncate */
+ (void)strlcpy(cmdline, argv[0], sizeof(cmdline));
+ for (i = 1; i < argc; i++) {
+diff --git a/doas.d.5 b/doas.d.5
+index c5eaa72..5911a12 100644
+--- a/doas.d.5
++++ b/doas.d.5
+@@ -21,14 +21,9 @@
+ The
+ .Xr doas 1
+ utility executes commands as other users according to the rules
+-configured in either the configuration file or, optionally, the
+-configuration directory. The preference to use the configuration
+-file or configuration directory is determined at compile time,
+-.Xr doas 1
+-will only consult one or the other.
+-.Pp
+-Configuration snippets stored in the configuration directory
+-follow the same rules as the classic
++configured in the configuration file and, optionally, the
++configuration directory. Configuration snippets stored in the
++configuration directory follow the same rules as the classic
+ .Xr doas 1
+ configuration file, documented in
+ .Xr doas.conf 5 .
+@@ -47,4 +42,5 @@ configuration directory.
+ .Sh HISTORY
+ The
+ .Nm
+-configuration directory first appeared in OpenDoas.
++configuration directory first appeared as a patch for doas on
++Alpine Linux and it is not supported in upstream OpenDoas.
diff --git a/recipes/incoming-clib/curl.toml b/recipes/incoming-clib/curl.toml
deleted file mode 100644
index 54b50a06..00000000
--- a/recipes/incoming-clib/curl.toml
+++ /dev/null
@@ -1,21 +0,0 @@
-# curl 8.11.1 — solo para satisfacer el link de appstream (libadwaita no descarga nada). Build MÍNIMO:
-# sin TLS/ldap/psl/nghttp2/brotli/zstd/idn — libcurl.a presente basta. autotools static.
-name = "curl"
-version = "8.11.1"
-
-[source]
-tarball = "https://curl.se/download/curl-8.11.1.tar.xz"
-sha256 = "c7ca7db48b0909743eaef34250da02c19bc61d4f1dcedd6603f109409536ab56"
-
-[build]
-compiler = "zig-cc"
-target = "x86_64-linux-musl"
-link = "static"
-
-[build.phases]
-configure = "./configure --prefix=/usr --build=$CBUILD --host=$CHOST --disable-shared --enable-static --without-ssl --without-libpsl --without-nghttp2 --without-brotli --without-zstd --without-libidn2 --disable-ldap --disable-ldaps --disable-docs --disable-manual --with-zlib"
-compile = "make -j4"
-install = "make install DESTDIR=/out"
-
-[deps]
-build = ["zlib"]
diff --git a/recipes/incoming-clib/dbus.toml b/recipes/incoming-clib/dbus.toml
new file mode 100644
index 00000000..3b97bab2
--- /dev/null
+++ b/recipes/incoming-clib/dbus.toml
@@ -0,0 +1,48 @@
+# Importada de Alpine aports por `hammer import-alpine` (Etapa G). PUNTO DE PARTIDA — pero
+# YA trae los parches de musl de Alpine (lo que un import de nix pierde). Pendiente: el
+# sha256 del tarball (el wrapper lo calcula), y adaptar build/install del shell de abuild.
+name = "dbus"
+version = "1.16.2"
+
+[source]
+tarball = "https://dbus.freedesktop.org/releases/dbus/dbus-1.16.2.tar.xz"
+# FIXME sha256: el wrapper lo calcula (Alpine publica sha512). sha512 de Alpine:
+# sha512 = "5c26f52d85984bb9ae1dde8d7e73921eacbdf020a61ff15f00a4c240cb38a121553ee04bd66e62b28425ff9bc50f4f5e15135166573ac0888332a01a0db1faa2"
+sha256 = "0ba2a1a4b16afe7bceb2c07e9ce99a8c2c3508e5dec290dbb643384bd6beb7e2"
+
+[build]
+compiler = "zig-cc"
+target = "x86_64-linux-musl"
+link = "static"
+flags = []
+
+[build.phases]
+# de build() de Alpine (traducido; el lab provee $CBUILD/$CHOST — Etapa G Fase 3; revisá --shared para estático):
+compile = '''
+_abuild_phase() {
+abuild-meson \
+ -Dsystem_pid_file=/run/dbus/dbus.pid \
+ output .
+ meson compile -C output
+}
+_abuild_phase
+'''
+# de package() de Alpine (traducido $pkgdir→/out):
+install = '''
+_abuild_phase() {
+DESTDIR="/out" meson install --no-rebuild -C output
+ install -Dm644 "$srcdir"/README.alpine -t "/out"/usr/share/doc/dbus
+
+ install -Dm755 "$srcdir"/dbus.initd "/out"/etc/init.d/dbus
+ install -Dm644 "$srcdir"/dbus.confd "/out"/etc/conf.d/dbus
+ install -Dm755 "$srcdir"/dbus-user.initd "/out"/etc/user/init.d/dbus
+ install -Dm644 "$srcdir"/dbus-user.confd "/out"/etc/user/conf.d/dbus
+
+ # can't install tmpfs
+ rm -r "/out"/run
+}
+_abuild_phase
+'''
+
+[deps]
+build = ["expat", "glib", "libsm", "libx11", "xmlto"]
diff --git a/recipes/incoming-clib/dhcpcd.toml b/recipes/incoming-clib/dhcpcd.toml
new file mode 100644
index 00000000..a9a8a2e4
--- /dev/null
+++ b/recipes/incoming-clib/dhcpcd.toml
@@ -0,0 +1,54 @@
+# Importada de Alpine aports por `hammer import-alpine` (Etapa G). PUNTO DE PARTIDA — pero
+# YA trae los parches de musl de Alpine (lo que un import de nix pierde). Pendiente: el
+# sha256 del tarball (el wrapper lo calcula), y adaptar build/install del shell de abuild.
+name = "dhcpcd"
+version = "10.3.2"
+
+[source]
+tarball = "https://github.com/NetworkConfiguration/dhcpcd/releases/download/v10.3.2/dhcpcd-10.3.2.tar.xz"
+# FIXME sha256: el wrapper lo calcula (Alpine publica sha512). sha512 de Alpine:
+# sha512 = "5944fa141bd40c8aabb2c3c46748d736f69f6fd0a773386508cbff868d8f69d88305a0fd97dff4da21c5662918016b36d8327498e5b0509804dbec80603f6d6d"
+sha256 = "b6aa46932074906a9badef1bfe142b8aff9d041c2689e1ef8b74c12e9fd942bd"
+patches = ["busybox-logger.patch", "fix-chrony-conf-location.patch"]
+
+[build]
+compiler = "zig-cc"
+target = "x86_64-linux-musl"
+link = "static"
+flags = []
+
+[build.phases]
+# de build() de Alpine (traducido; el lab provee $CBUILD/$CHOST — Etapa G Fase 3; revisá --shared para estático):
+compile = '''
+_abuild_phase() {
+./configure \
+ --build=$CBUILD \
+ --host=$CHOST \
+ --sysconfdir=/etc \
+ --mandir=/usr/share/man \
+ --localstatedir=/var \
+ --libexecdir=/usr/lib/dhcpcd \
+ --dbdir=/var/lib/dhcpcd \
+ --rundir=/run/dhcpcd \
+ --runstatedir=/run/dhcpcd \
+ --enable-ipv6 \
+ --enable-privsep \
+ --enable-seccomp \
+ --without-dev \
+ --without-udev
+ make
+}
+_abuild_phase
+'''
+# de package() de Alpine (traducido $pkgdir→/out):
+install = '''
+_abuild_phase() {
+make DESTDIR="/out" install
+ install -Dm755 "$srcdir"/dhcpcd.initd \
+ "/out"/etc/init.d/dhcpcd
+}
+_abuild_phase
+'''
+
+[deps]
+build = ["linux-headers", "bsd-compat-headers"]
diff --git a/recipes/incoming-clib/doas.toml b/recipes/incoming-clib/doas.toml
new file mode 100644
index 00000000..2794e041
--- /dev/null
+++ b/recipes/incoming-clib/doas.toml
@@ -0,0 +1,47 @@
+# Importada de Alpine aports por `hammer import-alpine` (Etapa G). PUNTO DE PARTIDA — pero
+# YA trae los parches de musl de Alpine (lo que un import de nix pierde). Pendiente: el
+# sha256 del tarball (el wrapper lo calcula), y adaptar build/install del shell de abuild.
+name = "doas"
+version = "6.8.2"
+
+[source]
+tarball = "https://github.com/Duncaen/OpenDoas/archive/v6.8.2.tar.gz"
+# FIXME sha256: el wrapper lo calcula (Alpine publica sha512). sha512 de Alpine:
+# sha512 = "4a93ff477413c859ba2702e688fa4f83248fff85e61e12336838a1e9aa1a8d9963a9782e4bc5e58e8d04b86c2c8ceb6b235ae9d3b32b3e548a2514a43653137d"
+sha256 = "6da058a0e70b7543bc60624389b0b00b686189ec933828c522bf8b2600495a67"
+patches = ["configuration-directory.patch", "manpage-example-path.patch", "change-PATH.patch", "rowhammer.patch"]
+
+[build]
+compiler = "zig-cc"
+target = "x86_64-linux-musl"
+link = "static"
+flags = []
+
+[build.phases]
+# de build() de Alpine (traducido; el lab provee $CBUILD/$CHOST — Etapa G Fase 3; revisá --shared para estático):
+compile = '''
+_abuild_phase() {
+./configure \
+ --prefix=/usr \
+ --without-pam \
+ --with-timestamp \
+ --with-doas-confdir
+ make
+}
+_abuild_phase
+'''
+# de package() de Alpine (traducido $pkgdir→/out):
+install = '''
+_abuild_phase() {
+make install DESTDIR="/out"
+
+ install -d -m 750 "/out"/etc/doas.d
+ install -m 640 "$srcdir"/doas.conf -t "/out"/etc/
+
+ install -D -m 644 "$srcdir"/doas.conf "/out"/usr/share/doc/doas/doas.conf.example
+}
+_abuild_phase
+'''
+
+[deps]
+build = ["bison"]
diff --git a/recipes/incoming-clib/dont-use-nobody.patch b/recipes/incoming-clib/dont-use-nobody.patch
new file mode 100644
index 00000000..180c18d5
--- /dev/null
+++ b/recipes/incoming-clib/dont-use-nobody.patch
@@ -0,0 +1,15 @@
+rootbld makes all the supplementary groups nobody(65534);
+this patch avoids using them in tests
+
+diff --git a/getgroups.c b/getgroups.c
+index 8a37ed0..01adfca 100644
+--- a/getgroups.c
++++ b/getgroups.c
+@@ -48,6 +48,7 @@
+ #endif
+
+ for (i = 0; i < n; i++) {
++ if (list[i] == 65534) continue;
+ printf("%lu ", (unsigned long)list[i]);
+ if (list[i] == gid)
+ gid_in_list = 1;
diff --git a/recipes/incoming-clib/libffi.toml b/recipes/incoming-clib/dosfstools.toml
similarity index 60%
rename from recipes/incoming-clib/libffi.toml
rename to recipes/incoming-clib/dosfstools.toml
index 6fbcd3f6..341f793e 100644
--- a/recipes/incoming-clib/libffi.toml
+++ b/recipes/incoming-clib/dosfstools.toml
@@ -1,15 +1,14 @@
# Importada de Alpine aports por `hammer import-alpine` (Etapa G). PUNTO DE PARTIDA — pero
# YA trae los parches de musl de Alpine (lo que un import de nix pierde). Pendiente: el
# sha256 del tarball (el wrapper lo calcula), y adaptar build/install del shell de abuild.
-name = "libffi"
-version = "3.5.2"
+name = "dosfstools"
+version = "4.2"
[source]
-tarball = "https://github.com/libffi/libffi/releases/download/v3.5.2/libffi-3.5.2.tar.gz"
+tarball = "https://github.com/dosfstools/dosfstools/releases/download/v4.2/dosfstools-4.2.tar.gz"
# FIXME sha256: el wrapper lo calcula (Alpine publica sha512). sha512 de Alpine:
-# sha512 = "76974a84e3aee6bbd646a6da2e641825ae0b791ca6efdc479b2d4cbcd3ad607df59cffcf5031ad5bd30822961a8c6de164ac8ae379d1804acd388b1975cdbf4d"
-sha256 = "f3a3082a23b37c293a4fcd1053147b371f2ff91fa7ea1b2a52e335676bac82dc"
-patches = ["fix-tests-fortify.patch"]
+# sha512 = "3cc0808edb4432428df8a67da4bb314fd1f27adc4a05754c1a492091741a7b6875ebd9f6a509cc4c5ad85643fc40395b6e0cadee548b25cc439cc9b725980156"
+sha256 = "64926eebf90092dca21b14259a5301b7b98e7b1943e8a201c7d726084809b527"
[build]
compiler = "zig-cc"
@@ -22,13 +21,15 @@ flags = []
compile = '''
_abuild_phase() {
./configure \
- --disable-shared --enable-static \
--build=$CBUILD \
--host=$CHOST \
--prefix=/usr \
- --enable-pax_emutramp \
- --enable-portable-binary \
- --disable-exec-static-tramp
+ --sbindir=/sbin \
+ --sysconfdir=/etc \
+ --mandir=/usr/share/man \
+ --localstatedir=/var \
+ --disable-nls \
+ --enable-compat-symlinks
make
}
_abuild_phase
@@ -40,3 +41,6 @@ make DESTDIR="/out" install
}
_abuild_phase
'''
+
+[deps]
+build = ["linux-headers", "autoconf", "automake", "libtool"]
diff --git a/recipes/incoming-clib/e2fsprogs.toml b/recipes/incoming-clib/e2fsprogs.toml
new file mode 100644
index 00000000..56a89645
--- /dev/null
+++ b/recipes/incoming-clib/e2fsprogs.toml
@@ -0,0 +1,61 @@
+# Importada de Alpine aports por `hammer import-alpine` (Etapa G). PUNTO DE PARTIDA — pero
+# YA trae los parches de musl de Alpine (lo que un import de nix pierde). Pendiente: el
+# sha256 del tarball (el wrapper lo calcula), y adaptar build/install del shell de abuild.
+name = "e2fsprogs"
+version = "1.47.4"
+
+[source]
+tarball = "https://github.com/tytso/e2fsprogs/archive/v1.47.4.tar.gz"
+# FIXME sha256: el wrapper lo calcula (Alpine publica sha512). sha512 de Alpine:
+# sha512 = "923c1ba52cf48557e190ee936be47ff3e43e4798950499e3c663f0f077470caefbb69ee845ebe1f969b3e7c1bb0c22e507188f1daca24649c54c5843c835b2f9"
+sha256 = "9f82eaa7002673291629077b80ee005cadfcd49854907a22007fed70b0ef596e"
+
+[build]
+compiler = "zig-cc"
+target = "x86_64-linux-musl"
+link = "static"
+flags = []
+
+[build.phases]
+# de build() de Alpine (traducido; el lab provee $CBUILD/$CHOST — Etapa G Fase 3; revisá --shared para estático):
+compile = '''
+_abuild_phase() {
+./configure \
+ --build=$CBUILD \
+ --host=$CHOST \
+ --prefix=/usr \
+ --sysconfdir=/etc \
+ --mandir=/usr/share/man \
+ --localstatedir=/var \
+ --with-udev-rules-dir=no \
+ --enable-elf-shlibs \
+ --enable-symlink-install \
+ --disable-fsck \
+ --disable-uuidd \
+ --disable-libuuid \
+ --disable-libblkid \
+ --disable-nls \
+ --enable-lto
+ make
+}
+_abuild_phase
+'''
+# de package() de Alpine (traducido $pkgdir→/out):
+install = '''
+_abuild_phase() {
+make -j1 DESTDIR="/out" install install-libs
+ mkdir -p "/out"/sbin/
+ local i; for i in e2fsck mke2fs mkfs.* fsck.*; do
+ mv "/out"/usr/sbin/$i "/out"/sbin/
+ done
+ # overwrite busybox symlinks
+ mkdir -p "/out"/bin/
+ for i in chattr lsattr; do
+ mv "/out"/usr/bin/$i "/out"/bin/
+ done
+}
+_abuild_phase
+'''
+
+[deps]
+build = ["linux-headers", "fuse3"]
diff --git a/recipes/incoming-clib/expat.toml b/recipes/incoming-clib/expat.toml
deleted file mode 100644
index 2860780b..00000000
--- a/recipes/incoming-clib/expat.toml
+++ /dev/null
@@ -1,14 +0,0 @@
-# expat 2.8.2 — parser XML (lo usa fontconfig). autotools static, leaf.
-name = "expat"
-version = "2.8.2"
-[source]
-tarball = "https://github.com/libexpat/libexpat/releases/download/R_2_8_2/expat-2.8.2.tar.xz"
-sha256 = "3ad89b8588e6644bd4e49981480d48b21289eebbcd4f0a1a4afb1c29f99b6ab4"
-[build]
-compiler = "zig-cc"
-target = "x86_64-linux-musl"
-link = "static"
-[build.phases]
-configure = "./configure --prefix=/usr --disable-shared --enable-static --without-docbook --without-examples --without-tests"
-compile = "make"
-install = "make install DESTDIR=/out"
diff --git a/recipes/incoming-clib/fix-chrony-conf-location.patch b/recipes/incoming-clib/fix-chrony-conf-location.patch
new file mode 100644
index 00000000..b75df9f3
--- /dev/null
+++ b/recipes/incoming-clib/fix-chrony-conf-location.patch
@@ -0,0 +1,11 @@
+--- a/hooks/50-ntp.conf
++++ b/hooks/50-ntp.conf
+@@ -17,7 +17,7 @@
+ # above examples.
+
+ : ${ntp_confs:=ntp.conf ntpd.conf chrony.conf}
+-: ${ntp_conf_dirs=/etc /usr/pkg/etc /usr/local/etc}
++: ${ntp_conf_dirs=/etc /etc/chrony /usr/pkg/etc /usr/local/etc}
+ ntp_conf_dir="$state_dir/ntp.conf"
+
+ # If NTP_CONF is not set, work out a good default
diff --git a/recipes/incoming-clib/fix-includes.patch b/recipes/incoming-clib/fix-includes.patch
new file mode 100644
index 00000000..c6eff0eb
--- /dev/null
+++ b/recipes/incoming-clib/fix-includes.patch
@@ -0,0 +1,10 @@
+--- parted-3.1.orig/libparted/fs/xfs/platform_defs.h
++++ parted-3.1/libparted/fs/xfs/platform_defs.h
+@@ -35,6 +35,7 @@
+ #define __XFS_PLATFORM_DEFS_H__
+
+ #include <stdio.h>
++#include <fcntl.h>
+ #include <stdarg.h>
+ #include <assert.h>
+ #include <endian.h>
diff --git a/recipes/incoming-clib/fix-libintl-header-s390x.patch b/recipes/incoming-clib/fix-libintl-header-s390x.patch
new file mode 100644
index 00000000..68ae7d27
--- /dev/null
+++ b/recipes/incoming-clib/fix-libintl-header-s390x.patch
@@ -0,0 +1,58 @@
+From 4b2a566a3e007184d3ee9ce5b399a63eebbdadc3 Mon Sep 17 00:00:00 2001
+From: "Tuan M. Hoang" <tmhoang@flatglobe.org>
+Date: Thu, 23 Feb 2017 07:53:02 +0000
+Subject: [PATCH] main/parted: disable nls on s390x
+
+Because we build with --disable-nls by default, we need to remove libintl.h in
+these files on s390x. This is specific for DASD devices only on s390x.
+---
+ libparted/labels/dasd.c | 2 +-
+ libparted/labels/fdasd.c | 2 +-
+ libparted/labels/vtoc.c | 2 +-
+ 3 files changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/libparted/labels/dasd.c b/libparted/labels/dasd.c
+index fa9414f..5acf844 100644
+--- a/libparted/labels/dasd.c
++++ b/libparted/labels/dasd.c
+@@ -40,8 +40,8 @@
+ #include <parted/fdasd.h>
+ #include <arch/linux.h>
+
+-#include <libintl.h>
+ #if ENABLE_NLS
++# include <libintl.h>
+ # define _(String) dgettext (PACKAGE, String)
+ #else
+ # define _(String) (String)
+diff --git a/libparted/labels/fdasd.c b/libparted/labels/fdasd.c
+index 1f87937..e6a9086 100644
+--- a/libparted/labels/fdasd.c
++++ b/libparted/labels/fdasd.c
+@@ -24,8 +24,8 @@
+
+ #include <parted/parted.h>
+
+-#include <libintl.h>
+ #if ENABLE_NLS
++# include <libintl.h>
+ # define _(String) dgettext (PACKAGE, String)
+ #else
+ # define _(String) (String)
+diff --git a/libparted/labels/vtoc.c b/libparted/labels/vtoc.c
+index fdfa94f..64ba149 100644
+--- a/libparted/labels/vtoc.c
++++ b/libparted/labels/vtoc.c
+@@ -12,8 +12,8 @@
+
+ #include <parted/parted.h>
+
+-#include <libintl.h>
+ #if ENABLE_NLS
++# include <libintl.h>
+ # define _(String) dgettext (PACKAGE, String)
+ #else
+ # define _(String) (String)
+--
+2.11.1
+
diff --git a/recipes/incoming-clib/fix-t4219-with-sticky-bit.patch b/recipes/incoming-clib/fix-t4219-with-sticky-bit.patch
new file mode 100644
index 00000000..54ac184f
--- /dev/null
+++ b/recipes/incoming-clib/fix-t4219-with-sticky-bit.patch
@@ -0,0 +1,48 @@
+The last test of t4129 creates a directory and expects its setgid bit
+(g+s) to be off. But this makes the test fail when the parent directory
+has the bit set, as setgid's state is inherited by newly created
+subdirectories. Make the test more robust by accepting the presence of
+the setgid bit on the created directory. We only allow 'S' (setgid on
+but no executable permission) and not 's' (setgid on with executable
+permission) because the previous 'umask 0077' shouldn't allow the second
+scenario to happen.
+
+Note that only subdirectories inherit this bit, so we don't have to make
+the same change for the regular file that is also created by this test.
+But checking the permissions using grep instead of test_cmp makes the
+test a little simpler, so let's use it for the regular file as well.
+
+Also note that the sticky bit (+t) and the setuid bit (u+s) are not
+inherited, so we don't have to worry about those.
+
+Reported-by: Kevin Daudt <me@ikke.info>
+Signed-off-by: Matheus Tavares <matheus.bernardino@usp.br>
+---
+ t/t4129-apply-samemode.sh | 10 ++++------
+ 1 file changed, 4 insertions(+), 6 deletions(-)
+
+diff --git a/t/t4129-apply-samemode.sh b/t/t4129-apply-samemode.sh
+index 41818d8315..3818398ca9 100755
+--- a/t/t4129-apply-samemode.sh
++++ b/t/t4129-apply-samemode.sh
+@@ -90,12 +90,10 @@ test_expect_success POSIXPERM 'do not use core.sharedRepository for working tree
+ rm -rf d f1 &&
+ git apply patch-f1-and-f2.txt &&
+
+- echo "-rw-------" >f1_mode.expected &&
+- echo "drwx------" >d_mode.expected &&
+- test_modebits f1 >f1_mode.actual &&
+- test_modebits d >d_mode.actual &&
+- test_cmp f1_mode.expected f1_mode.actual &&
+- test_cmp d_mode.expected d_mode.actual
++ test_modebits f1 >f1_mode &&
++ test_modebits d >d_mode &&
++ grep "^-rw-------$" f1_mode &&
++ grep "^drwx--[-S]---$" d_mode
+ )
+ '
+
+--
+2.29.2
+
+
diff --git a/recipes/incoming-clib/fix-truncate-tests.patch b/recipes/incoming-clib/fix-truncate-tests.patch
new file mode 100644
index 00000000..c7c6667f
--- /dev/null
+++ b/recipes/incoming-clib/fix-truncate-tests.patch
@@ -0,0 +1,48 @@
+Fixes for BusyBox's truncate
+--- a/tests/t0290-gpt-name.sh
++++ b/tests/t0290-gpt-name_.sh
+@@ -21,7 +21,7 @@
+
+ dev=loop-file
+
+-truncate --size 50MiB "$dev" || fail=1
++truncate -s 50M "$dev" || fail=1
+
+ # create partition with empty name
+ parted --script "$dev" mklabel gpt mkpart '""' ext4 1MiB 49MiB > out 2>&1 || fail=1
+
+--- a/tests/t0215-gpt-attrs.sh
++++ b/tests/t0215-gpt-attrs.sh
+@@ -23,7 +23,7 @@
+ dev=loop-file
+
+ # create device
+-truncate --size 50MiB "$dev" || fail=1
++truncate -s 50M "$dev" || fail=1
+
+ # create gpt label and one partitions
+ parted --script "$dev" mklabel gpt > out 2>&1 || fail=1
+
+--- a/tests/t0801-json-msdos.sh
++++ b/tests/t0801-json-msdos.sh
+@@ -23,7 +23,7 @@
+ dev=loop-file
+
+ # create device
+-truncate --size 50MiB "$dev" || fail=1
++truncate -s 50M "$dev" || fail=1
+
+ # create msdos label and some partitions
+ parted --script "$dev" mklabel msdos > out 2>&1 || fail=1
+
+--- a/tests/t0800-json-gpt.sh
++++ b/tests/t0800-json-gpt.sh
+@@ -23,7 +23,7 @@
+ dev=loop-file
+
+ # create device
+-truncate --size 50MiB "$dev" || fail=1
++truncate -s 50M "$dev" || fail=1
+
+ # create gpt label and some partitions
+ parted --script "$dev" mklabel gpt > out 2>&1 || fail=1
diff --git a/recipes/incoming-clib/foot.toml b/recipes/incoming-clib/foot.toml
new file mode 100644
index 00000000..e64cc749
--- /dev/null
+++ b/recipes/incoming-clib/foot.toml
@@ -0,0 +1,60 @@
+# Importada de Alpine aports por `hammer import-alpine` (Etapa G). PUNTO DE PARTIDA — pero
+# YA trae los parches de musl de Alpine (lo que un import de nix pierde). Pendiente: el
+# sha256 del tarball (el wrapper lo calcula), y adaptar build/install del shell de abuild.
+name = "foot"
+version = "1.27.0"
+
+[source]
+tarball = "https://codeberg.org/dnkl/foot/archive/1.27.0.tar.gz"
+# FIXME sha256: el wrapper lo calcula (Alpine publica sha512). sha512 de Alpine:
+# sha512 = "cb4635c2afc18799c3c5b30715e575e0fa7e1621a1b6dab27bebdb9a530fd999a7d551986404ad17aaa8a8986e7250541a33324ef4acc5a6ff8058537545400b"
+sha256 = "FIXME-sha256"
+
+[build]
+compiler = "zig-cc"
+target = "x86_64-linux-musl"
+link = "static"
+flags = []
+
+[build.phases]
+# de build() de Alpine (traducido; el lab provee $CBUILD/$CHOST — Etapa G Fase 3; revisá --shared para estático):
+compile = '''
+_abuild_phase() {
+export CFLAGS="$CFLAGS -O3" # -O3 as the package is intended to use it
+ export CXXFLAGS="$CXXFLAGS -O3"
+ export CPPFLAGS="$CPPFLAGS -O3"
+
+ abuild-meson \
+ -Db_pgo=generate \
+ -Db_lto=true \
+ -Dterminfo-base-name=foot-extra \
+ -Dutmp-backend=none \
+ . output
+ meson compile -C output
+
+ ninja -C output test
+
+ # segfault on loongarch64
+ if [ "$CARCH" != "loongarch64" ]; then
+ ./pgo/full-headless-cage.sh . output
+ fi
+
+ meson configure -Db_pgo=use output
+ meson compile -C output
+}
+_abuild_phase
+'''
+# de package() de Alpine (traducido $pkgdir→/out):
+install = '''
+_abuild_phase() {
+DESTDIR="/out" meson install --no-rebuild -C output
+
+ install -Dm755 "$srcdir"/foot.initd "/out"/etc/user/init.d/foot
+}
+_abuild_phase
+'''
+
+# depends de runtime de Alpine (NO build-deps): ncurses-terminfo
+
+[deps]
+build = ["cage", "font-dejavu", "fcft", "fontconfig", "freetype", "libxkbcommon", "ncurses", "pixman", "scdoc", "tllist", "utf8proc", "wayland", "wayland-protocols"]
diff --git a/recipes/incoming-clib/freetype.toml b/recipes/incoming-clib/freetype.toml
deleted file mode 100644
index 3bb0c88c..00000000
--- a/recipes/incoming-clib/freetype.toml
+++ /dev/null
@@ -1,22 +0,0 @@
-# freetype 2.14.3 — ladrillo base de GUI (rasterizado de fuentes). Reescrita LIMPIA del import Alpine
-# (abuild-meson + ft2demos como fuente aparte) a meson static mínimo del lab. Sin png/harfbuzz/brotli
-# (deps opcionales) ⇒ leaf; zlib es la única dep real.
-name = "freetype"
-version = "2.14.3"
-
-[source]
-tarball = "https://download.savannah.gnu.org/releases/freetype/freetype-2.14.3.tar.xz"
-sha256 = "36bc4f1cc413335368ee656c42afca65c5a3987e8768cc28cf11ba775e785a5f"
-
-[build]
-compiler = "zig-cc"
-target = "x86_64-linux-musl"
-link = "static"
-
-[build.phases]
-configure = "PYTHONPATH=/usr/lib/python3.12/site-packages meson setup output --prefix=/usr --buildtype=release -Ddefault_library=static -Dharfbuzz=disabled -Dpng=disabled -Dbrotli=disabled -Dtests=disabled"
-compile = "PYTHONPATH=/usr/lib/python3.12/site-packages ninja -C output"
-install = "PYTHONPATH=/usr/lib/python3.12/site-packages DESTDIR=/out meson install -C output --no-rebuild"
-
-[deps]
-build = ["meson", "samurai", "python3", "pkgconf", "zlib"]
diff --git a/recipes/incoming-clib/git.toml b/recipes/incoming-clib/git.toml
new file mode 100644
index 00000000..461fc18f
--- /dev/null
+++ b/recipes/incoming-clib/git.toml
@@ -0,0 +1,54 @@
+# Importada de Alpine aports por `hammer import-alpine` (Etapa G). PUNTO DE PARTIDA — pero
+# YA trae los parches de musl de Alpine (lo que un import de nix pierde). Pendiente: el
+# sha256 del tarball (el wrapper lo calcula), y adaptar build/install del shell de abuild.
+name = "git"
+version = "2.54.0"
+
+[source]
+tarball = "https://www.kernel.org/pub/software/scm/git/git-2.54.0.tar.xz"
+# FIXME sha256: el wrapper lo calcula (Alpine publica sha512). sha512 de Alpine:
+# sha512 = "cb363917124edc245c9f6745e6e0c4093990275b4d57f9d2213c655b304ac81b05ece8d88546122727495ebc48a5ae19ab166a3ee43b6b8c68da488ac0270064"
+sha256 = "f689162364c10de79ef89aa8dbf48731eb057e34edbbd20aca510ce0154681a3"
+patches = ["fix-t4219-with-sticky-bit.patch"]
+
+[build]
+compiler = "zig-cc"
+target = "x86_64-linux-musl"
+link = "static"
+flags = []
+
+[build.phases]
+# de build() de Alpine (traducido; el lab provee $CBUILD/$CHOST — Etapa G Fase 3; revisá --shared para estático):
+compile = '''
+_abuild_phase() {
+make prefix=/usr \
+ DESTDIR="/out" \
+ perllibdir="$(_perl_config vendorlib)" \
+ all
+
+ make -C contrib/subtree prefix=/usr DESTDIR="/out"
+ make -C contrib/diff-highlight prefix=/usr DESTDIR="/out"
+
+ if [ -n "$_full_build" ]; then
+ # generate manpages outside of package()
+ make prefix=/usr man
+
+ make prefix=/usr -C contrib/credential/libsecret
+ fi
+}
+_abuild_phase
+'''
+# de package() de Alpine (traducido $pkgdir→/out):
+install = '''
+_abuild_phase() {
+make -C t prefix=/usr DESTDIR="/out" \
+ perlibdir="$(_perl_config vendorlib)" \
+ all
+}
+_abuild_phase
+'''
+
+# depends de runtime de Alpine (NO build-deps): perl
+
+[deps]
+build = ["asciidoc", "python3", "tcl", "tk", "libsecret", "glib"]
diff --git a/recipes/incoming-clib/gtk4-hello.toml b/recipes/incoming-clib/gtk4-hello.toml
deleted file mode 100644
index 017e29a5..00000000
--- a/recipes/incoming-clib/gtk4-hello.toml
+++ /dev/null
@@ -1,47 +0,0 @@
-# gtk4-hello — app GTK4 mínima de VALIDACIÓN: prueba que libgtk-4.a (static) es linkeable de verdad.
-# Reutiliza el tarball de GTK4 solo como acarreo de [source] (lo ignora); escribe su propio hello.c y
-# lo linkea ESTÁTICO contra todo el cierre GTK4 vía `pkg-config --static gtk4`. Si sella, el toolkit
-# de GUI del lab es usable por apps, no solo "compila". deps = cierre .pc completo + gtk4.
-name = "gtk4-hello"
-version = "4.18.6"
-
-[source]
-tarball = "https://download.gnome.org/sources/gtk/4.18/gtk-4.18.6.tar.xz"
-sha256 = "e1817c650ddc3261f9a8345b3b22a26a5d80af154630dedc03cc7becefffd0fa"
-
-[build]
-compiler = "zig-cc"
-target = "x86_64-linux-musl"
-link = "static"
-
-[build.phases]
-# no-op: el tarball trae meson.build y el lab inyectaría `meson setup` por defecto si omito configure.
-configure = "true"
-compile = '''
-cat > hammer_hello.c <<'CEOF'
-#include <gtk/gtk.h>
-static void activate(GtkApplication *app, gpointer user_data) {
- GtkWidget *win = gtk_application_window_new(app);
- gtk_window_set_title(GTK_WINDOW(win), "Hola desde hammer");
- gtk_window_set_default_size(GTK_WINDOW(win), 360, 220);
- GtkWidget *label = gtk_label_new("GTK4 static-musl ✓ (zig cc)");
- gtk_window_set_child(GTK_WINDOW(win), label);
- gtk_window_present(GTK_WINDOW(win));
-}
-int main(int argc, char **argv) {
- GtkApplication *app = gtk_application_new("org.hammer.hola", G_APPLICATION_DEFAULT_FLAGS);
- g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);
- int status = g_application_run(G_APPLICATION(app), argc, argv);
- g_object_unref(app);
- return status;
-}
-CEOF
-# gtk4.pc NO declara Libs.private (asume link dinámico contra libgtk-4.so); para ESTÁTICO hay que sumar
-# las privadas que gdk/gsk linkean directo (harfbuzz-subset, epoxy, wayland, xkbcommon, tiff, jpeg).
-export PKG_CONFIG_PATH=/usr/lib/pkgconfig
-zig cc -mcpu=baseline -static hammer_hello.c -o gtk4-hello $(pkg-config --cflags --libs --static gtk4 harfbuzz-subset epoxy xkbcommon wayland-client wayland-egl libtiff-4 libjpeg cairo-script-interpreter)
-'''
-install = "mkdir -p /out/usr/bin && cp gtk4-hello /out/usr/bin/gtk4-hello"
-
-[deps]
-build = ["pkgconf", "gtk4", "pango", "gdk-pixbuf", "cairo", "graphene", "glib", "harfbuzz", "fribidi", "fontconfig", "freetype", "pixman", "libpng", "expat", "libjpeg-turbo", "libtiff", "libepoxy", "wayland", "libxkbcommon", "libdrm", "pcre2", "libffi", "zlib", "mesa"]
diff --git a/recipes/incoming-clib/gtk4.toml b/recipes/incoming-clib/gtk4.toml
deleted file mode 100644
index e4b78d85..00000000
--- a/recipes/incoming-clib/gtk4.toml
+++ /dev/null
@@ -1,39 +0,0 @@
-# gtk4 4.18.6 — el toolkit de GUI. meson static, backend SOLO wayland (sin X11/broadway/win/mac),
-# renderer GL vía libepoxy (vulkan disabled), todo lo opcional off (demos/tests/docs/cups/gstreamer/
-# introspection). Corona el stack gráfico C del lab: con esto el corpus puede producir apps GTK reales.
-# Deps = cierre transitivo .pc completo (pkg-config estático resuelve Requires.private).
-name = "gtk4"
-version = "4.18.6"
-
-[source]
-tarball = "https://download.gnome.org/sources/gtk/4.18/gtk-4.18.6.tar.xz"
-sha256 = "e1817c650ddc3261f9a8345b3b22a26a5d80af154630dedc03cc7becefffd0fa"
-
-[build]
-compiler = "zig-cc"
-target = "x86_64-linux-musl"
-link = "static"
-
-[build.phases]
-# GTK4 construye libgtk.a (static_library 'gtk') Y libgtk-4.so; las tools linkean la .so con libgtk_dep,
-# imposible en el lab static-musl. Parche: que las tools usen libgtk_static_dep (la .a). El sed es seguro:
-# "libgtk_dep" NO es substring de "libgtk_static_dep" ⇒ no toca las que ya usan el estático.
-configure = "sed -i 's/libgtk_dep/libgtk_static_dep/g' tools/meson.build && PKG_CONFIG_PATH=/usr/lib/pkgconfig PYTHONPATH=/usr/lib/python3.12/site-packages meson setup output --prefix=/usr --buildtype=release --wrap-mode=nodownload --prefer-static -Ddefault_library=static -Dwayland-backend=true -Dx11-backend=false -Dbroadway-backend=false -Dwin32-backend=false -Dmacos-backend=false -Dvulkan=disabled -Dintrospection=disabled -Dbuild-demos=false -Dbuild-testsuite=false -Dbuild-tests=false -Dbuild-examples=false -Dmedia-gstreamer=disabled -Dprint-cups=disabled -Dprint-cpdb=disabled -Dcloudproviders=disabled -Dsysprof=disabled -Dtracker=disabled -Dcolord=disabled -Df16c=disabled -Ddocumentation=false -Dman-pages=false -Dc_args=-Wno-error=date-time"
-compile = "PYTHONPATH=/usr/lib/python3.12/site-packages ninja -C output"
-# meson instala solo libgtk-4.so y genera convenience-libs THIN (gtk/gdk/gsk por separado, referencian
-# los .o por ruta → inútiles fuera del build dir). Fusiono los tres en UN archive GORDO libgtk-4.a (embebe
-# todos los .o) para que `-lgtk-4` + `-static` linkee de verdad en el lab static-musl.
-install = '''
-PYTHONPATH=/usr/lib/python3.12/site-packages DESTDIR=/out meson install -C output --no-rebuild
-rm -f /out/usr/lib/libgtk-4.a
-cd output
-objs=""
-for a in $(find . -name '*.a'); do
- d=$(dirname "$a"); b=$(basename "$a")
- for o in $(cd "$d" && zig ar t "$b"); do objs="$objs $d/$o"; done
-done
-zig ar rcs /out/usr/lib/libgtk-4.a $objs
-'''
-
-[deps]
-build = ["meson", "samurai", "python3", "pkgconf", "glib", "cairo", "pango", "gdk-pixbuf", "graphene", "libepoxy", "wayland", "wayland-protocols", "libxkbcommon", "libdrm", "fontconfig", "harfbuzz", "fribidi", "libpng", "pixman", "freetype", "expat", "libffi", "pcre2", "zlib", "libjpeg-turbo", "libtiff", "mesa"]
diff --git a/recipes/incoming-clib/gtksourceview.toml b/recipes/incoming-clib/gtksourceview.toml
deleted file mode 100644
index 0d8159d9..00000000
--- a/recipes/incoming-clib/gtksourceview.toml
+++ /dev/null
@@ -1,23 +0,0 @@
-# gtksourceview 5.16.0 — widget de edición de código (resaltado, números de línea…) sobre GTK4.
-# Base de editores/IDEs (gnome-text-editor lo usa). meson static. introspection/vapi/docs/tests off.
-name = "gtksourceview"
-version = "5.16.0"
-
-[source]
-tarball = "https://download.gnome.org/sources/gtksourceview/5.16/gtksourceview-5.16.0.tar.xz"
-sha256 = "ab35d420102f3e8b055dd3b8642d3a48209f888189e6254d0ffb4b6a7e8c3566"
-
-[build]
-compiler = "zig-cc"
-target = "x86_64-linux-musl"
-link = "static"
-
-[build.phases]
-# gtksourceview 5.16 no tiene opción tests; los ejecutables de tests/testsuite linkean gtk4 estático y
-# fallan por las privadas (tiff/epoxy/cairo-script). La LIB sí construye → elimino esos subdirs con sed.
-configure = "sed -i \"/subdir('tests')/d;/subdir('testsuite')/d\" meson.build && PKG_CONFIG_PATH=/usr/lib/pkgconfig PYTHONPATH=/usr/lib/python3.12/site-packages meson setup output --prefix=/usr --buildtype=release --wrap-mode=nodownload --prefer-static -Ddefault_library=static -Dintrospection=disabled -Dvapi=false -Ddocumentation=false -Dsysprof=false -Dc_args=-Wno-error=date-time"
-compile = "PYTHONPATH=/usr/lib/python3.12/site-packages ninja -C output"
-install = "PYTHONPATH=/usr/lib/python3.12/site-packages DESTDIR=/out meson install -C output --no-rebuild"
-
-[deps]
-build = ["meson", "samurai", "python3", "pkgconf", "gettext-tiny", "gtk4", "pango", "gdk-pixbuf", "cairo", "graphene", "glib", "harfbuzz", "fribidi", "fontconfig", "freetype", "pixman", "libpng", "expat", "libxml2", "libjpeg-turbo", "libtiff", "libepoxy", "wayland", "wayland-protocols", "libxkbcommon", "libdrm", "pcre2", "libffi", "zlib", "mesa"]
diff --git a/recipes/incoming-clib/hammer-edit.toml b/recipes/incoming-clib/hammer-edit.toml
deleted file mode 100644
index 175956d1..00000000
--- a/recipes/incoming-clib/hammer-edit.toml
+++ /dev/null
@@ -1,138 +0,0 @@
-# hammer-edit — editor de código REAL para el distro: Adwaita + GtkSourceView, abrir/guardar/guardar-como
-# (GtkFileDialog), resaltado por extensión, números de línea, apertura de archivos desde la CLI. Link 100%
-# estático (gtk4+libadwaita+gtksourceview). No es una demo: es una app instalable y usable.
-name = "hammer-edit"
-version = "1.0.0"
-
-[source]
-tarball = "https://download.gnome.org/sources/gtksourceview/5.16/gtksourceview-5.16.0.tar.xz"
-sha256 = "ab35d420102f3e8b055dd3b8642d3a48209f888189e6254d0ffb4b6a7e8c3566"
-
-[build]
-compiler = "zig-cc"
-target = "x86_64-linux-musl"
-link = "static"
-
-[build.phases]
-configure = "true"
-compile = '''
-cat > hammer_edit.c <<'CEOF'
-#include <adwaita.h>
-#include <gtksourceview/gtksource.h>
-#include <string.h>
-
-typedef struct { GtkWindow *win; GtkSourceBuffer *buf; GFile *file; } App;
-
-static void set_title(App *a) {
- char *name = a->file ? g_file_get_basename(a->file) : g_strdup("Sin título");
- char *full = g_strdup_printf("%s — hammer-edit", name);
- gtk_window_set_title(a->win, full);
- g_free(name); g_free(full);
-}
-
-static void load_file(App *a, GFile *file) {
- char *contents; gsize len;
- if (!g_file_load_contents(file, NULL, &contents, &len, NULL, NULL)) return;
- gtk_text_buffer_set_text(GTK_TEXT_BUFFER(a->buf), contents, len);
- g_free(contents);
- g_set_object(&a->file, file);
- GtkSourceLanguageManager *lm = gtk_source_language_manager_get_default();
- char *base = g_file_get_basename(file);
- GtkSourceLanguage *lang = gtk_source_language_manager_guess_language(lm, base, NULL);
- gtk_source_buffer_set_language(a->buf, lang);
- g_free(base);
- set_title(a);
-}
-
-static void open_cb(GObject *src, GAsyncResult *res, gpointer ud) {
- App *a = ud;
- GFile *file = gtk_file_dialog_open_finish(GTK_FILE_DIALOG(src), res, NULL);
- if (file) { load_file(a, file); g_object_unref(file); }
-}
-static void on_open(GtkButton *b, gpointer ud) {
- App *a = ud;
- GtkFileDialog *d = gtk_file_dialog_new();
- gtk_file_dialog_open(d, a->win, NULL, open_cb, a);
- g_object_unref(d);
-}
-
-static void save_to(App *a, GFile *file) {
- GtkTextIter s, e;
- gtk_text_buffer_get_bounds(GTK_TEXT_BUFFER(a->buf), &s, &e);
- char *text = gtk_text_buffer_get_text(GTK_TEXT_BUFFER(a->buf), &s, &e, FALSE);
- g_file_replace_contents(file, text, strlen(text), NULL, FALSE,
- G_FILE_CREATE_NONE, NULL, NULL, NULL);
- g_free(text);
- g_set_object(&a->file, file);
- set_title(a);
-}
-static void save_cb(GObject *src, GAsyncResult *res, gpointer ud) {
- App *a = ud;
- GFile *file = gtk_file_dialog_save_finish(GTK_FILE_DIALOG(src), res, NULL);
- if (file) { save_to(a, file); g_object_unref(file); }
-}
-static void on_save(GtkButton *b, gpointer ud) {
- App *a = ud;
- if (a->file) { save_to(a, a->file); return; }
- GtkFileDialog *d = gtk_file_dialog_new();
- gtk_file_dialog_save(d, a->win, NULL, save_cb, a);
- g_object_unref(d);
-}
-
-static App *build_window(GtkApplication *app) {
- App *a = g_new0(App, 1);
- GtkWidget *win = adw_application_window_new(app);
- a->win = GTK_WINDOW(win);
- gtk_window_set_default_size(a->win, 820, 580);
- GtkWidget *tv = adw_toolbar_view_new();
- GtkWidget *hb = adw_header_bar_new();
- GtkWidget *ob = gtk_button_new_from_icon_name("document-open-symbolic");
- GtkWidget *sb = gtk_button_new_from_icon_name("document-save-symbolic");
- gtk_widget_set_tooltip_text(ob, "Abrir");
- gtk_widget_set_tooltip_text(sb, "Guardar");
- g_signal_connect(ob, "clicked", G_CALLBACK(on_open), a);
- g_signal_connect(sb, "clicked", G_CALLBACK(on_save), a);
- adw_header_bar_pack_start(ADW_HEADER_BAR(hb), ob);
- adw_header_bar_pack_end(ADW_HEADER_BAR(hb), sb);
- adw_toolbar_view_add_top_bar(ADW_TOOLBAR_VIEW(tv), hb);
- a->buf = gtk_source_buffer_new(NULL);
- gtk_source_buffer_set_highlight_syntax(a->buf, TRUE);
- GtkWidget *view = gtk_source_view_new_with_buffer(a->buf);
- gtk_source_view_set_show_line_numbers(GTK_SOURCE_VIEW(view), TRUE);
- gtk_source_view_set_highlight_current_line(GTK_SOURCE_VIEW(view), TRUE);
- gtk_source_view_set_auto_indent(GTK_SOURCE_VIEW(view), TRUE);
- gtk_widget_add_css_class(view, "monospace");
- GtkWidget *sc = gtk_scrolled_window_new();
- gtk_scrolled_window_set_child(GTK_SCROLLED_WINDOW(sc), view);
- adw_toolbar_view_set_content(ADW_TOOLBAR_VIEW(tv), sc);
- adw_application_window_set_content(ADW_APPLICATION_WINDOW(win), tv);
- set_title(a);
- return a;
-}
-
-static void activate(GApplication *app, gpointer ud) {
- App *a = build_window(GTK_APPLICATION(app));
- gtk_window_present(a->win);
-}
-static void open_files(GApplication *app, GFile **files, gint n, const char *hint, gpointer ud) {
- App *a = build_window(GTK_APPLICATION(app));
- if (n > 0) load_file(a, files[0]);
- gtk_window_present(a->win);
-}
-
-int main(int argc, char **argv) {
- AdwApplication *app = adw_application_new("org.hammer.edit", G_APPLICATION_HANDLES_OPEN);
- g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);
- g_signal_connect(app, "open", G_CALLBACK(open_files), NULL);
- int status = g_application_run(G_APPLICATION(app), argc, argv);
- g_object_unref(app);
- return status;
-}
-CEOF
-export PKG_CONFIG_PATH=/usr/lib/pkgconfig
-zig cc -mcpu=baseline -static hammer_edit.c -o hammer-edit $(pkg-config --cflags --libs --static gtksourceview-5 libadwaita-1 harfbuzz-subset epoxy xkbcommon wayland-client wayland-egl libtiff-4 libjpeg cairo-script-interpreter)
-'''
-install = "mkdir -p /out/usr/bin && cp hammer-edit /out/usr/bin/hammer-edit"
-
-[deps]
-build = ["pkgconf", "gtksourceview", "libadwaita", "appstream", "libyaml", "curl", "openssl", "libxmlb", "libxml2", "zstd", "gtk4", "pango", "gdk-pixbuf", "cairo", "graphene", "glib", "harfbuzz", "fribidi", "fontconfig", "freetype", "pixman", "libpng", "expat", "libjpeg-turbo", "libtiff", "libepoxy", "wayland", "libxkbcommon", "libdrm", "pcre2", "libffi", "zlib", "mesa"]
diff --git a/recipes/incoming-clib/zlib.toml b/recipes/incoming-clib/iproute2.toml
similarity index 54%
rename from recipes/incoming-clib/zlib.toml
rename to recipes/incoming-clib/iproute2.toml
index c6efa026..13ebb0aa 100644
--- a/recipes/incoming-clib/zlib.toml
+++ b/recipes/incoming-clib/iproute2.toml
@@ -1,14 +1,14 @@
# Importada de Alpine aports por `hammer import-alpine` (Etapa G). PUNTO DE PARTIDA — pero
# YA trae los parches de musl de Alpine (lo que un import de nix pierde). Pendiente: el
# sha256 del tarball (el wrapper lo calcula), y adaptar build/install del shell de abuild.
-name = "zlib"
-version = "1.3.2"
+name = "iproute2"
+version = "7.1.0"
[source]
-tarball = "https://zlib.net/fossils/zlib-1.3.2.tar.gz"
+tarball = "https://kernel.org/pub/linux/utils/net/iproute2/iproute2-7.1.0.tar.xz"
# FIXME sha256: el wrapper lo calcula (Alpine publica sha512). sha512 de Alpine:
-# sha512 = "70963771ea5d763614278a69b474f09b7d237ef8f53b675a10fe31d9923aeef601504b35d7ebd1b1e7f347e9ebb048e6b3b47fffdf137e7bdc7e8d5eb4ec4692"
-sha256 = "bb329a0a2cd0274d05519d61c667c062e06990d72e125ee2dfa8de64f0119d16"
+# sha512 = "17052405c4d220da7a93a52b9c9ea01c9fa4a8889b5d4758cae86c8c97c78ed4011d74ea3153ea44c0dd632215961e6cd6e5f9e369acb19bec0a822d2eb844b8"
+sha256 = "fd9fa1b95809417157ca83dd72957e3261bdbce896353cb936f80af0b33a4b5c"
[build]
compiler = "zig-cc"
@@ -20,21 +20,21 @@ flags = []
# de build() de Alpine (traducido; el lab provee $CBUILD/$CHOST — Etapa G Fase 3; revisá --shared para estático):
compile = '''
_abuild_phase() {
-# we trade size for a little more speed.
- export CFLAGS="$CFLAGS -O2"
- # lab static-musl: sin --shared (evita el test examplesh que linkea la .so con -static y zig rechaza).
- CHOST="$CHOST" ./configure \
- --prefix=/usr \
- --static \
- --disable-crcvx
- make libz.a
+export CFLAGS="$CFLAGS -flto=auto"
+ make V=1
}
_abuild_phase
'''
# de package() de Alpine (traducido $pkgdir→/out):
install = '''
_abuild_phase() {
-make install DESTDIR="/out"
+make DESTDIR="/out" install
+
+ install -D -m644 include/libnetlink.h "/out"/usr/include/libnetlink.h
+ install -D -m644 lib/libnetlink.a "/out"/usr/lib/libnetlink.a
}
_abuild_phase
'''
+
+[deps]
+build = ["bash", "bison", "elfutils", "flex", "iptables", "libcap", "libmnl"]
diff --git a/recipes/incoming-clib/iputils.toml b/recipes/incoming-clib/iputils.toml
new file mode 100644
index 00000000..e48ae620
--- /dev/null
+++ b/recipes/incoming-clib/iputils.toml
@@ -0,0 +1,59 @@
+# Importada de Alpine aports por `hammer import-alpine` (Etapa G). PUNTO DE PARTIDA — pero
+# YA trae los parches de musl de Alpine (lo que un import de nix pierde). Pendiente: el
+# sha256 del tarball (el wrapper lo calcula), y adaptar build/install del shell de abuild.
+name = "iputils"
+version = "20250605"
+
+[source]
+tarball = "https://github.com/iputils/iputils/releases/download/20250605/iputils-20250605.tar.xz"
+# FIXME sha256: el wrapper lo calcula (Alpine publica sha512). sha512 de Alpine:
+# sha512 = "1f3df2a4ea0a3f95bb9657d9ee36ed929fa841c9442dfd04e5d7f55ef533b0cac3182c2172b627c7ad7f366afdc1d232f2618d701bd1c601feadbfc754059cae"
+sha256 = "6f213700dbf96b5cc4499ca70cb15ecd69c09f405b06785bb4a1a10b572b6276"
+patches = ["0001-Use-getopt_long-for-opt-parsing-in-ping.patch"]
+
+[build]
+compiler = "zig-cc"
+target = "x86_64-linux-musl"
+link = "static"
+flags = []
+
+[build.phases]
+# de build() de Alpine (traducido; el lab provee $CBUILD/$CHOST — Etapa G Fase 3; revisá --shared para estático):
+compile = '''
+_abuild_phase() {
+abuild-meson \
+ -Db_lto=true \
+ -DNO_SETCAP_OR_SUID=true \
+ -DBUILD_MANS=true \
+ -DUSE_IDN=false \
+ -DUSE_GETTEXT=false \
+ . output
+ meson compile -C output
+}
+_abuild_phase
+'''
+# de package() de Alpine (traducido $pkgdir→/out):
+install = '''
+_abuild_phase() {
+depends="
+ iputils-arping=20250605-r$pkgrel
+ iputils-clockdiff=20250605-r$pkgrel
+ iputils-ping=20250605-r$pkgrel
+ iputils-tracepath=20250605-r$pkgrel
+ "
+
+ install -Dm4755 output/ping/ping "/out"/bin/ping
+
+ for name in arping clockdiff tracepath; do
+ install -Dm755 output/$name "/out"/usr/sbin/$name
+ done
+
+ ln -s tracepath "/out"/usr/sbin/tracepath6
+ ln -s ping "/out"/bin/ping6
+ install -D -m 644 -t "/out"/usr/share/man/man8 doc/*.8
+}
+_abuild_phase
+'''
+
+[deps]
+build = ["docbook-xsl", "libcap"]
diff --git a/recipes/incoming-clib/libadwaita.toml b/recipes/incoming-clib/libadwaita.toml
deleted file mode 100644
index e00a4a95..00000000
--- a/recipes/incoming-clib/libadwaita.toml
+++ /dev/null
@@ -1,22 +0,0 @@
-# libadwaita 1.7.6 — los widgets modernos de GNOME sobre GTK4 (Adwaita). meson static.
-# Compila sus estilos SCSS con sassc en build. examples/tests/vapi/introspection/docs off.
-# deps = gtk4 + su cierre .pc completo + sassc.
-name = "libadwaita"
-version = "1.7.6"
-
-[source]
-tarball = "https://download.gnome.org/sources/libadwaita/1.7/libadwaita-1.7.6.tar.xz"
-sha256 = "5eacc5550f0bdbba6a1568aebf25a3d88f5ee07d6b558becc6fd9487579c9a29"
-
-[build]
-compiler = "zig-cc"
-target = "x86_64-linux-musl"
-link = "static"
-
-[build.phases]
-configure = "PKG_CONFIG_PATH=/usr/lib/pkgconfig PYTHONPATH=/usr/lib/python3.12/site-packages meson setup output --prefix=/usr --buildtype=release --wrap-mode=nodownload --prefer-static -Ddefault_library=static -Dexamples=false -Dtests=false -Dvapi=false -Dintrospection=disabled -Dgtk_doc=false -Dc_args=-Wno-error=date-time"
-compile = "PYTHONPATH=/usr/lib/python3.12/site-packages ninja -C output"
-install = "PYTHONPATH=/usr/lib/python3.12/site-packages DESTDIR=/out meson install -C output --no-rebuild"
-
-[deps]
-build = ["meson", "samurai", "python3", "pkgconf", "sassc", "appstream", "libyaml", "curl", "openssl", "libxmlb", "libxml2", "zstd", "gtk4", "pango", "gdk-pixbuf", "cairo", "graphene", "glib", "harfbuzz", "fribidi", "fontconfig", "freetype", "pixman", "libpng", "expat", "libjpeg-turbo", "libtiff", "libepoxy", "wayland", "wayland-protocols", "libxkbcommon", "libdrm", "pcre2", "libffi", "zlib", "mesa"]
diff --git a/recipes/incoming-clib/libpng.toml b/recipes/incoming-clib/libpng.toml
deleted file mode 100644
index f25ed130..00000000
--- a/recipes/incoming-clib/libpng.toml
+++ /dev/null
@@ -1,16 +0,0 @@
-# libpng 1.6.58 — imágenes PNG (lo usan cairo/gdk-pixbuf). autotools static, dep zlib.
-name = "libpng"
-version = "1.6.58"
-[source]
-tarball = "https://downloads.sourceforge.net/libpng/libpng-1.6.58.tar.gz"
-sha256 = "8c9b05b675ca7301a458df2c2e46f26e1d41ff36b8863f8c33530bc58c2e6225"
-[build]
-compiler = "zig-cc"
-target = "x86_64-linux-musl"
-link = "static"
-[build.phases]
-configure = "./configure --prefix=/usr --disable-shared --enable-static"
-compile = "make"
-install = "make install DESTDIR=/out"
-[deps]
-build = ["zlib"]
diff --git a/recipes/incoming-clib/libxkbcommon.toml b/recipes/incoming-clib/libxkbcommon.toml
deleted file mode 100644
index 6255143c..00000000
--- a/recipes/incoming-clib/libxkbcommon.toml
+++ /dev/null
@@ -1,16 +0,0 @@
-# libxkbcommon 1.7.0 — manejo de teclados XKB (GTK/wayland). meson static, sin X11/docs.
-name = "libxkbcommon"
-version = "1.7.0"
-[source]
-tarball = "https://xkbcommon.org/download/libxkbcommon-1.7.0.tar.xz"
-sha256 = "65782f0a10a4b455af9c6baab7040e2f537520caa2ec2092805cdfd36863b247"
-[build]
-compiler = "zig-cc"
-target = "x86_64-linux-musl"
-link = "static"
-[build.phases]
-configure = "PKG_CONFIG_PATH=/usr/lib/pkgconfig PYTHONPATH=/usr/lib/python3.12/site-packages meson setup output --prefix=/usr --buildtype=release --wrap-mode=nodownload --prefer-static -Ddefault_library=static -Denable-x11=false -Denable-docs=false -Denable-wayland=false -Denable-xkbregistry=false"
-compile = "PYTHONPATH=/usr/lib/python3.12/site-packages ninja -C output"
-install = "PYTHONPATH=/usr/lib/python3.12/site-packages DESTDIR=/out meson install -C output --no-rebuild"
-[deps]
-build = ["meson", "samurai", "python3", "pkgconf", "bison", "flex"]
diff --git a/recipes/incoming-clib/libxml2.toml b/recipes/incoming-clib/libxml2.toml
deleted file mode 100644
index c1a98c8f..00000000
--- a/recipes/incoming-clib/libxml2.toml
+++ /dev/null
@@ -1,16 +0,0 @@
-# libxml2 2.13.9 — parser XML (lo usa fontconfig opcional, otros). autotools static.
-name = "libxml2"
-version = "2.13.9"
-[source]
-tarball = "https://download.gnome.org/sources/libxml2/2.13/libxml2-2.13.9.tar.xz"
-sha256 = "a2c9ae7b770da34860050c309f903221c67830c86e4a7e760692b803df95143a"
-[build]
-compiler = "zig-cc"
-target = "x86_64-linux-musl"
-link = "static"
-[build.phases]
-configure = "./configure --prefix=/usr --disable-shared --enable-static --without-python --without-lzma"
-compile = "make"
-install = "make install DESTDIR=/out"
-[deps]
-build = ["zlib"]
diff --git a/recipes/incoming-clib/libyaml.toml b/recipes/incoming-clib/libyaml.toml
deleted file mode 100644
index 05b4e0b1..00000000
--- a/recipes/incoming-clib/libyaml.toml
+++ /dev/null
@@ -1,20 +0,0 @@
-# libyaml 0.2.5 — parser YAML (lo usa appstream). autotools static mínimo, leaf.
-name = "libyaml"
-version = "0.2.5"
-
-[source]
-tarball = "https://github.com/yaml/libyaml/releases/download/0.2.5/yaml-0.2.5.tar.gz"
-sha256 = "c642ae9b75fee120b2d96c712538bd2cf283228d2337df2cf2988e3c02678ef4"
-
-[build]
-compiler = "zig-cc"
-target = "x86_64-linux-musl"
-link = "static"
-
-[build.phases]
-configure = "./configure --prefix=/usr --build=$CBUILD --host=$CHOST --disable-shared --enable-static"
-compile = "make -j4"
-install = "make install DESTDIR=/out"
-
-[deps]
-build = []
diff --git a/recipes/incoming-clib/make-tests.patch b/recipes/incoming-clib/make-tests.patch
new file mode 100644
index 00000000..7a8eab06
--- /dev/null
+++ b/recipes/incoming-clib/make-tests.patch
@@ -0,0 +1,50 @@
+--- a/tests/Makefile.in 2026-05-10 12:42:57.029507661 +0000
++++ b/tests/Makefile.in 2026-05-10 12:44:14.885350155 +0000
+@@ -2044,16 +2044,12 @@
+ SH_LOG_COMPILER = $(SHELL)
+ TESTS = \
+ help-version.sh \
+- t0000-basic.sh \
+- t0001-tiny.sh \
+ t0010-script-no-ctrl-chars.sh \
+ t0100-print.sh \
+ t0101-print-empty.sh \
+ t0200-gpt.sh \
+ t0201-gpt.sh \
+ t0202-gpt-pmbr.sh \
+- t0203-gpt-tiny-device-abort.sh \
+- t0203-gpt-shortened-device-primary-valid.sh \
+ t0203-gpt-create-on-min-sized-device.sh \
+ t0205-gpt-list-clobbers-pmbr.sh \
+ t0206-gpt-print-with-corrupt-primary-clobbers-pmbr.sh \
+@@ -2064,18 +2060,12 @@
+ t0211-gpt-rewrite-header.sh \
+ t0212-gpt-many-partitions.sh \
+ t0213-mkpart-start-negative.sh \
+- t0215-gpt-attrs.sh \
+ t0220-gpt-msftres.sh \
+ t0250-gpt.sh \
+- t0251-gpt-unicode.sh \
+ t0280-gpt-corrupt.sh \
+- t0281-gpt-grow.sh \
+- t0282-gpt-move-backup.sh \
+- t0283-overlap-partitions.sh \
+ t0290-gpt-name.sh \
+ t0300-dos-on-gpt.sh \
+ t0301-overwrite-gpt-pmbr.sh \
+- t0350-mac-PT-increases-sector-size.sh \
+ t0400-loop-clobber-infloop.sh \
+ t0500-dup-clobber.sh \
+ t0501-duplicate.sh \
+@@ -2105,11 +2095,8 @@
+ t3200-type-change.sh \
+ t3210-gpt-type-change.sh \
+ t3300-palo-prep.sh \
+- t3310-flags.sh \
+- t3400-whole-disk-FAT-partition.sh \
+ t4000-sun-raid-type.sh \
+ t4001-sun-vtoc.sh \
+- t4002-sun-badlabel.sh \
+ t4100-msdos-partition-limits.sh \
+ t4100-dvh-partition-limits.sh \
+ t4100-msdos-starting-sector.sh \
diff --git a/recipes/incoming-clib/manpage-example-path.patch b/recipes/incoming-clib/manpage-example-path.patch
new file mode 100644
index 00000000..31048c70
--- /dev/null
+++ b/recipes/incoming-clib/manpage-example-path.patch
@@ -0,0 +1,16 @@
+--- OpenDoas-6.8.1.orig/doas.conf.5
++++ OpenDoas-6.8.1/doas.conf.5
+@@ -114,11 +114,11 @@
+ it is not considered a keyword.
+ .El
+ .Sh FILES
+-.Bl -tag -width /etc/examples/doas.conf -compact
++.Bl -tag -width /usr/share/doc/doas/doas.conf.example -compact
+ .It Pa /etc/doas.conf
+ .Xr doas 1
+ configuration file.
+-.It Pa /etc/examples/doas.conf
++.It Pa /usr/share/doc/doas/doas.conf.example
+ Example configuration file.
+ .El
+ .Sh EXAMPLES
diff --git a/recipes/incoming-clib/pango.toml b/recipes/incoming-clib/pango.toml
deleted file mode 100644
index 2fab4f94..00000000
--- a/recipes/incoming-clib/pango.toml
+++ /dev/null
@@ -1,16 +0,0 @@
-# pango 1.57.1 — layout/render de texto i18n (base de GTK). meson static.
-name = "pango"
-version = "1.57.1"
-[source]
-tarball = "https://download.gnome.org/sources/pango/1.57/pango-1.57.1.tar.xz"
-sha256 = "e65d6d117080dc3aeeb7d8b4b3b518f7383aa2e6cfce23117c623cd624764c2f"
-[build]
-compiler = "zig-cc"
-target = "x86_64-linux-musl"
-link = "static"
-[build.phases]
-configure = "PKG_CONFIG_PATH=/usr/lib/pkgconfig PYTHONPATH=/usr/lib/python3.12/site-packages meson setup output --prefix=/usr --buildtype=release --wrap-mode=nodownload --prefer-static -Ddefault_library=static -Dc_args=-Wno-error=date-time -Dintrospection=disabled -Dgtk_doc=false -Dbuild-testsuite=false -Dbuild-examples=false"
-compile = "PYTHONPATH=/usr/lib/python3.12/site-packages ninja -C output"
-install = "PYTHONPATH=/usr/lib/python3.12/site-packages DESTDIR=/out meson install -C output --no-rebuild"
-[deps]
-build = ["meson", "samurai", "python3", "pkgconf", "cairo", "harfbuzz", "fribidi", "glib", "freetype", "fontconfig", "pixman", "libpng", "expat", "libffi", "pcre2", "zlib"]
diff --git a/recipes/incoming-clib/parted-include-sysmacros.patch b/recipes/incoming-clib/parted-include-sysmacros.patch
new file mode 100644
index 00000000..52ec588c
--- /dev/null
+++ b/recipes/incoming-clib/parted-include-sysmacros.patch
@@ -0,0 +1,10 @@
+--- a/libparted/arch/linux.c
++++ b/libparted/arch/linux.c
+@@ -38,6 +38,7 @@
+ #include <sys/ioctl.h>
+ #include <sys/stat.h>
+ #include <sys/types.h>
++#include <sys/sysmacros.h>
+ #include <sys/utsname.h> /* for uname() */
+ #include <scsi/scsi.h>
+ #include <assert.h>
diff --git a/recipes/incoming-clib/parted.toml b/recipes/incoming-clib/parted.toml
new file mode 100644
index 00000000..93d2d904
--- /dev/null
+++ b/recipes/incoming-clib/parted.toml
@@ -0,0 +1,45 @@
+# Importada de Alpine aports por `hammer import-alpine` (Etapa G). PUNTO DE PARTIDA — pero
+# YA trae los parches de musl de Alpine (lo que un import de nix pierde). Pendiente: el
+# sha256 del tarball (el wrapper lo calcula), y adaptar build/install del shell de abuild.
+name = "parted"
+version = "3.7"
+
+[source]
+tarball = "https://ftp.gnu.org/gnu/parted/parted-3.7.tar.xz"
+# FIXME sha256: el wrapper lo calcula (Alpine publica sha512). sha512 de Alpine:
+# sha512 = "941afeb68edb45c33fb797f4c320ed1aa1de2e8b35defa5d742aa6894618e6729a1440e3ee0824e8710bc58eb42b85d77f28ba083d92d4ea3f3f65f37c8307b0"
+sha256 = "008de57561a4f3c25a0648e66ed11e7b30be493889b64334a6d70f2c1951ef7b"
+patches = ["fix-includes.patch", "fix-libintl-header-s390x.patch", "parted-include-sysmacros.patch", "fix-truncate-tests.patch", "make-tests.patch", "skip-duplicate-bsd-test-on-s390x.patch"]
+
+[build]
+compiler = "zig-cc"
+target = "x86_64-linux-musl"
+link = "static"
+flags = []
+
+[build.phases]
+# de build() de Alpine (traducido; el lab provee $CBUILD/$CHOST — Etapa G Fase 3; revisá --shared para estático):
+compile = '''
+_abuild_phase() {
+./configure \
+ --build=$CBUILD \
+ --host=$CHOST \
+ --prefix=/usr \
+ --enable-debug \
+ --disable-nls \
+ --disable-static \
+ --enable-shared
+ make
+}
+_abuild_phase
+'''
+# de package() de Alpine (traducido $pkgdir→/out):
+install = '''
+_abuild_phase() {
+make DESTDIR="/out" install
+}
+_abuild_phase
+'''
+
+[deps]
+build = ["bash", "lvm2", "ncurses", "readline", "util-linux"]
diff --git a/recipes/incoming-clib/pcre2.toml b/recipes/incoming-clib/pcre2.toml
deleted file mode 100644
index 9bd50e8c..00000000
--- a/recipes/incoming-clib/pcre2.toml
+++ /dev/null
@@ -1,14 +0,0 @@
-# pcre2 10.47 — regex (lo usa glib). autotools static, limpio.
-name = "pcre2"
-version = "10.47"
-[source]
-tarball = "https://github.com/PhilipHazel/pcre2/releases/download/pcre2-10.47/pcre2-10.47.tar.bz2"
-sha256 = "47fe8c99461250d42f89e6e8fdaeba9da057855d06eb7fc08d9ca03fd08d7bc7"
-[build]
-compiler = "zig-cc"
-target = "x86_64-linux-musl"
-link = "static"
-[build.phases]
-configure = "./configure --prefix=/usr --disable-shared --enable-static --enable-pcre2-16 --enable-pcre2-32 --enable-jit"
-compile = "make"
-install = "make install DESTDIR=/out"
diff --git a/recipes/incoming-clib/pixman.toml b/recipes/incoming-clib/pixman.toml
deleted file mode 100644
index bce02dbf..00000000
--- a/recipes/incoming-clib/pixman.toml
+++ /dev/null
@@ -1,21 +0,0 @@
-# pixman 0.46.4 — ladrillo base de GUI (rasterizado 2D; lo usa cairo). meson static mínimo, leaf
-# (sin libpng/demos/tests/gtk).
-name = "pixman"
-version = "0.46.4"
-
-[source]
-tarball = "https://xorg.freedesktop.org/releases/individual/lib/pixman-0.46.4.tar.xz"
-sha256 = "a098c33924754ad43f981b740f6d576c70f9ed1006e12221b1845431ebce1239"
-
-[build]
-compiler = "zig-cc"
-target = "x86_64-linux-musl"
-link = "static"
-
-[build.phases]
-configure = "PYTHONPATH=/usr/lib/python3.12/site-packages meson setup output --prefix=/usr --buildtype=release -Ddefault_library=static -Dlibpng=disabled -Ddemos=disabled -Dtests=disabled -Dgtk=disabled"
-compile = "PYTHONPATH=/usr/lib/python3.12/site-packages ninja -C output"
-install = "PYTHONPATH=/usr/lib/python3.12/site-packages DESTDIR=/out meson install -C output --no-rebuild"
-
-[deps]
-build = ["meson", "samurai", "python3", "pkgconf"]
diff --git a/recipes/incoming-clib/rowhammer.patch b/recipes/incoming-clib/rowhammer.patch
new file mode 100644
index 00000000..761ffb42
--- /dev/null
+++ b/recipes/incoming-clib/rowhammer.patch
@@ -0,0 +1,73 @@
+This patch has been taken from OpenBSD upstream, it changes permit bits to make
+them more rowhammer-resistent. A similar patch has also been committed to sudo.
+
+The patch has not made its way into OpenDoas yet, but at the time of writting
+OpenDoas upstream is rather stale (last commit was done 2 years ago).
+
+See:
+
+* https://github.com/openbsd/src/commit/38599afa1d1d1f14a897b01350e8ce94486e1788
+* https://github.com/sudo-project/sudo/commit/7873f8334c8d31031f8cfa83bd97ac6029309e4f
+
+diff --git a/doas.c b/doas.c
+index ac3a42a..93f0836 100644
+--- a/doas.c
++++ b/doas.c
+@@ -148,8 +148,10 @@ permit(uid_t uid, gid_t *groups, int ngroups, const struct rule **lastr,
+ *lastr = rules[i];
+ }
+ if (!*lastr)
++ return -1;
++ if ((*lastr)->action == PERMIT)
+ return 0;
+- return (*lastr)->action == PERMIT;
++ return -1;
+ }
+
+ static void
+@@ -184,6 +186,7 @@ checkconfig(const char *confpath, int argc, char **argv,
+ uid_t uid, gid_t *groups, int ngroups, uid_t target)
+ {
+ const struct rule *rule;
++ int rv;
+
+ if (setresuid(uid, uid, uid) != 0)
+ err(1, "setresuid");
+@@ -191,9 +194,9 @@ checkconfig(const char *confpath, int argc, char **argv,
+ parseconfig(confpath, 0);
+ if (!argc)
+ exit(0);
+-
+- if (permit(uid, groups, ngroups, &rule, target, argv[0],
+- (const char **)argv + 1)) {
++ rv = permit(uid, groups, ngroups, &rule, target, argv[0],
++ (const char **)argv + 1);
++ if (rv == 0) {
+ printf("permit%s\n", (rule->options & NOPASS) ? " nopass" : "");
+ exit(0);
+ } else {
+@@ -342,8 +345,9 @@ main(int argc, char **argv)
+ }
+
+ cmd = argv[0];
+- if (!permit(uid, groups, ngroups, &rule, target, cmd,
+- (const char **)argv + 1)) {
++ rv = permit(uid, groups, ngroups, &rule, target, cmd,
++ (const char **)argv + 1);
++ if (rv != 0) {
+ syslog(LOG_AUTHPRIV | LOG_NOTICE,
+ "command not permitted for %s: %s", mypw->pw_name, cmdline);
+ errc(1, EPERM, NULL);
+diff --git a/doas.h b/doas.h
+index a8aa41b..591816f 100644
+--- a/doas.h
++++ b/doas.h
+@@ -36,7 +36,7 @@ struct passwd;
+ char **prepenv(const struct rule *, const struct passwd *,
+ const struct passwd *);
+
+-#define PERMIT 1
++#define PERMIT -1
+ #define DENY 2
+
+ #define NOPASS 0x1
diff --git a/recipes/incoming-clib/rsync.toml b/recipes/incoming-clib/rsync.toml
new file mode 100644
index 00000000..a6407cac
--- /dev/null
+++ b/recipes/incoming-clib/rsync.toml
@@ -0,0 +1,62 @@
+# Importada de Alpine aports por `hammer import-alpine` (Etapa G). PUNTO DE PARTIDA — pero
+# YA trae los parches de musl de Alpine (lo que un import de nix pierde). Pendiente: el
+# sha256 del tarball (el wrapper lo calcula), y adaptar build/install del shell de abuild.
+name = "rsync"
+version = "3.4.4"
+
+[source]
+tarball = "https://download.samba.org/pub/rsync/rsync-3.4.4.tar.gz"
+# FIXME sha256: el wrapper lo calcula (Alpine publica sha512). sha512 de Alpine:
+# sha512 = "cf9a838b1f019b70fd67fa2c293f267be3f24e579c2ea33177ec7afc502c97ce0b613ff0854088c0eb28acd14ee0a75706ae8445115cef4669bd586c505d8453"
+sha256 = "bd88cf82fa653da32314fb229136407c5c90f80d1758d8f4b091767877d8fa96"
+patches = ["dont-use-nobody.patch"]
+
+[build]
+compiler = "zig-cc"
+target = "x86_64-linux-musl"
+link = "static"
+flags = []
+
+[build.phases]
+# de build() de Alpine (traducido; el lab provee $CBUILD/$CHOST — Etapa G Fase 3; revisá --shared para estático):
+compile = '''
+_abuild_phase() {
+cp rrsync.1 support/rrsync.1
+ CFLAGS="$CFLAGS -flto=auto" \
+ ./configure \
+ --build=$CBUILD \
+ --host=$CHOST \
+ --prefix=/usr \
+ --sysconfdir=/etc \
+ --mandir=/usr/share/man \
+ --localstatedir=/var \
+ --enable-acl-support \
+ --enable-xattr-support \
+ --enable-xxhash \
+ --with-rrsync \
+ --without-included-popt \
+ --without-included-zlib \
+ --disable-md2man \
+ --disable-openssl
+ # openssl is disabled since xxh checksums are faster anyway
+ make
+}
+_abuild_phase
+'''
+# de package() de Alpine (traducido $pkgdir→/out):
+install = '''
+_abuild_phase() {
+make DESTDIR="/out" install
+
+ install -Dm755 "$srcdir"/rsyncd.initd "/out"/etc/init.d/rsyncd
+ install -Dm644 "$srcdir"/rsyncd.conf "/out"/etc/rsyncd.conf
+ install -Dm644 "$srcdir"/rsyncd.confd "/out"/etc/conf.d/rsyncd
+ install -Dm644 "$srcdir"/rsyncd.logrotate "/out"/etc/logrotate.d/rsyncd
+}
+_abuild_phase
+'''
+
+# depends de runtime de Alpine (NO build-deps): python3
+
+[deps]
+build = ["acl", "attr", "linux-headers", "lz4", "perl", "popt", "xxhash", "zlib", "zstd"]
diff --git a/recipes/incoming-clib/xz.toml b/recipes/incoming-clib/sed.toml
similarity index 56%
rename from recipes/incoming-clib/xz.toml
rename to recipes/incoming-clib/sed.toml
index 139a6bd4..961b8a0e 100644
--- a/recipes/incoming-clib/xz.toml
+++ b/recipes/incoming-clib/sed.toml
@@ -1,13 +1,15 @@
# Importada de Alpine aports por `hammer import-alpine` (Etapa G). PUNTO DE PARTIDA — pero
# YA trae los parches de musl de Alpine (lo que un import de nix pierde). Pendiente: el
# sha256 del tarball (el wrapper lo calcula), y adaptar build/install del shell de abuild.
-name = "xz"
-version = "5.8.3"
+name = "sed"
+version = "4.10"
[source]
-# tarball de RELEASE (trae ./configure pre-generado); el archive del tag NO ⇒ pedía autoconf/automake.
-tarball = "https://github.com/tukaani-project/xz/releases/download/v5.8.3/xz-5.8.3.tar.gz"
-sha256 = "3d3a1b973af218114f4f889bbaa2f4c037deaae0c8e815eec381c3d546b974a0"
+tarball = "https://ftp.gnu.org/pub/gnu/sed/sed-4.10.tar.xz"
+# FIXME sha256: el wrapper lo calcula (Alpine publica sha512). sha512 de Alpine:
+# sha512 = "20224df834b363ca1357024234bb93df3929c252c40c7ef3d23e78fc05177c7986e3145a5049d63db746a4dc2c97befb0324a87ea081507292ff6cd5383ee9db"
+sha256 = "b8e72182b2ec96a3574e2998c47b7aaa64cc20ce000d8e9ac313cc07cecf28c7"
+patches = ["skip-test-memset_explicit-on-arm.patch"]
[build]
compiler = "zig-cc"
@@ -19,24 +21,16 @@ flags = []
# de build() de Alpine (traducido; el lab provee $CBUILD/$CHOST — Etapa G Fase 3; revisá --shared para estático):
compile = '''
_abuild_phase() {
-# compression utility
- CFLAGS="$CFLAGS -O3" \
+CFLAGS="$CFLAGS -flto=auto" \
./configure \
--build=$CBUILD \
--host=$CHOST \
--prefix=/usr \
- --sysconfdir=/etc \
+ --bindir=/bin \
--mandir=/usr/share/man \
--infodir=/usr/share/info \
- --localstatedir=/var \
- --disable-rpath \
- --disable-werror \
- --disable-doc
-
- sed -i \
- -e 's|^hardcode_libdir_flag_spec=.*|hardcode_libdir_flag_spec=""|g' \
- -e 's|^runpath_var=LD_RUN_PATH|runpath_var=DIE_RPATH_DIE|g' \
- libtool
+ --disable-i18n \
+ --disable-nls
make
}
_abuild_phase
@@ -45,9 +39,12 @@ _abuild_phase
install = '''
_abuild_phase() {
make DESTDIR="/out" install
+
+ rm -rf "/out"/usr/lib/charset.alias || true
+ rmdir -p "/out"/usr/lib 2>/dev/null || true
}
_abuild_phase
'''
[deps]
-build = ["gettext-tiny"]
+build = ["perl", "linux-headers"]
diff --git a/recipes/incoming-clib/skip-duplicate-bsd-test-on-s390x.patch b/recipes/incoming-clib/skip-duplicate-bsd-test-on-s390x.patch
new file mode 100644
index 00000000..f938e5b8
--- /dev/null
+++ b/recipes/incoming-clib/skip-duplicate-bsd-test-on-s390x.patch
@@ -0,0 +1,16 @@
+--- a/tests/t0501-duplicate.sh
++++ b/tests/t0501-duplicate.sh
+@@ -18,9 +18,13 @@
+
+ . "${srcdir=.}/init.sh"; path_prepend_ ../parted .
+
++arch=$(uname -m)
+ for t in msdos gpt bsd sun atari mac pc98; do
+ case $t in
+ atari) [ $ss -ne 512 ] && continue
++ ;;
++ bsd) [ "$arch" = "s390x" ] && continue
++ duplicate $t || fail=1
+ ;;
+ *) duplicate $t || fail=1
+ ;;
diff --git a/recipes/incoming-clib/skip-test-memset_explicit-on-arm.patch b/recipes/incoming-clib/skip-test-memset_explicit-on-arm.patch
new file mode 100644
index 00000000..df9d0c93
--- /dev/null
+++ b/recipes/incoming-clib/skip-test-memset_explicit-on-arm.patch
@@ -0,0 +1,17 @@
+--- a/gnulib-tests/test-memset_explicit.c
++++ b/gnulib-tests/test-memset_explicit.c
+@@ -183,6 +183,14 @@
+ {
+ }
+
++#elif defined __arm__ && !defined __aarch64__
++
++static void
++test_stack (void)
++{
++ fputs ("test_stack: skipped on 32-bit ARM\n", stdout);
++}
++
+ #else
+
+ /* There are two passes:
diff --git a/recipes/incoming-clib/sourceview-hello.toml b/recipes/incoming-clib/sourceview-hello.toml
deleted file mode 100644
index c7426972..00000000
--- a/recipes/incoming-clib/sourceview-hello.toml
+++ /dev/null
@@ -1,57 +0,0 @@
-# sourceview-hello — VALIDACIÓN del editor: ventana Adwaita con un GtkSourceView (resaltado C, números
-# de línea) editable. Junta libadwaita + gtksourceview + gtk4, link 100% estático. Es, de hecho, el
-# esqueleto de un editor de código real para el distro.
-name = "sourceview-hello"
-version = "5.16.0"
-
-[source]
-tarball = "https://download.gnome.org/sources/gtksourceview/5.16/gtksourceview-5.16.0.tar.xz"
-sha256 = "ab35d420102f3e8b055dd3b8642d3a48209f888189e6254d0ffb4b6a7e8c3566"
-
-[build]
-compiler = "zig-cc"
-target = "x86_64-linux-musl"
-link = "static"
-
-[build.phases]
-configure = "true"
-compile = '''
-cat > sv_hello.c <<'CEOF'
-#include <adwaita.h>
-#include <gtksourceview/gtksource.h>
-static void activate(GtkApplication *app, gpointer user_data) {
- GtkWidget *win = adw_application_window_new(app);
- gtk_window_set_title(GTK_WINDOW(win), "Editor hammer");
- gtk_window_set_default_size(GTK_WINDOW(win), 640, 420);
- GtkWidget *toolbar = adw_toolbar_view_new();
- adw_toolbar_view_add_top_bar(ADW_TOOLBAR_VIEW(toolbar), adw_header_bar_new());
- GtkSourceBuffer *buf = gtk_source_buffer_new(NULL);
- GtkSourceLanguageManager *lm = gtk_source_language_manager_get_default();
- GtkSourceLanguage *lang = gtk_source_language_manager_get_language(lm, "c");
- if (lang) gtk_source_buffer_set_language(buf, lang);
- gtk_text_buffer_set_text(GTK_TEXT_BUFFER(buf),
- "#include <stdio.h>\nint main(void){\n printf(\"hola hammer\\n\");\n return 0;\n}\n", -1);
- GtkWidget *view = gtk_source_view_new_with_buffer(buf);
- gtk_source_view_set_show_line_numbers(GTK_SOURCE_VIEW(view), TRUE);
- gtk_widget_add_css_class(view, "monospace");
- GtkWidget *scroll = gtk_scrolled_window_new();
- gtk_scrolled_window_set_child(GTK_SCROLLED_WINDOW(scroll), view);
- adw_toolbar_view_set_content(ADW_TOOLBAR_VIEW(toolbar), scroll);
- adw_application_window_set_content(ADW_APPLICATION_WINDOW(win), toolbar);
- gtk_window_present(GTK_WINDOW(win));
-}
-int main(int argc, char **argv) {
- AdwApplication *app = adw_application_new("org.hammer.editor", G_APPLICATION_DEFAULT_FLAGS);
- g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);
- int status = g_application_run(G_APPLICATION(app), argc, argv);
- g_object_unref(app);
- return status;
-}
-CEOF
-export PKG_CONFIG_PATH=/usr/lib/pkgconfig
-zig cc -mcpu=baseline -static sv_hello.c -o sourceview-hello $(pkg-config --cflags --libs --static gtksourceview-5 libadwaita-1 harfbuzz-subset epoxy xkbcommon wayland-client wayland-egl libtiff-4 libjpeg cairo-script-interpreter)
-'''
-install = "mkdir -p /out/usr/bin && cp sourceview-hello /out/usr/bin/sourceview-hello"
-
-[deps]
-build = ["pkgconf", "gtksourceview", "libadwaita", "appstream", "libyaml", "curl", "openssl", "libxmlb", "libxml2", "zstd", "gtk4", "pango", "gdk-pixbuf", "cairo", "graphene", "glib", "harfbuzz", "fribidi", "fontconfig", "freetype", "pixman", "libpng", "expat", "libjpeg-turbo", "libtiff", "libepoxy", "wayland", "libxkbcommon", "libdrm", "pcre2", "libffi", "zlib", "mesa"]
diff --git a/recipes/incoming-clib/sudo.toml b/recipes/incoming-clib/sudo.toml
new file mode 100644
index 00000000..e195798c
--- /dev/null
+++ b/recipes/incoming-clib/sudo.toml
@@ -0,0 +1,62 @@
+# Importada de Alpine aports por `hammer import-alpine` (Etapa G). PUNTO DE PARTIDA — pero
+# YA trae los parches de musl de Alpine (lo que un import de nix pierde). Pendiente: el
+# sha256 del tarball (el wrapper lo calcula), y adaptar build/install del shell de abuild.
+name = "sudo"
+version = "1.9.17_p2"
+
+[source]
+tarball = "https://www.sudo.ws/dist/sudo-${pkgver/_/}.tar.gz"
+# FIXME sha256: el wrapper lo calcula (Alpine publica sha512). sha512 de Alpine:
+# sha512 = "c8abd6ca56e54a081c9ef1e9f6579d1db5b93ff857e60d1f58d1f425d7dc23c31c58d40b7819780688f66dfdf87a1f3bbe0a78387b007e2beb1b0e546203ea93"
+sha256 = "FIXME-sha256"
+
+[build]
+compiler = "zig-cc"
+target = "x86_64-linux-musl"
+link = "static"
+flags = []
+
+[build.phases]
+# de build() de Alpine (traducido; el lab provee $CBUILD/$CHOST — Etapa G Fase 3; revisá --shared para estático):
+compile = '''
+_abuild_phase() {
+CFLAGS="$CFLAGS -flto=auto" \
+ ./configure \
+ --build=$CBUILD \
+ --host=$CHOST \
+ --prefix=/usr \
+ --libexecdir=/usr/lib \
+ --mandir=/usr/share/man \
+ --with-rundir=/run/sudo \
+ --with-vardir=/var/lib/sudo \
+ --with-tzdir=/usr/share/zoneinfo \
+ --with-logdir=/var/log \
+ --with-iologdir=/var/log/sudo-io \
+ --with-logpath=/var/log/sudo.log \
+ --with-relaydir=/var/log/sudo_logsrvd \
+ --disable-nls \
+ --enable-pie \
+ --with-env-editor \
+ --with-mdoc \
+ --without-pam \
+ --without-skey \
+ --with-sendmail=/usr/sbin/sendmail \
+ --with-passprompt="[sudo] password for %p: "
+
+ make
+}
+_abuild_phase
+'''
+# de package() de Alpine (traducido $pkgdir→/out):
+install = '''
+_abuild_phase() {
+# the sudo's mkinstalldir script miscreates the leading
+ # path components with bad permissions. fix this.
+ install -dm0755 "/out"/var "/out"/var/db
+ make -j1 DESTDIR="/out" install
+
+ # Exactly the same as /etc/sudoers
+ rm -v "/out"/etc/sudoers.dist
+}
+_abuild_phase
+'''
diff --git a/recipes/incoming-clib/tzdata.toml b/recipes/incoming-clib/tzdata.toml
new file mode 100644
index 00000000..b3e875b4
--- /dev/null
+++ b/recipes/incoming-clib/tzdata.toml
@@ -0,0 +1,51 @@
+# Importada de Alpine aports por `hammer import-alpine` (Etapa G). PUNTO DE PARTIDA — pero
+# YA trae los parches de musl de Alpine (lo que un import de nix pierde). Pendiente: el
+# sha256 del tarball (el wrapper lo calcula), y adaptar build/install del shell de abuild.
+name = "tzdata"
+version = "2026b"
+
+[source]
+tarball = "https://www.iana.org/time-zones/repository/releases/tzcode2026b.tar.gz"
+# FIXME sha256: el wrapper lo calcula (Alpine publica sha512). sha512 de Alpine:
+# sha512 = "55b44d52a83c9db151be32c3d78376ea7f9d4311ef15ed6fe34b855b08fc546531e51309d178d9c175a6d5d7d0b058440e45a55d200ca8925e3798dac9bc739f"
+sha256 = "37e9ed8427f5d3521c22fc58e293cbfb043d70eedf1003870b33f363f61ca344"
+patches = ["0001-posixtz-ensure-the-file-offset-we-pass-to-lseek-is-o.patch", "0002-fix-implicit-declaration-warnings-by-including-strin.patch"]
+
+[build]
+compiler = "zig-cc"
+target = "x86_64-linux-musl"
+link = "static"
+flags = []
+
+[build.phases]
+# de build() de Alpine (traducido; el lab provee $CBUILD/$CHOST — Etapa G Fase 3; revisá --shared para estático):
+compile = '''
+_abuild_phase() {
+make cc="${CC:-gcc}" CFLAGS="$CFLAGS -DHAVE_STDINT_H=1" \
+ TZDIR="/usr/share/zoneinfo"
+
+ make -C "$builddir"/posixtz-$_ptzver posixtz
+}
+_abuild_phase
+'''
+# de package() de Alpine (traducido $pkgdir→/out):
+install = '''
+_abuild_phase() {
+./zic -b fat -y ./yearistype -d "/out"/usr/share/zoneinfo $_timezones
+ ./zic -b fat -y ./yearistype -d "/out"/usr/share/zoneinfo/right -L leapseconds $_timezones
+ #./zic -b fat -y ./yearistype -d "/out"/usr/share/zoneinfo/posix $_timezones
+
+ ./zic -b fat -y ./yearistype -d "/out"/usr/share/zoneinfo -p America/New_York
+ install -m444 -t "/out"/usr/share/zoneinfo iso3166.tab zone1970.tab zone.tab
+
+ install -Dm755 -t "/out"/usr/sbin zic zdump
+
+ install -Dm644 -t "/out"/usr/share/man/man8 zic.8 zdump.8
+
+ rm -f "/out"/usr/share/zoneinfo/localtime
+ install -Dm755 -t "/out"/usr/bin "$srcdir"/posixtz-$_ptzver/posixtz
+
+ install -Dm644 -t "/out"/usr/share/zoneinfo "$srcdir"/leap-seconds.list
+}
+_abuild_phase
+'''
diff --git a/recipes/incoming-clib/util-linux.toml b/recipes/incoming-clib/util-linux.toml
new file mode 100644
index 00000000..93a96b7a
--- /dev/null
+++ b/recipes/incoming-clib/util-linux.toml
@@ -0,0 +1,22 @@
+# Importada de nixpkgs por `hammer import-nix` (Etapa G). PUNTO DE PARTIDA, no final:
+# - el build usa el lab de hammer (zig-cc / musl estático), NO el stdenv de nix ⇒ revisá
+# compiler/link/phases y adaptá hasta que compile.
+# - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
+name = "util-linux"
+version = "2.42.2"
+
+[source]
+tarball = "https://www.kernel.org/pub/linux/utils/util-linux/v2.42/util-linux-2.42.2.tar.xz"
+sha256 = "03a05d3adf9602ef128f2da05b84b3205ce60c351e5737c0370f74000679ce8a"
+
+[build]
+compiler = "zig-cc"
+target = "x86_64-linux-musl"
+link = "static"
+flags = []
+
+[build.phases]
+configure = "./configure --prefix=/usr --localstatedir=/var --sysconfdir=/etc --disable-use-tty-group --enable-fs-paths-default=/run/wrappers/bin:/run/current-system/sw/bin:/sbin --disable-makeinstall-setuid --disable-makeinstall-chown --disable-su --enable-write --enable-nls --without-cryptsetup --with-ncursesw --with-systemd --with-systemdsystemunitdir=/04f3da1kmbr67m3gzxikmsl4vjz5zf777sv6m14ahv22r65aac9m/lib/systemd/system/ --with-tmpfilesdir=/1rz4g4znpzjwh1xymhjpm42vipw92pr73vdgl6xs1hycac8kf2n9/lib/tmpfiles.d --with-sysusersdir=/1rz4g4znpzjwh1xymhjpm42vipw92pr73vdgl6xs1hycac8kf2n9/lib/sysusers.d --enable-poman SYSCONFSTATICDIR=/0sra2y18lr3h6j58qjm0w46yv36h1wjmilb09n8aimdpivdymscx/lib"
+
+[deps]
+build = ["autoconf", "automake", "po4a", "zlib", "libxcrypt", "sqlite", "linux-pam", "libcap-ng", "ncurses", "systemd-minimal-libs"]
diff --git a/recipes/incoming-clib/vim.toml b/recipes/incoming-clib/vim.toml
new file mode 100644
index 00000000..8e571b81
--- /dev/null
+++ b/recipes/incoming-clib/vim.toml
@@ -0,0 +1,64 @@
+# Importada de Alpine aports por `hammer import-alpine` (Etapa G). PUNTO DE PARTIDA — pero
+# YA trae los parches de musl de Alpine (lo que un import de nix pierde). Pendiente: el
+# sha256 del tarball (el wrapper lo calcula), y adaptar build/install del shell de abuild.
+name = "vim"
+version = "9.2.0747"
+
+[source]
+tarball = "https://github.com/vim/vim/archive/refs/tags/v9.2.0747/vim-9.2.0747.tar.gz"
+# FIXME sha256: el wrapper lo calcula (Alpine publica sha512). sha512 de Alpine:
+# sha512 = "9dba40e94e09879eed41555be1275b993cac9b85b1105635f3c1dd2f5c3171f41db09c18b75313d1c6e4c2e5562b8542c4c8861929128a541c77f7e351eb425c"
+sha256 = "91535a380a445989b39dfd88c6afe8efa08668a17120ffbb33a237eab31952f3"
+
+[build]
+compiler = "zig-cc"
+target = "x86_64-linux-musl"
+link = "static"
+flags = []
+
+[build.phases]
+# de build() de Alpine (traducido; el lab provee $CBUILD/$CHOST — Etapa G Fase 3; revisá --shared para estático):
+compile = '''
+_abuild_phase() {
+vi_cv_version_plain_lua=$_luaver \
+ ./configure \
+ --build=$CBUILD \
+ --host=$CHOST \
+ --prefix=/usr \
+ --enable-luainterp=dynamic \
+ --enable-perlinterp=dynamic \
+ --enable-python3interp=dynamic \
+ --enable-rubyinterp=dynamic \
+ --enable-tclinterp=dynamic \
+ --disable-nls \
+ --enable-acl \
+ --enable-multibyte \
+ --with-lua-prefix=/usr/lua$_luaver \
+ --with-compiledby="Alpine Linux" \
+ "$@"
+ make
+}
+_abuild_phase
+'''
+# de package() de Alpine (traducido $pkgdir→/out):
+install = '''
+_abuild_phase() {
+depends="vim-common=9.2.0747-r$pkgrel xxd=9.2.0747-r$pkgrel"
+ provider_priority=10
+ replaces="gvim"
+
+ make -j1 DESTDIR="/out" install
+
+ install -Dm644 runtime/doc/uganda.txt \
+ "/out/usr/share/licenses/vim/LICENSE"
+ install -Dm644 "$srcdir"/vimrc "/out"/etc/vim/vimrc
+
+ # only relevant to gvim
+ rm -r "/out"/usr/share/icons/
+ rm -r "/out"/usr/share/applications/
+}
+_abuild_phase
+'''
+
+[deps]
+build = ["gtk+3.0", "libx11", "libxt"]
diff --git a/recipes/incoming-clib/zstd.toml b/recipes/incoming-clib/zstd.toml
deleted file mode 100644
index 75f29d3e..00000000
--- a/recipes/incoming-clib/zstd.toml
+++ /dev/null
@@ -1,13 +0,0 @@
-# zstd 1.5.7 — compresión. Makefile (lib static), ZSTD_NO_ASM=1 (zig no digiere huf_decompress_amd64.S).
-name = "zstd"
-version = "1.5.7"
-[source]
-tarball = "https://github.com/facebook/zstd/releases/download/v1.5.7/zstd-1.5.7.tar.gz"
-sha256 = "eb33e51f49a15e023950cd7825ca74a4a2b43db8354825ac24fc1b7ee09e6fa3"
-[build]
-compiler = "zig-cc"
-target = "x86_64-linux-musl"
-link = "static"
-[build.phases]
-compile = "make -C lib libzstd.a ZSTD_NO_ASM=1"
-install = "make -C lib install-static install-includes install-pc PREFIX=/usr DESTDIR=/out ZSTD_NO_ASM=1"
diff --git a/tandas/base-system-1.txt b/tandas/base-system-1.txt
new file mode 100644
index 00000000..0548ac1e
--- /dev/null
+++ b/tandas/base-system-1.txt
@@ -0,0 +1,37 @@
+# base-system-1 — tanda 2026-07-10: los HUECOS reales para una distro completa.
+# El sistema (bootstrap/self-host/kernel/init/EFI/paquetería) ya está; falta userland foundational.
+# C mayormente ⇒ PREFER=alpine (trae los parches musl). Cola aislada: recipes/incoming-clib.
+
+# --- VCS / sync (crítico: no hay git) ---
+git
+rsync
+
+# --- shell real (sólo tenemos busybox sh) ---
+bash
+
+# --- confianza TLS (curl/wget HTTPS no valida sin esto) ---
+ca-certificates
+
+# --- privilegios ---
+sudo
+doas
+
+# --- utilidades base de sistema (mount/lsblk/fdisk/blkid/lscpu…) ---
+util-linux
+sed
+tzdata
+
+# --- herramientas de disco / instalador ---
+e2fsprogs
+dosfstools
+parted
+
+# --- red (ip / ping / dhcp) ---
+iproute2
+iputils
+dhcpcd
+
+# --- editor + IPC de escritorio + terminal wayland (pareja del stack mesa/wayland) ---
+vim
+dbus
+foot