From 377eecc57a4fcb271068922b71cdbb7872cde46d Mon Sep 17 00:00:00 2001 From: Sergio Date: Thu, 27 Aug 2026 20:30:03 +0000 Subject: [PATCH] =?UTF-8?q?argp-standalone:=20nueva=20receta=20=E2=80=94?= =?UTF-8?q?=20la=20`argp`=20de=20glibc=20que=20musl=20no=20trae?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Segunda pata del frente libdw/musl: `dwarves` hace `find_package(argp REQUIRED)` y musl no trae argp. Es lo que Alpine empaqueta como `argp-standalone`. Se compila a mano (sin autotools, como musl-obstack) y SÓLO los siete `argp-*.c` que el propio Makefile.am pone en `libargp_a_SOURCES`. Los otros .c del tarball (mempcpy/strchrnul/strndup/strcasecmp) son LIBOBJS de autoconf — reemplazos para sistemas que NO los tienen— y musl SÍ los tiene, así que incluirlos duplicaría símbolos de la libc. Gotcha: `UNUSED` no es del código, lo define el `acinclude.m4` de autoconf. Sin él las firmas `char* arg UNUSED` no parsean y salen `expected ')'` y varios `undeclared identifier 'state'` — errores que parecen del código y son de config. Va en el config.h a mano. --- recipes/argp-standalone.toml | 68 ++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 recipes/argp-standalone.toml diff --git a/recipes/argp-standalone.toml b/recipes/argp-standalone.toml new file mode 100644 index 00000000..53e11eb9 --- /dev/null +++ b/recipes/argp-standalone.toml @@ -0,0 +1,68 @@ +# argp-standalone 1.5.0 — la `argp` de glibc, empaquetada aparte para musl. +# +# POR QUÉ EXISTE: `argp` (el parser de opciones de GNU) es una extensión de glibc que musl NO trae, +# y `dwarves` hace `find_package(argp REQUIRED)`. Misma pieza que Alpine empaqueta como +# `argp-standalone`. Segunda pata del frente libdw/musl, junto a `musl-obstack`. +# +# SE COMPILA A MANO, sin autotools: el tarball trae Makefile.am pero NO un `configure` generado y el +# corpus no tiene autoconf/automake/libtool. +# +# Sólo los SIETE `argp-*.c` que el propio `Makefile.am` pone en `libargp_a_SOURCES`. Los otros .c +# del tarball (mempcpy/strchrnul/strndup/strcasecmp) son `LIBOBJS` de autoconf: reemplazos que sólo +# se compilan si el sistema NO los tiene, y musl SÍ los tiene ⇒ incluirlos duplicaría símbolos de +# la libc. `argp-test.c` es el test, tampoco entra. +# +# El nombre importa: dwarves lo busca con `find_library(... NAMES argp)` en /usr/lib. +name = "argp-standalone" +version = "1.5.0" +license = "LGPL-2.1-or-later" + +[source] +tarball = "https://github.com/argp-standalone/argp-standalone/archive/refs/tags/1.5.0.tar.gz" +sha256 = "c29eae929dfebd575c38174f2c8c315766092cec99a8f987569d0cad3c6d64f6" + +[build] +compiler = "zig-cc" +target = "x86_64-linux-musl" +link = "static" + +[build.phases] +# config.h a mano con los valores de musl. Lo que de verdad importa es que musl SÍ exporta +# `program_invocation_name`/`_short_name` (argp los usa para el nombre del programa en la ayuda). +# Los `HAVE_DECL_*_UNLOCKED` se dejan SIN definir a propósito: el código hace `#if !HAVE_DECL_x`, +# y un macro no definido vale 0 ⇒ cae solo en la variante con lock, que es la correcta y portable. +# `UNUSED` lo define normalmente el `acinclude.m4` de autoconf (no es del código): sin él, las firmas +# `char* arg UNUSED` no parsean y salen errores de sintaxis que NO parecen de config. +configure = ''' +printf '%s\n' \ + '#define HAVE_ALLOCA_H 1' \ + '#define HAVE_UNISTD_H 1' \ + '#define HAVE_LIMITS_H 1' \ + '#define HAVE_STDLIB_H 1' \ + '#define HAVE_STRING_H 1' \ + '#define HAVE_STRCASECMP 1' \ + '#define HAVE_STRCHRNUL 1' \ + '#define HAVE_STRNDUP 1' \ + '#define HAVE_MEMPCPY 1' \ + '#define HAVE_FLOCKFILE 1' \ + '#define HAVE_FUNLOCKFILE 1' \ + '#define HAVE_DECL_PROGRAM_INVOCATION_NAME 1' \ + '#define HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME 1' \ + '#define UNUSED __attribute__ ((__unused__))' \ + > config.h +''' +compile = ''' +for f in argp-ba argp-eexst argp-fmtstream argp-help argp-parse argp-pv argp-pvh; do + $CC -c -O2 -fPIC -I. -D_GNU_SOURCE -DHAVE_CONFIG_H $f.c -o $f.o +done +ar rcs libargp.a argp-ba.o argp-eexst.o argp-fmtstream.o argp-help.o argp-parse.o argp-pv.o argp-pvh.o +''' +install = ''' +mkdir -p /out/usr/lib /out/usr/include +cp libargp.a /out/usr/lib/ +cp argp.h /out/usr/include/ +test -f /out/usr/lib/libargp.a && test -f /out/usr/include/argp.h +''' + +[deps] +build = ["binutils"]