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 1184Shell 71Rust 62Markdown 501503 Definitions

⎇ 90364fabbf6d3fa2a3129e81b0c029ec2719c3c2 recipes/firefox.toml TOML · 164 lines · 9.5 KB History raw

nodejs y firefox: strip_debug — medido, no supuesto 90364fabb · Sergio ·

1# Firefox 154.0 — el navegador. Tercera app de usuario final, y **la cabeza de la familia Gecko**:
2# Waterfox y Zen son forks suyos y reutilizan todo lo de abajo.
3#
4# ══ POR QUÉ 154 Y NO 155, QUE ES LA QUE SIGUE ZEN ══════════════════════════════════════════════
5# Zen declara `"version": "155.0.1"` en su `surfer.json` y Waterfox 6.7 también va por el canal
6# release, así que 155 parecía la base obvia. Se eligió **154** por una razón concreta: **los parches
7# de musl de Alpine son para 154.0**, y son once. Ese es el trabajo de portabilidad que un import de
8# nix pierde y que no conviene rehacer a mano — sin ellos Firefox no compila contra musl.
9#
10# Un Firefox que compila con el set probado vale más que uno con el número correcto que no compila.
11# Y como Firefox se mueve cada cuatro semanas, la paridad exacta con Zen es una cinta de correr: lo
12# que de verdad se reutiliza entre los tres es LA PLATAFORMA (gtk3/nodejs/clang/cbindgen, todo ya en
13# el corpus) y ESTE SET DE PARCHES. Subir a 155 después es un rebase, no un port.
14#
15# ══ TODO BUNDLEADO SALVO GTK3 ══════════════════════════════════════════════════════════════════
16# Alpine usa `--with-system-{icu,nspr,nss,av1,libvpx,webp,libevent,...}`; de ésas el corpus tiene
17# CERO. Firefox trae todas en el árbol, así que se dejan bundleadas: son menos piezas móviles para el
18# primer build, que es exactamente cuando conviene minimizar variables. Cuando alguna de esas
19# librerías tenga receta propia y valga compartirla, el flag se enciende y se re-mide.
20#
21# ══ SIN BRANDING OFICIAL, Y NO ES UN DESCUIDO ══════════════════════════════════════════════════
22# Alpine pone `--enable-official-branding`. Acá NO: el binario lleva once parches, y usar el nombre y
23# el logo de Firefox sobre un build modificado entra en la política de marcas de Mozilla — es
24# literalmente la historia de Iceweasel en Debian. Con el branding `unofficial` el navegador es el
25# mismo software y nadie tiene que pedir permiso a nadie. Es la misma cautela que la receta de
26# `dejavu-fonts-nerd` ya aplicó con la licencia de Bitstream Vera: **una fuente modificada no puede
27# llamarse como la original, y un navegador parcheado tampoco.**
28#
29# ══ WAYLAND-ONLY, HEREDADO DE GTK3 ═════════════════════════════════════════════════════════════
30# `--enable-default-toolkit=cairo-gtk3-wayland`. Nuestro GTK3 se construyó con `-Dx11_backend=false`
31# ⇒ este Firefox **no puede correr como cliente X11 ni bajo Xwayland**. Bajo Wayland nativo sí. Está
32# escrito en `recipes/gtk3.toml` y se repite acá porque es lo primero que alguien va a preguntar.
33#
34# ══ HERMÉTICO: NADA DE RED DURANTE EL BUILD ════════════════════════════════════════════════════
35#   --disable-bootstrap                      su trabajo ES descargar toolchains. Prohibido.
36#   MACH_BUILD_PYTHON_NATIVE_PACKAGE_SOURCE  sin esto `mach` arma un virtualenv con `pip` y sale a
37#     =system                                la red. Con `system` usa lo que ya está.
38#   MOZBUILD_STATE_PATH                      por defecto escribe en `$HOME`, que en el sandbox no es
39#                                            suyo; se apunta al árbol de build.
40#   Los crates de Rust vienen VENDORIZADOS en el tarball (`third_party/rust`) ⇒ cargo no baja nada.
41#
42# ══ LO DEMÁS QUE SE APAGA ══════════════════════════════════════════════════════════════════════
43#   --disable-jemalloc            musl trae su propio allocator; jemalloc encima es la receta del
44#                                 cuelgue clásico de Firefox en Alpine.
45#   --without-wasm-sandboxed-      exige el SDK de WASI, que no está en ninguna cola. Apaga el
46#     libraries                    sandbox wasm de algunas librerías de medios, no el sandbox del
47#                                 proceso de contenido.
48#   --disable-crashreporter       manda telemetría a Mozilla; además pide breakpad.
49#   --disable-updater             la distro actualiza por hammer, no por un updater propio.
50#   --disable-tests               no entran al artefacto.
51#   --enable-linker=lld           zig ES lld; pedir bfd/gold sería pedir algo que no hay.
52name    = "firefox"
53version = "154.0"
54license = "MPL-2.0"
55
56[source]
57# Tarball de RELEASE de Mozilla: fichero SUBIDO por upstream, sha256 estable y publicado en su
58# SHA256SUMS. No es un `/archive/<tag>` de forja, que se genera al vuelo (ver `recipes/mbedtls.toml`).
59tarball = "https://ftp.mozilla.org/pub/firefox/releases/154.0/source/firefox-154.0.source.tar.xz"
60sha256  = "36cec5b3688a60f78a6d20dcaee15b598f84e03c66f6587056aead6cb498b99a"
61# Los once de musl del APKBUILD de Alpine (community/firefox). NO se traen los suyos de ppc64le,
62# loongarch ni Android: no aplican a x86_64 y cada parche que no hace falta es una forma más de que
63# un rebase falle sin motivo.
64patches = [
65  "firefox-patches/lfs64.patch",
66  "firefox-patches/time64.patch",
67  "firefox-patches/musl-no-linux-prctl.patch",
68  "firefox-patches/fix-fortify-system-wrappers.patch",
69  "firefox-patches/fix-rust-target.patch",
70  "firefox-patches/sandbox-sched_setscheduler.patch",
71  "firefox-patches/abseil-cpp.patch",
72  "firefox-patches/glean-stub.patch",
73  "firefox-patches/rust-lto-thin.patch",
74  "firefox-patches/wasip1.patch",
75  "firefox-patches/widevine.patch",
76]
77
78[build]
79compiler = "zig-cc"
80target   = "x86_64-linux-musl"
81link     = "dynamic"
82flags    = []
83# ══ `strip_debug`: SIN ESTO EL ARTEFACTO SERÍA INMANEJABLE ═════════════════════════════════════
84# Medido en el `nodejs` que acaba de sellar sin strip: su binario pesa **984 MB, de los cuales
85# `.debug_info` son 497 MB y `.debug_line` otros 43** — más de la mitad del artefacto es información
86# de depuración. Firefox es varias veces V8, así que sin strip su artefacto entraría en varios GB, y
87# el store no es sólo disco: se sincroniza hub↔worker y se respalda.
88#
89# Es además el hallazgo del SDD 23: el 79% del contenido binario del store era `.debug_*`, y quitarlo
90# hace que artefactos que no reproducían PASEN a reproducir, porque lo que difería eran las rutas del
91# árbol de build embebidas en esas secciones.
92#
93# Entra en `hash_inputs` A PROPÓSITO (cambia el contenido del artefacto), y usa `zig objcopy`, que
94# siempre está en el sandbox ⇒ no agrega una dep de build.
95strip_debug = true
96
97[build.phases]
98configure = '''
99export MOZBUILD_STATE_PATH="$PWD/.mozbuild"
100export MACH_BUILD_PYTHON_NATIVE_PACKAGE_SOURCE=system
101export MOZ_NOSPAM=1
102cat > .mozconfig <<'MOZ'
103ac_add_options --prefix=/usr
104ac_add_options --enable-application=browser
105ac_add_options --enable-default-toolkit=cairo-gtk3-wayland
106ac_add_options --enable-release
107ac_add_options --enable-optimize
108ac_add_options --enable-linker=lld
109ac_add_options --enable-hardening
110ac_add_options --with-branding=browser/branding/unofficial
111ac_add_options --with-libclang-path=/usr/lib
112ac_add_options --disable-bootstrap
113ac_add_options --disable-jemalloc
114ac_add_options --disable-crashreporter
115ac_add_options --disable-updater
116ac_add_options --disable-tests
117ac_add_options --disable-debug
118ac_add_options --disable-debug-symbols
119ac_add_options --disable-strip
120ac_add_options --disable-install-strip
121ac_add_options --disable-cargo-incremental
122ac_add_options --without-wasm-sandboxed-libraries
123ac_add_options --enable-alsa
124ac_add_options --enable-pulseaudio
125ac_add_options --enable-dbus
126ac_add_options --enable-ffmpeg
127mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/objdir
128MOZ
129./mach configure
130'''
131# `mach build` respeta -jN; la cuenta es la misma que en nodejs.toml y por el mismo motivo: un número
132# fijo ataría el ArtifactHash a la RAM de quien escribió la receta.
133# ⚠ OJO con el techo: dentro del sandbox `/proc/meminfo` NO muestra la memoria del contenedor sino la
134# del host (medido en el LXC: 186 GiB en vez de 16), así que en un contenedor esta cuenta se degrada
135# a `nproc`. Es un tope, no una garantía.
136compile = '''
137export MOZBUILD_STATE_PATH="$PWD/.mozbuild"
138export MACH_BUILD_PYTHON_NATIVE_PACKAGE_SOURCE=system
139export MOZ_NOSPAM=1
140gib=$(awk "/MemTotal/{printf \"%d\", \$2/1024/1024}" /proc/meminfo)
141j=$(( gib / 3 )); [ "$j" -lt 1 ] && j=1
142n=$(nproc); [ "$j" -gt "$n" ] && j=$n
143echo "mach build -j$j (MemTotal ${gib} GiB, nproc $n)"
144./mach build -j"$j"
145'''
146install = '''
147export MOZBUILD_STATE_PATH="$PWD/.mozbuild"
148export MACH_BUILD_PYTHON_NATIVE_PACKAGE_SOURCE=system
149DESTDIR=/out ./mach install
150'''
151
152[deps]
153build = [
154  "python3", "pkgconf", "nasm", "make", "cmake",
155  # la plataforma Gecko, compartida con Waterfox y Zen
156  "nodejs", "cbindgen", "clang18", "llvm18",
157  "gtk3", "atk", "gdk-pixbuf", "pango", "cairo", "libepoxy",
158  "glib-shared", "pcre2-shared", "libffi-shared", "zlib-shared",
159  "harfbuzz", "fribidi", "freetype-shared", "fontconfig-shared", "pixman",
160  "libpng-shared", "libjpeg-turbo-shared",
161  "wayland", "wayland-protocols", "libxkbcommon", "mesa", "libdrm",
162  "dbus", "pipewire", "pulseaudio", "alsa-lib",
163  "libxml2-shared", "linux-headers",
164]