sergio/takana
> Una distribución Linux construida con un laboratorio funcional y hermético en el > sótano, y una terminal mutable, clásica y anárquica en el piso de arriba — diseñada > desde el suelo para que una IA programadora entienda, modifique y co…
corpus: la cadena nftables (libmnl + libnftnl + nft 1.1.6), que el grafo pedía y nadie había puesto
1# nftables 1.1.6 — el `nft` con el que se aplica el reglaset del cortafuegos. Es la pieza que el
2# grafo pedía como `wanted` desde antes de este frente, y la que destraba el §6.5 del SDD 26: el
3# «modo foco» de `atuq` lo sostiene el sistema (una regla de egress por cgroup) y no una extensión
4# que el propio navegador puede apagar.
5#
6# ⚠ LA VERSIÓN ES UNA DECISIÓN, NO UN DEFAULT. 1.1.7 ya está publicada (2026-09-01), pero el SDD del
7# cortafuegos de tawasuyu dice que sus expresiones —en particular `socket cgroupv2 level N`— están
8# «verificadas en metal contra nftables 1.1.6». Cambiar de versión cambia qué acepta `nft -c`, así
9# que se pinea la que la otra mitad ya midió; subirla es su propia unidad de trabajo, con la
10# revalidación incluida.
11#
12# `--without-cli`: el modo interactivo pide readline o editline, y acá nadie escribe reglas a mano
13# — las genera `cortafuegos-core` y se aplican con `nft -f`. `--disable-man-doc` porque el manual
14# sale de asciidoc/docbook, que no están en el corpus.
15#
16# Sin bison ni flex en `[deps]`: el tarball de release YA trae `src/parser_bison.c` y `src/scanner.c`
17# generados (comprobado en el tarball pineado). El árbol de git no, y ésa es otra de las razones por
18# las que esto entra por tarball.
19#
20# EL PARCHE ARREGLA DOS COSAS QUE VIENEN DE FÁBRICA, y las dos se midieron acá:
21#
22# 1. **un bashismo en `config.status`** — `configure.ac` emite `for ((i = 56; i >= 0; i-= 8))` para
23# escribir `nftversion.h`, y el `/bin/sh` del lab es busybox: el build murió con
24# `config.status: line 2041: syntax error: bad for loop variable`. Se reemplaza por un `for i in
25# 56 48 ... 0` POSIX, que produce la MISMA secuencia. Se podría haber pasado `CONFIG_SHELL=bash`
26# —el lab trae bash— pero eso mete una dependencia INVISIBLE: el lab no entra en `hash_inputs`
27# (ADR pendiente), así que el día que un lab sin bash construya esta receta, el fallo vuelve sin
28# que nada haya cambiado en el corpus. El parche sí entra en el hash.
29#
30# 2. **un sello de tiempo dentro del binario** — `MAKE_STAMP` es literalmente
31# `$(shell date +%s)`, y `nftversion.h` lo mete byte a byte en el ejecutable. Eso es la familia
32# exacta del `BuildID` de waterfox: dos builds de la misma fuente NO reproducen. nftables no mira
33# `SOURCE_DATE_EPOCH`. Se fija en `0`, que además es lo correcto acá: el sello sólo se usa
34# (`src/netlink.c:version_cmp`) para comparar qué `nft` creó una tabla, y en una distro
35# reproducible dos builds de la MISMA versión son el mismo `nft`.
36#
37# `link = "dynamic"` porque no hay alternativa honesta: nft necesita libgmp y `recipes/gmp.toml`
38# publica sólo `.so` (`--disable-static`). Un `link = "static"` acá sellaría un binario dinámico y
39# la receta estaría mintiendo — la familia de fallos del `link=static` por libtool.
40name = "nftables"
41version = "1.1.6"
42license = "GPL-2.0-only"
43
44[source]
45tarball = "https://www.netfilter.org/pub/nftables/nftables-1.1.6.tar.xz"
46sha256 = "372931bda8556b310636a2f9020adc710f9bab66f47efe0ce90bff800ac2530c"
47patches = ["nftables-sin-bashismo-ni-sello.patch"]
48
49[build]
50compiler = "zig-cc"
51target = "x86_64-linux-musl"
52link = "dynamic"
53flags = []
54
55[build.phases]
56configure = './configure --build=$CBUILD --host=$CHOST --prefix=/usr --sbindir=/usr/sbin --disable-static --enable-shared --without-cli --disable-man-doc'
57compile = 'make -j"$(nproc)"'
58install = "make install DESTDIR=/out && find /out -name '*.la' -delete"
59
60[deps]
61build = ["binutils", "busybox", "make", "pkgconf", "libmnl", "libnftnl", "gmp"]