# 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"]