gioser

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…

TOML 1572Shell 203Rust 110Markdown 993760 Definiciones

⎇ aeebb194dc1368739d35ebd08023b0df0ce12373 recipes/atuq.toml TOML · 89 líneas · 5.7 KB Historia crudo

atuq 0.1.0: la receta del envoltorio, derivada de firefox aeebb194d · Sergio ·

1# atuq 0.1.0 — el navegador de la distro, como ARTEFACTO DERIVADO de firefox.
2#
3# ══ POR QUÉ DERIVADO Y NO UN FORK DE FUENTE ════════════════════════════════════════════════════
4# Zen —el fork de Firefox al que esto reemplaza en nuestro catálogo— parchea el árbol de Gecko y
5# recompila. Nosotros no distribuimos un binario: sellamos artefactos. Entonces atuq puede DEPENDER
6# de `firefox` y poner su capa encima, y eso cambia el precio de todo:
7#   · una iteración de chrome cuesta SEGUNDOS, no las cuatro horas de un build de Gecko;
8#   · no mueve el `ArtifactHash` de `firefox` ⇒ el corpus no se invalida;
9#   · las CVE se heredan gratis: cuando sube `firefox`, atuq se reconstruye solo.
10# El razonamiento completo, con lo que se promete y lo que NO (spoiler: no habrá «modo Tor»), está
11# en `docs/26-atuq-envoltorio-gecko.md`.
12#
13# ══ SU FUENTE ES ESTE REPO ═════════════════════════════════════════════════════════════════════
14# `source.dir` es el modo de fuente que se agregó para esto (hammer-core/src/recipe.rs): el árbol
15# vive en `recipes/atuq/` y se hashea por CONTENIDO con `ArtifactHash::of_tree`, igual que ya se
16# hacía con los `patches`. No hay commit que pinear y no hay fetch: editar un CSS mueve el hash.
17#
18# ══ LO QUE ESTA v0.1 NO HACE, A PROPÓSITO ══════════════════════════════════════════════════════
19# No renombra el binario ni toca `application.ini`. El branding necesita mirar la forma real del
20# árbol que sella `firefox` —qué es `firefox-bin`, cómo se resuelve el appdir— y adivinarlo desde
21# acá produciría un artefacto que arranca en la máquina de quien lo escribió y en ninguna otra.
22# Tampoco re-empaqueta `omni.ja`, que es donde vive el chrome de verdad; eso es la v0.2 y trae dos
23# condiciones ya sabidas (re-empacar determinista y preservar el orden del `jarlog` del PGO).
24name    = "atuq"
25version = "0.1.0"
26# El artefacto CONTIENE Firefox, así que hereda su licencia. El overlay de `recipes/atuq/` es
27# nuestro, pero eso no cambia lo que se distribuye.
28license = "MPL-2.0"
29
30[source]
31dir = "atuq"
32
33[build]
34# No se compila nada: esta receta copia y edita ficheros. `compiler` y `link` entran igual en el
35# hash, así que se dejan en el default del corpus para no inventar una identidad que no significa
36# nada.
37target = "x86_64-linux-musl"
38
39[build.phases]
40configure = "echo 'atuq: nada que configurar — es un artefacto derivado'"
41compile   = "echo 'atuq: nada que compilar — el motor lo pone la dep firefox'"
42install = '''
43set -e
44SRC=/usr/lib/firefox
45DST=/out/usr/lib/atuq
46
47# ── LAS ASERCIONES VAN PRIMERO, Y FALLAN RUIDOSAS ─────────────────────────────────────────────
48# Un derivado que no encuentra su base no debe producir un artefacto flaco: produciría un
49# directorio con cuatro ficheros de configuración, `Store::has` lo daría por presente y el fallo
50# aparecería el día que alguien intente abrir el navegador. Un ausente falla fuerte; un vacío llega
51# hasta el final diciendo que todo fue bien (regla 3 del CLAUDE.md).
52[ -d "$SRC" ] || { echo "atuq: no está el árbol de firefox en $SRC — ¿la dep se materializó?" >&2; exit 1; }
53[ -x "$SRC/firefox" ] || { echo "atuq: $SRC/firefox no existe o no es ejecutable" >&2; exit 1; }
54[ -d "$SRC/browser" ] || { echo "atuq: falta $SRC/browser — el árbol no tiene la forma esperada" >&2; exit 1; }
55
56mkdir -p "$DST"
57cp -a "$SRC"/. "$DST"/
58
59# ── LA CAPA DE atuq ───────────────────────────────────────────────────────────────────────────
60# `defaults/pref/` es el único sitio desde el que se puede pedir el autoconfig ANTES de que exista
61# un perfil; el resto cuelga de ahí.
62mkdir -p "$DST/defaults/pref" "$DST/chrome" "$DST/distribution"
63cp /src/prefs/autoconfig.js       "$DST/defaults/pref/autoconfig.js"
64cp /src/atuq.cfg                  "$DST/atuq.cfg"
65cp /src/chrome/atuq.css           "$DST/chrome/atuq.css"
66cp /src/distribution/policies.json "$DST/distribution/policies.json"
67
68# El comando que teclea la gente. Apunta al binario SIN renombrar (ver la nota de la cabecera):
69# renombrarlo es branding y branding es la v0.2.
70mkdir -p /out/usr/bin
71ln -sf ../lib/atuq/firefox /out/usr/bin/atuq
72
73# ── INVENTARIO: LO QUE SE MIRA CUANDO «ATUQ SE VE COMO FIREFOX» ───────────────────────────────
74# Los cuatro ficheros de la capa son el 100% de lo que distingue este artefacto de su base, y son
75# los que un `cp` silencioso podría no haber puesto. Se listan para que el log del build responda
76# solo la primera pregunta del diagnóstico.
77echo "atuq: capa aplicada —"
78for f in defaults/pref/autoconfig.js atuq.cfg chrome/atuq.css distribution/policies.json; do
79  [ -s "$DST/$f" ] || { echo "atuq: $f quedó VACÍO o ausente" >&2; exit 1; }
80  echo "  $f ($(wc -c < "$DST/$f") bytes)"
81done
82'''
83
84[deps]
85# `firefox` como dep de BUILD y no de runtime: su árbol se materializa en el sandbox, se copia
86# dentro del artefacto de atuq y a partir de ahí atuq no lo necesita más. El precio es que el
87# artefacto pesa lo que pesa Firefox otra vez; la salida barata (una granja de symlinks) rompe la
88# resolución del appdir por /proc/self/exe, así que la v0.1 paga el disco y lo dice.
89build = ["firefox"]