diff --git a/recipes/atuq.toml b/recipes/atuq.toml index 6d190e49..fb615319 100644 --- a/recipes/atuq.toml +++ b/recipes/atuq.toml @@ -65,6 +65,14 @@ DST=/out/usr/lib/atuq mkdir -p "$DST" cp -a "$SRC"/. "$DST"/ +# ── EL ÁRBOL COPIADO LLEGA DE SÓLO LECTURA ──────────────────────────────────────────────────── +# `cp -a` preserva los modos, y los ficheros del store están sellados sin permiso de escritura. Todo +# lo que viene después —el `.ini`, el `omni.ja`, los iconos, el parche del app_id— los MODIFICA. +# En el worker esto pasaba inadvertido porque corre como root, que ignora los bits de permiso; el +# primer build fuera de root murió con `PermissionError: /out/usr/lib/atuq/application.ini`. +# Es la clase de bug que sólo aparece en la máquina de otro, así que se arregla acá y no en el +# entorno: un artefacto no debe depender de con qué uid lo construiste. +chmod -R u+w "$DST" # ── LA CAPA DE CONFIGURACIÓN ────────────────────────────────────────────────────────────────── # `defaults/pref/` es el único sitio desde el que se puede pedir el autoconfig ANTES de que exista diff --git a/recipes/atuq/tools/rebrand.py b/recipes/atuq/tools/rebrand.py index 04c21348..5540fa58 100644 --- a/recipes/atuq/tools/rebrand.py +++ b/recipes/atuq/tools/rebrand.py @@ -249,6 +249,42 @@ def renombrar_binarios(): return hechos +# ── 6. La marca COMPILADA dentro del binario ─────────────────────────────────────────────────── +# `application.ini` dice `RemotingName=atuq` y aun así el proceso se anunciaba como +# `firefox-default`: esa cadena es un `MOZ_APP_REMOTINGNAME` horneado en el ELF en tiempo de +# compilación, y es la que Gecko pasa a `g_set_prgname()` ⇒ es el **app_id de Wayland**. O sea que +# el escritorio no casaba la ventana con nuestro `.desktop` (`StartupWMClass=atuq`): icono genérico +# y sin agrupar con el lanzador. Se ve en el log de cualquier arranque: `(firefox-default:7048)`. +# +# Se parchea EN SITIO y no se recompila: cambiarlo en `recipes/firefox.toml` brandearía la BASE de +# atuq como atuq, que es justo lo que un derivado no debe hacer —firefox tiene que seguir siendo +# firefox para los otros forks—. +# +# Es seguro porque es una cadena C terminada en NUL dentro del pool de `.rodata`: acortarla deja +# NULs muertos detrás y la siguiente cadena empieza donde empezaba. `firefox-default\0` son 16 +# bytes exactos y se escriben 16. Y se EXIGE una única ocurrencia: si upstream la duplica o la +# renombra, esto falla en vez de parchear el sitio equivocado. +VIEJA = b"firefox-default\0" +NUEVA = MARCA.encode() + b"\0" * (len(VIEJA) - len(MARCA)) + + +def rebrandear_binario(rel): + ruta = os.path.join(APPDIR, rel) + with open(ruta, "rb") as fh: + datos = fh.read() + n = datos.count(VIEJA) + if n != 1: + fatal(f"{rel}: esperaba 1 ocurrencia de {VIEJA!r} y hay {n} — ¿cambió upstream?") + modo = os.stat(ruta).st_mode + with open(ruta, "wb") as fh: + fh.write(datos.replace(VIEJA, NUEVA)) + os.chmod(ruta, modo) + with open(ruta, "rb") as fh: + if fh.read().count(VIEJA) != 0: + fatal(f"{rel}: el parche no agarró") + return f"{rel}: app_id firefox-default → {MARCA}" + + def main(): huella = huella_overlay() bid = build_id(huella) @@ -261,12 +297,16 @@ def main(): ) iconos = escribir_iconos() binarios = renombrar_binarios() + # Después del renombrado: los ficheros ya se llaman atuq/atuq-bin. + parches = [rebrandear_binario(MARCA), rebrandear_binario(f"{MARCA}-bin")] print(f"rebrand: overlay {huella[:16]}… ⇒ BuildID {bid}") print(f"rebrand: application.ini {sorted(claves)}") print(f"rebrand: browser/omni.ja re-empacado, {n} entradas, orden y STORED preservados") print(f"rebrand: {len(iconos)} iconos escritos ({', '.join(str(s) for s in TAMANOS)} px)") print(f"rebrand: binarios {', '.join(binarios)} (+ symlink firefox → {MARCA})") + for l in parches: + print(f"rebrand: {l}") main() diff --git a/scripts/atuq-nested.sh b/scripts/atuq-nested.sh index 93fb2075..364fb0ea 100755 --- a/scripts/atuq-nested.sh +++ b/scripts/atuq-nested.sh @@ -33,8 +33,10 @@ URL="${URL:-about:support}" # Las raíces: atuq y lo que su motor abre en RUNTIME. `wayland-protocols` y compañía no están —son # de build— y meterlas engordaría el rootfs sin cambiar nada de lo que se ve. -RAICES="atuq gtk3 atk gdk-pixbuf pango cairo libepoxy glib-shared pcre2-shared libffi-shared - zlib-shared harfbuzz fribidi freetype-shared fontconfig-shared pixman libpng-shared +# Las variantes `-shared` y NO las estáticas: en runtime una `.a` no sirve para nada, y son las que +# gtk3 declara NEEDED desde que se arregló el cuadro de las dos Pango. +RAICES="atuq gtk3 atk gdk-pixbuf-shared pango-shared cairo-shared libepoxy glib-shared pcre2-shared + libffi-shared zlib-shared harfbuzz-shared fribidi freetype-shared fontconfig-shared pixman libpng-shared libjpeg-turbo-shared wayland libxkbcommon mesa libdrm dbus pipewire pulseaudio alsa-lib libxml2-shared dejavu-fonts xkeyboard-config"