argp-standalone: nueva receta — la `argp` de glibc que musl no trae
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.
Semántico sayk'uy
Mana ima sutichaypas t'ikrakurqanchu: qillqalla, yachachiylla utaq willaylla t'ikrakurqan.
1 qillqakuna · +68 −0
- recipes/argp-standalone.toml +68 −0
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"]