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.
This commit is contained in:
@@ -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"]
|
||||
Reference in New Issue
Block a user