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.
69 lines
2.8 KiB
TOML
69 lines
2.8 KiB
TOML
# 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"]
|