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