tawasuyu

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 109Markdown 993728 Sutichaykuna

⎇ a709d76c23a1c8b5a8689a07cc4a145f070d6787 recipes/yoga.toml TOML · 129 siq'ikuna · 8.1 KB Ñawpa willay ch'uya

recipes: yoga, el submódulo de fcitx5 que el tarball trae vacío b3bf05caa · Sergio ·

1# yoga — el motor de maquetación flexbox de Meta. Entra como DEP OBLIGATORIA de fcitx5 ≥5.1.20.
2#
3# ══ POR QUÉ ESTA RECETA EXISTE: ES UN SUBMÓDULO Y EL TARBALL VIENE VACÍO ═══════════════════════
4# `fcitx5` usa yoga para maquetar la ventana de candidatos de su UI clásica (`src/ui/classic`), y lo
5# trae como **submódulo git** (`third_party/yoga` → `https://github.com/facebook/yoga`). Un archive
6# de GitHub NO materializa submódulos: medido, `third_party/yoga` es el **único** directorio vacío
7# del tarball de fcitx5 5.1.21. Y su CMakeLists no tiene salida por red:
8#
9#     if (USE_SYSTEM_YOGA)  find_package(yoga REQUIRED); set(YOGA_TARGET yoga::yogacore)
10#     else()                add_subdirectory(third_party/yoga/yoga)   ← directorio VACÍO acá
11#
12# ⇒ `USE_SYSTEM_YOGA=On` + esta receta es el único camino. Es la misma figura que `sonic` con
13# espeak-ng, con una diferencia que importa: allá el fallback era un `git clone` en tiempo de build;
14# acá es un `add_subdirectory` de algo que no existe, así que falla al CONFIGURAR y no al enlazar.
15#
16# ══ EL COMMIT ES EL QUE FCITX5 PINEA ═══════════════════════════════════════════════════════════
17# `042f5013…` es exactamente el gitlink que `fcitx5` 5.1.21 declara para su submódulo (leído por la
18# API de GitHub, no adivinado). Se pinea ese y no el último tag de yoga porque es el emparejamiento
19# que upstream prueba — mismo criterio que `sonic`. Si fcitx5 mueve su submódulo, esta receta lo
20# sigue y el `git log` dirá por qué.
21#
22# La versión de upstream es literalmente `0.0.0` en su `package.json`: yoga no versiona el paquete
23# nativo, versiona los bindings. El sufijo del commit es lo único que identifica este artefacto.
24#
25# ══ ⚠ DOS PARCHES AL ÁRBOL, Y LOS DOS SON OBLIGATORIOS ═════════════════════════════════════════
26# 1. **`add_subdirectory(tests)` baja googletest POR RED.** El CMakeLists raíz lo añade **sin
27#    condición** (no hay perilla `BUILD_TESTING` que lo cubra), y `tests/CMakeLists.txt` hace
28#    `FetchContent_Declare(googletest URL https://github.com/google/googletest/…zip)`. El sandbox de
29#    takana no tiene red a propósito, así que eso mata el configure.
30#
31#    ⚠ Y NO se puede esquivar configurando `-S yoga` (el subdirectorio de la biblioteca): **las
32#    reglas de `install` y el `export` del paquete cmake viven en el CMakeLists RAÍZ**, no en
33#    `yoga/`. Construir sólo el subdirectorio daría la `.a` sin `yogaConfig.cmake`, y entonces el
34#    `find_package(yoga REQUIRED)` de fcitx5 no la encontraría: artefacto sellado, con contenido, y
35#    sin lo único que el consumidor busca. ⇒ se conserva la raíz y se le quita la línea.
36#
37# 2. **`-Werror` está en `cmake/project-defaults.cmake`** (con `-Wall`), y está calibrado contra los
38#    compiladores de Meta. El clang de zig es otra versión y avisa de otras cosas; un aviso nuevo
39#    cualquiera convertiría el build en un fallo que no dice nada de yoga. No vale pasar
40#    `-Wno-error` por `CMAKE_CXX_FLAGS`: esos van ANTES de los `add_compile_options`, y en clang
41#    gana el último. ⇒ se quita de la fuente, que es determinista y se ve en el diff.
42#
43# Los dos parches se comprueban: si el `sed` no cambia nada —porque upstream movió la línea— el
44# configure falla ruidosamente en vez de volver a bajar googletest por una red que no hay.
45#
46# ══ LO QUE NO HACE FALTA TOCAR ═════════════════════════════════════════════════════════════════
47# · `add_library(yogacore STATIC …)` está codificado, y `project-defaults.cmake` ya pone
48#   `CMAKE_POSITION_INDEPENDENT_CODE ON`. O sea que la `.a` es PIC y **puede entrar en un `.so`**,
49#   que es justo lo que hace falta: la UI clásica de fcitx5 es un addon que el daemon abre con
50#   `dlopen`. Sin ese PIC estaríamos en el muro del 19-oct otra vez.
51# · El `check_ipo_supported` de upstream escribe la propiedad con el nombre equivocado
52#   (`CMAKE_INTERPROCEDURAL_OPTIMIZATION` en vez de `INTERPROCEDURAL_OPTIMIZATION`), así que es un
53#   no-op y **no hay LTO**. Conviene que siga así: una `.a` con LTO entrando en un `.so` es un
54#   problema que no queremos buscar.
55# · fcitx5 incluye `<yoga/Yoga.h>` y el `install(DIRECTORY)` deja las cabeceras exactamente en
56#   `/usr/include/yoga/`, así que resuelve por la ruta de sistema.
57#
58# ⚠ `CMAKE_INSTALL_LIBDIR=lib` EXPLÍCITO: el CMakeLists raíz hace `include(GNUInstallDirs)`, que en
59# algunas distros de 64 bits elige `lib64`. Todo este corpus vive en `/usr/lib`, y un artefacto que
60# caiga en `/usr/lib64` se sella igual y no lo encuentra nadie.
61name    = "yoga"
62version = "0.0.0-042f501"
63license = "MIT"
64
65[source]
66tarball = "https://github.com/facebook/yoga/archive/042f5013152eb81c1552dec945b88f7b95ca350f/yoga.tar.gz"
67sha256  = "4742f41722a16f181e3da37abf943390db1e928f00f26402cb154662ae7f110f"
68
69[build]
70compiler = "zig-cc"
71target   = "x86_64-linux-musl"
72link     = "static"
73flags    = []
74
75[build.phases]
76configure = '''
77set -e
78ZW="$PWD/.zwrap"; mkdir -p "$ZW"
79printf '#!/bin/sh\nexec /opt/zig/zig cc -mcpu=baseline "$@"\n'  > "$ZW/cc"
80printf '#!/bin/sh\nexec /opt/zig/zig c++ -mcpu=baseline "$@"\n' > "$ZW/cxx"
81chmod +x "$ZW/cc" "$ZW/cxx"
82
83# Parche 1: fuera los tests, que bajan googletest por red. Se COMPRUEBA que la línea existía.
84grep -q '^add_subdirectory(tests)' CMakeLists.txt || {
85  echo "yoga: no encuentro 'add_subdirectory(tests)' en el CMakeLists raíz — upstream lo movió." >&2
86  echo "      Sin ese parche el configure intenta bajar googletest por red y muere sin decir por qué." >&2
87  exit 1
88}
89sed -i '/^add_subdirectory(tests)$/d' CMakeLists.txt
90
91# Parche 2: fuera el -Werror de upstream. También se comprueba.
92grep -q -- '-Werror' cmake/project-defaults.cmake || {
93  echo "yoga: no encuentro '-Werror' en cmake/project-defaults.cmake — upstream lo movió." >&2
94  exit 1
95}
96sed -i '/^\s*-Werror$/d' cmake/project-defaults.cmake
97
98rm -rf build
99cmake -B build -G Ninja -Wno-dev \
100  -DCMAKE_C_COMPILER="$ZW/cc" -DCMAKE_CXX_COMPILER="$ZW/cxx" \
101  -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr \
102  -DCMAKE_INSTALL_LIBDIR=lib \
103  -DBUILD_FUZZ_TESTS=OFF
104'''
105compile = "cmake --build build"
106# Guardián escrito contra las reglas de `install` del CMakeLists raíz, que es la fuente que decide
107# qué queda — y contra lo que el consumidor busca de verdad: `find_package(yoga REQUIRED)` más el
108# target `yoga::yogacore`. Las tres piezas cubren fallos distintos:
109#   · la `.a` sin el config  ⇒ find_package no la ve: sellaría un paquete invisible
110#   · el config sin targets  ⇒ find_package pasa y `yoga::yogacore` no existe, y el error sale
111#                              DENTRO de fcitx5, culpando a fcitx5 de algo que es de acá
112#   · sin cabeceras          ⇒ compila fcitx5 y no encuentra <yoga/Yoga.h>
113install = '''
114set -e
115DESTDIR=/out cmake --install build
116[ -f /out/usr/lib/libyogacore.a ] || { echo "yoga: no quedó /usr/lib/libyogacore.a — NO sello" >&2; find /out -name 'libyoga*' 2>/dev/null >&2; exit 1; }
117for f in yogaConfig.cmake yogaTargets.cmake; do
118  [ -f "/out/usr/lib/cmake/yoga/$f" ] || { echo "yoga: falta lib/cmake/yoga/$f — el find_package(yoga REQUIRED) de fcitx5 no encontraría nada" >&2; ls -R /out/usr/lib/cmake 2>/dev/null >&2; exit 1; }
119done
120# El namespace importa: fcitx5 enlaza contra `yoga::yogacore`, y ese nombre lo fija el
121# `NAMESPACE yoga::` del install(EXPORT). Si upstream lo cambiara, el config existiría y el target no.
122grep -q 'yoga::yogacore' /out/usr/lib/cmake/yoga/yogaTargets.cmake || { echo "yoga: yogaTargets.cmake no define el target yoga::yogacore — es el nombre exacto que fcitx5 enlaza" >&2; exit 1; }
123[ -f /out/usr/include/yoga/Yoga.h ] || { echo "yoga: falta include/yoga/Yoga.h — fcitx5 incluye <yoga/Yoga.h>" >&2; exit 1; }
124h=$(find /out/usr/include/yoga -name '*.h' | wc -l)
125echo "yoga: libyogacore.a + yogaConfig/yogaTargets + $h cabecera(s)"
126'''
127
128[deps]
129build = ["cmake", "samurai"]