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…
takana etapa 5a: los comentarios de las 741 recetas
1# Linux kernel UAPI headers 6.16.12 — tercera pieza del toolchain takana-from-source (SDD 11 §7.2b).
2#
3# Tras make (pieza 1) y busybox (pieza 2), reemplazamos los headers del kernel que hoy el builder
4# toma del paquete `linux-headers` de Alpine (`/toolchain/usr/include/{linux,asm,asm-generic,…}`).
5# musl y busybox los `#include` al compilar (syscalls, ioctls, structs UAPI), así que son parte real
6# del toolchain, no mero relleno.
7#
8# Versión clavada a la del toolchain Alpine actual: `usr/include/linux/version.h` declara 6.16.12
9# (LINUX_VERSION_CODE 397324). Construir la MISMA versión es lo que mantiene musl/busybox bit-a-bit:
10# un header distinto (un struct/constante que cambió entre versiones) cambiaría el binario resultante.
11#
12# A diferencia de make/busybox esto NO es un binario: `make headers_install` no compila nada del
13# kernel, sólo pasa los headers UAPI por `unifdef` (un toolito host que el propio target construye con
14# HOSTCC) y los copia saneados a INSTALL_HDR_PATH. El árbol resultante (`usr/include/*/`) se sella y
15# el swap-directorio del builder (variante b) lo monta sobre los de Alpine.
16#
17# Tarball .tar.gz (no .xz): `tar` lo autodetecta por cabecera y el busybox-tar de adentro descomprime
18# gzip nativo, sin depender de un `xz` en el rootfs del Stage 1. El sha256 clava el contenido (ADR 0006).
19
20name = "linux-headers"
21version = "6.16.12"
22license = "GPL-2.0-only WITH Linux-syscall-note"
23
24[source]
25tarball = "https://mirrors.edge.kernel.org/pub/linux/kernel/v6.x/linux-6.16.12.tar.gz"
26sha256 = "ffc6af80b014ddebd55e116aa29a9f7a5256c87a29a8a9dd97270b6d49625109"
27# Overlay de compatibilidad con el paquete linux-headers de Alpine (ADR 0006: contenido clavado en el
28# patch, hasheado al artefacto). El paquete de Alpine NO es el `make headers` crudo: trae 5 archivos
29# que difieren de la salida vainilla y que cualquier consumidor userspace (aquí, busybox) necesita
30# byte-a-byte para reproducir. El patch los CREA bajo `alpine-overlay/` (no toca el árbol del kernel);
31# el `install` los pisa sobre /out tras `make headers`. Por qué overlay y no patch-al-source: `make
32# headers` corre unifdef (renombra los guards `_UAPI…`, borra `__force`/`#ifndef __KERNEL__`), así que
33# parchear el source daría una salida distinta a la de Alpine; pisar la salida final garantiza igualdad.
34# • linux/kernel.h — Alpine envuelve `#include <linux/sysinfo.h>` en `#ifdef __GLIBC__` (musl ya
35# define `struct sysinfo`). Cosmético aquí (nadie del 4/4 lo incluye), pero lo
36# igualamos para que `diff -r` contra Alpine quede limpio.
37# • linux/if_tunnel.h — Alpine quita 3 `#include <linux/{if,ip,in6}.h>` (chocan con musl). Cosmético.
38# • scsi/{scsi,scsi_ioctl,sg}.h — REQUERIDOS: el applet `eject` de busybox hace `#include <scsi/sg.h>`
39# y `<scsi/scsi.h>`. NO son UAPI (no salen de `make headers`); los del kernel en
40# `include/scsi/` son `__KERNEL__`-only (no compilan en userspace). Alpine trae
41# versiones legacy userspace-limpias; sin ellas busybox no compila ⇒ divergiría.
42patches = ["linux-headers-alpine-compat.patch"]
43
44[build]
45compiler = "zig-cc"
46target = "x86_64-linux-musl"
47link = "static"
48
49[deps]
50build = ["make"]
51
52[build.phases]
53# El árbol del kernel detecta como BuildSys::Make ⇒ el default de compile sería `make -j$(nproc)`,
54# que construiría el kernel ENTERO. No queremos eso: los headers no necesitan compilarse ni config.
55# Override a no-op; todo el trabajo va en `install`.
56compile = "true"
57# El target `headers` (NO `headers_install`) construye `scripts/unifdef` con HOSTCC (zig cc) y satura
58# los headers UAPI por unifdef hacia `./usr/include` (las líneas `HDRINST …`). Evitamos
59# `headers_install` a propósito: su paso final hace un `rsync` de `usr/include` → INSTALL_HDR_PATH, y
60# rsync NO está en el toolchain hermético (ADR 0003) — `headers_install` aborta con "rsync: not found".
61# En su lugar copiamos el árbol ya saturado con `cp -a` (determinista: of_tree ignora timestamps y
62# write-bit, los headers son 0644 sin exec). ARCH=x86 produce los `asm/` de x86_64. Sella
63# `usr/include/{linux,asm,asm-generic,cxl,fwctl,misc,mtd,rdma,regulator,scsi,sound,video,xen}`,
64# exactamente los subdirs que el paquete linux-headers de Alpine posee.
65# 1) `make headers` satura los UAPI en ./usr/include. 2) copiamos a /out. 3) limpiamos lo que el
66# rsync de `headers_install` filtra y que `cp -a` arrastró: los `.*.cmd` de kbuild, el Makefile y
67# headers_check.pl del propio árbol, y drm/ (Alpine no lo empaqueta). 4) pisamos el overlay de Alpine
68# (los 5 archivos del patch) para casar byte-a-byte. Resultado: `diff -r` contra Alpine = vacío.
69install = '''
70make ARCH=x86 HOSTCC='zig cc -mcpu=baseline' headers && \
71mkdir -p /out/usr && cp -a usr/include /out/usr/ && \
72find /out/usr/include -name '.*.cmd' -delete && \
73rm -f /out/usr/include/Makefile /out/usr/include/headers_check.pl && \
74rm -rf /out/usr/include/drm && \
75cp -a alpine-overlay/. /out/usr/include/
76'''