`recipes/protoc-gen-go.toml` estaba SELLADO y era INERTE: un plugin de protoc no hace nada sin `protoc`, y `protoc` no estaba en el catálogo. Cualquier servicio gRPC lo necesita en tiempo de build — empezando por `qdrant`, que el censo del servidor de origen encontró corriendo como binario suelto, de los que se pierden al apagar la máquina vieja. Entran dos recetas: `abseil-cpp` (que protobuf exige) y `protobuf`. Verificado corriéndolo, no por el código de salida: `protoc --version` contesta `libprotoc 36.1`, y un `.proto` de prueba se compila a `.pb.h`/`.pb.cc` reales. Único NEEDED `libc.so`, que provee `musl-shared`. Las dos REPRODUCEN bit a bit. **Dos muros, y el segundo escondía al primero.** 1. **`zig c++` se cae al enlazar los tres plugins `protoc-gen-upb*`**: `Error running link command: Segmentation fault` — un crash del linker, no un error de símbolos. Se aisló FUERA de takana y fuera del sandbox, rehaciendo el link a mano sobre los mismos `.o` y las mismas `.a`: `zig c++` vuelve a segfaultear. No es presión de memoria (corrió solo) y no es el `-Wl,-rpath,::::::::::::::` que CMake emite — se probó sin él y cae igual. `protobuf_BUILD_LIBUPB=OFF` tampoco es escapatoria: queda `OFF` en el `CMakeCache` y los plugins se construyen igual. Con `g++` y el `ld` de GNU los cuatro binarios enlazan. 2. Al pasar **sólo** protobuf a `gcc`, con abseil todavía construida por `zig-cc`, el link murió con `undefined reference to std::__1::basic_string<…>::assign(char const*, unsigned long)`. **El `__1` es el namespace inline de libc++** —la libstdc++ que trae zig— y g++ usa la de GNU, con otro mangling para los mismos tipos. O sea: **abseil y protobuf tienen que compartir runtime de C++ o no enlazan**, y el error habla de `std::string` sin nombrar a abseil ni una vez. Es la familia de las dos glib estáticas en un proceso, pero en C++ y en tiempo de link. ⇒ Las dos recetas llevan `compiler = "gcc"` y está escrito en ambas que cambiar una sin la otra vuelve a romper. `-static-libstdc++ -static-libgcc` para que `protoc` no salga pidiendo una soname que sólo vive en el lab. Y una decisión que NO es «la última versión»: abseil va pineada a `20250512.1` porque es exactamente la que protobuf 36.1 declara en `cmake/dependencies.cmake`. Abseil no promete ABI estable entre releases; el disparador para subirla es que protobuf suba la suya, no que abseil publique.
65 lines
3.8 KiB
TOML
65 lines
3.8 KiB
TOML
# abseil-cpp 20250512.1 — la base de C++ de Google. No entra por sí misma: entra porque **protobuf la
|
|
# exige**, y protobuf faltaba. El agujero se ve solo en el catálogo: `protoc-gen-go` está SELLADO y es
|
|
# INERTE, porque un plugin de protoc no sirve sin `protoc`; y cualquier servicio gRPC —`qdrant`, el
|
|
# que corre hoy en el servidor de origen como binario suelto— necesita `protoc` en tiempo de build.
|
|
#
|
|
# ⚠ **LA VERSIÓN NO ES «LA ÚLTIMA», Y ESO ES LA DECISIÓN.** La última publicada es `20260817.0`; acá
|
|
# va `20250512.1` porque es **exactamente la que protobuf 36.1 declara** en
|
|
# `cmake/dependencies.cmake` (`set(abseil-cpp-version "20250512.1")`). Abseil no promete ABI estable
|
|
# entre releases —lo dice su propio README— y protobuf enlaza contra sus símbolos internos: emparejar
|
|
# la versión con la que upstream probó es la diferencia entre un build y una tarde de errores de
|
|
# plantillas. Subirla es su propia unidad de trabajo, y el disparador correcto es que protobuf suba
|
|
# la suya, no que abseil publique.
|
|
#
|
|
# `-DBUILD_SHARED_LIBS=OFF` + `-DCMAKE_POSITION_INDEPENDENT_CODE=ON`: estático, pero compilado con
|
|
# `-fPIC`. Las dos cosas a la vez no es contradicción — es lo que hace falta para que protobuf pueda
|
|
# enlazar estas `.a` dentro de un `libprotobuf` que sí puede terminar siendo compartido. Sin el PIC,
|
|
# el link del consumidor muere con «relocation R_X86_64_32 against … can not be used when making a
|
|
# shared object», que es un error que no nombra a abseil por ningún lado.
|
|
#
|
|
# `-DABSL_PROPAGATE_CXX_STD=ON` es la palanca que abseil pide a gritos (avisa por consola si falta):
|
|
# sin ella el estándar de C++ con el que se compiló abseil NO viaja a los consumidores por los
|
|
# targets de CMake, y protobuf puede compilarse con otro ⇒ dos mitades del mismo binario con
|
|
# `std::string_view` distinto. Es la familia de las dos glib estáticas en un proceso, en C++.
|
|
#
|
|
# ⚠ **`compiler = "gcc"` NO ES UNA PREFERENCIA: ES EL CONTRATO CON PROTOBUF, Y SE DESCUBRIÓ
|
|
# ROMPIÉNDOLO.** Con `zig-cc` esta receta sella perfecto —669 ficheros, 88 `.a`— y después protobuf
|
|
# muere al enlazar con:
|
|
#
|
|
# undefined reference to `std::__1::basic_string<…>::assign(char const*, unsigned long)'
|
|
#
|
|
# El `__1` de ese símbolo es el namespace inline de **libc++**, que es la libstdc++ que trae zig.
|
|
# g++ usa **libstdc++ de GNU**, con otro mangling para los mismos tipos. O sea: abseil y protobuf
|
|
# tienen que compartir runtime de C++ o no enlazan, y el error no nombra a abseil por ningún lado —
|
|
# habla de `std::string`. Es la familia de [[dos-glib-estaticas-en-un-proceso]], en C++ y en tiempo
|
|
# de link en vez de runtime.
|
|
#
|
|
# `-DABSL_PROPAGATE_CXX_STD=ON` cubre el OTRO eje del mismo problema —que el *estándar* (C++17) viaje
|
|
# a los consumidores por los targets de CMake— pero no cubre éste: la *librería* no la propaga CMake,
|
|
# la elige el compilador. Por eso la decisión vive en el campo `compiler` de las dos recetas, y
|
|
# cambiar una sin la otra vuelve a romper.
|
|
#
|
|
# `CMAKE_INSTALL_LIBDIR=lib`: el lab usa `/usr/lib`, no `/usr/lib64`, o los `.cmake` y `.pc` quedan
|
|
# donde nadie los busca.
|
|
name = "abseil-cpp"
|
|
version = "20250512.1"
|
|
license = "Apache-2.0"
|
|
|
|
[source]
|
|
tarball = "https://github.com/abseil/abseil-cpp/archive/refs/tags/20250512.1.tar.gz"
|
|
sha256 = "9b7a064305e9fd94d124ffa6cc358592eb42b5da588fb4e07d09254aa40086db"
|
|
|
|
[build]
|
|
compiler = "gcc"
|
|
target = "x86_64-linux-musl"
|
|
link = "static"
|
|
flags = []
|
|
|
|
[build.phases]
|
|
configure = "cmake -S . -B build -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_INSTALL_LIBDIR=lib -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_CXX_STANDARD=17 -DABSL_PROPAGATE_CXX_STD=ON -DABSL_BUILD_TESTING=OFF"
|
|
compile = 'cmake --build build -j"$(nproc)"'
|
|
install = "DESTDIR=/out cmake --install build"
|
|
|
|
[deps]
|
|
build = ["binutils", "busybox", "make", "cmake"]
|