`licencias.sh --sembrar` escribe desde una tabla curada a mano y `licencias-desambiguar.sh` resuelve
`-only` vs `-or-later` preguntándole a la búsqueda de código de GitHub. Los dos dejan fuera lo mismo:
lo que nadie curó y lo que no vive en GitHub.
Pero `work/tarballs/` indexa cada tarball por su sha256, así que el árbol EXACTO que la receta pinea
ya está en disco: la declaración del propio autor, en el commit que construimos, sin red. De las 76
sin licencia, 55 tenían su tarball cacheado y 25 salieron con evidencia citable.
`scripts/licencias-tarball.py` la busca en tres niveles: la declaración del autor (`Cargo.toml`,
`meson.build`), un único fichero en `LICENSES/` (REUSE, que usa KDE), y el texto del COPYING más la
CONCESIÓN buscada en las cabeceras de los fuentes — excluyendo COPYING/LICENSE, porque el apéndice
de la GPL trae literalmente «or (at your option) any later version» y buscarla ahí da siempre
positivo siendo plantilla. Es la regla que ya fijó `licencias-desambiguar.sh`, aplicada al árbol
pineado en vez de a GitHub.
La primera versión resolvía 40, y CUATRO estaban mal. Las dejo escritas porque son la forma del
error, no accidentes:
· `socat` salía BSD-2 por su `COPYING.OpenSSL`, que es la excepción, no la licencia. Un `COPYING`
a secas gana ahora a cualquier sufijado.
· `pigz` salía Apache-2.0 por `zopfli/COPYING`: la licencia de una pieza VENDORIZADA leída como la
del contenedor. Sólo se mira la raíz.
· `openssh` salía MIT porque su `LICENCE` es un compendio de cuatro y me quedaba con la primera
que pegara. Si el texto trae varias, no hay veredicto: lo compone un humano.
· `nano` salía GPL-3.0-**or-later** citando el «either version 2» de su `aclocal.m4` — plantilla de
autotools, no del proyecto, y encima de otra versión. Ahora la cita tiene que venir de un fichero
del autor Y hablar de la misma versión mayor que el COPYING.
Y dos bugs míos que producían el mismo daño en silencio: la marca de BSD-3 era «Neither the name of»,
que libpcap y libzip no usan («The names of the authors may not be used to endorse») ⇒ se declaraban
BSD-2; y el mayor de versión lo sacaba de `"GPL-3.0".rsplit("-",1)[0][-1]`, que da «L», así que la
comprobación de coherencia rechazaba TODA cita válida.
La validación final no es una regex: un identificador vale si tenemos su texto en `licenses/`. La
obligación legal es acompañar el binario del TEXTO, así que un SPDX que no podemos entregar no
adelanta nada y sí crea una afirmación que no se sostiene. Eso es lo que atrapa el «GPL2+» que meson
deja escribir en `gsd-schemas` y `libgdm`, que no es un SPDX sino taquigrafía.
Nada se sembró a ojo: cada línea de `docs/licencias-evidencia.tsv` lleva la cita que la decidió, y
las 50 que quedan salen listadas con lo que SÍ se encontró en vez de rellenarse.
Comprobado que no se invalida nada: los 26 ArtifactHash afectados son idénticos antes y después
(`license` no está en `hash_inputs`) — medido, no supuesto.
130 lines
8.1 KiB
TOML
130 lines
8.1 KiB
TOML
# elfutils 0.194 (sólo libelf) — de-Alpinización del último build-dep del kernel.
|
|
#
|
|
# `tools/objtool` del kernel enlaza -lelf (libelf + gelf.h) — en x86_64 las mitigaciones fuerzan
|
|
# CONFIG_OBJTOOL. Venía de `apk add elfutils-dev` (bootstrap-lib). Esta receta construye libelf desde
|
|
# fuente. Misma versión que Alpine 3.23 (0.194). Build-tool de build-time (objtool corre durante la
|
|
# compilación del kernel; libelf NO se enlaza en el bzImage) ⇒ no afecta el of_tree del 4/4.
|
|
#
|
|
# Construimos SÓLO libelf (+ lib/libeu.a, su helper) — objtool no necesita libdw/libdwfl/src, que son
|
|
# los que arrastran argp/obstack/fts (lo verdaderamente difícil en musl). elfutils es glibc-céntrico;
|
|
# musl no trae <error.h>, <argp.h>, <libintl.h> ni rawmemchr. Estrategia de shims (en compat/, vía
|
|
# CPPFLAGS/-include) en vez de los parches completos de Alpine:
|
|
# - <libintl.h>: lo elimina --disable-nls (eu-config.h sólo lo incluye con ENABLE_NLS).
|
|
# - <error.h>: shim con error()/error_at_line() (musl ya exporta program_invocation_short_name).
|
|
# - <argp.h>: shim de tipos/decls — sólo lo usan lib/color.c y lib/printversion.c, cuyos .o van en
|
|
# libeu.a pero objtool NO referencia (sólo necesita el core de libelf) ⇒ basta que
|
|
# COMPILEN; las funcs argp quedan como undefined inertes en el .a.
|
|
# - rawmemchr: shim inline (lo usa libelf/elf_getarsym.c), force-include global.
|
|
# zig 0.13.0 (NO gcc): la regresión de zig 0.14 en C/musl (bisect con flex) miscompila; 0.13.0 la
|
|
# esquiva, consistente con binutils/openssl/flex. $CC (= zig cc del lab) para los stubs y las fases.
|
|
|
|
name = "elfutils"
|
|
version = "0.194"
|
|
license = "GPL-3.0-or-later"
|
|
|
|
[source]
|
|
tarball = "https://sourceware.org/elfutils/ftp/0.194/elfutils-0.194.tar.bz2"
|
|
sha256 = "09e2ff033d39baa8b388a2d7fbc5390bfde99ae3b7c67c7daaf7433fbcf0f01e"
|
|
|
|
[build]
|
|
compiler = "zig-cc"
|
|
target = "x86_64-linux-musl"
|
|
link = "dynamic"
|
|
zig_version = "0.13.0"
|
|
|
|
[deps]
|
|
build = ["binutils"]
|
|
|
|
[build.phases]
|
|
configure = """
|
|
mkdir -p compat && \
|
|
printf '%s\\n' \
|
|
'#ifndef _COMPAT_ERROR_H' '#define _COMPAT_ERROR_H' \
|
|
'#include <stdio.h>' '#include <stdlib.h>' '#include <stdarg.h>' '#include <string.h>' \
|
|
'extern char *program_invocation_short_name;' \
|
|
'static inline void error(int s,int e,const char*f,...){va_list a;fflush(stdout);' \
|
|
' fprintf(stderr,"%s: ",program_invocation_short_name);va_start(a,f);vfprintf(stderr,f,a);va_end(a);' \
|
|
' if(e)fprintf(stderr,": %s",strerror(e));fputc(0x0a,stderr);if(s)exit(s);}' \
|
|
'static inline void error_at_line(int s,int e,const char*fn,unsigned ln,const char*f,...){va_list a;' \
|
|
' fflush(stdout);fprintf(stderr,"%s:%s:%u: ",program_invocation_short_name,fn,ln);' \
|
|
' va_start(a,f);vfprintf(stderr,f,a);va_end(a);if(e)fprintf(stderr,": %s",strerror(e));' \
|
|
' fputc(0x0a,stderr);if(s)exit(s);}' \
|
|
'#endif' > compat/error.h && \
|
|
printf '%s\\n' \
|
|
'#ifndef _COMPAT_ARGP_H' '#define _COMPAT_ARGP_H' '#include <stdio.h>' '#include <errno.h>' \
|
|
'typedef int error_t;' \
|
|
'struct argp_option{const char*name;int key;const char*arg;int flags;const char*doc;int group;};' \
|
|
'struct argp;' \
|
|
'struct argp_state{const struct argp*root_argp;int argc;char**argv;int next;unsigned flags;' \
|
|
' unsigned arg_num;int quoted;void*input;void**child_inputs;void*hook;char*name;FILE*err_stream;' \
|
|
' FILE*out_stream;void*pstate;};' \
|
|
'typedef error_t(*argp_parser_t)(int,char*,struct argp_state*);' \
|
|
'struct argp_child;' \
|
|
'struct argp{const struct argp_option*options;argp_parser_t parser;const char*args_doc;' \
|
|
' const char*doc;const struct argp_child*children;char*(*help_filter)(int,const char*,void*);' \
|
|
' const char*argp_domain;};' \
|
|
'struct argp_child{const struct argp*argp;int flags;const char*header;int group;};' \
|
|
'#define ARGP_ERR_UNKNOWN E2BIG' '#define ARGP_KEY_ARG 0' '#define ARGP_KEY_END 0x1000001' \
|
|
'#define ARGP_KEY_INIT 0x1000003' '#define ARGP_KEY_FINI 0x1000007' '#define ARGP_KEY_SUCCESS 0x1000002' \
|
|
'#define ARGP_HELP_SEE 0x04' '#define ARGP_HELP_STD_ERR 0x2a' \
|
|
'#define OPTION_ARG_OPTIONAL 0x1' '#define OPTION_HIDDEN 0x2' '#define OPTION_ALIAS 0x4' \
|
|
'#define OPTION_DOC 0x8' '#define OPTION_NO_USAGE 0x10' '#define ARGP_IN_ORDER 0x08' \
|
|
'#define ARGP_NO_HELP 0x10' '#define ARGP_NO_EXIT 0x20' '#define ARGP_LONG_ONLY 0x40' \
|
|
'extern const char*argp_program_version;extern const char*argp_program_bug_address;' \
|
|
'extern void(*argp_program_version_hook)(FILE*,struct argp_state*);' \
|
|
'extern error_t argp_parse(const struct argp*,int,char**,unsigned,int*,void*);' \
|
|
'extern void argp_help(const struct argp*,FILE*,unsigned,char*);' \
|
|
'extern void argp_error(const struct argp_state*,const char*,...);' \
|
|
'#endif' > compat/argp.h && \
|
|
printf '%s\\n' \
|
|
'#ifndef _COMPAT_MUSL_EXTRA_H' '#define _COMPAT_MUSL_EXTRA_H' '#include <string.h>' \
|
|
'#ifndef __GLIBC__' \
|
|
'static inline void*rawmemchr(const void*s,int c){const unsigned char*p=s;' \
|
|
' for(;*p!=(unsigned char)c;p++){}' ' return(void*)p;}' \
|
|
'#endif' '#endif' > compat/musl-extra.h && \
|
|
printf '%s\\n' \
|
|
'#ifndef _COMPAT_LIBINTL_H' '#define _COMPAT_LIBINTL_H' \
|
|
'#define gettext(s) (s)' '#define dgettext(d,s) (s)' '#define dcgettext(d,s,c) (s)' \
|
|
'#define ngettext(s,p,n) ((n)==1?(s):(p))' '#define dngettext(d,s,p,n) ((n)==1?(s):(p))' \
|
|
'#define bindtextdomain(d,x) ((char*)0)' '#define textdomain(d) ((char*)0)' \
|
|
'#define bind_textdomain_codeset(d,c) ((char*)0)' \
|
|
'#endif' > compat/libintl.h && \
|
|
printf '%s\\n' \
|
|
'#include <stdio.h>' 'struct argp;struct argp_state;typedef int error_t;' \
|
|
'const char*argp_program_version;const char*argp_program_bug_address;' \
|
|
'void(*argp_program_version_hook)(FILE*,struct argp_state*);' \
|
|
'error_t argp_parse(const struct argp*a,int c,char**v,unsigned f,int*i,void*n){return 0;}' \
|
|
'void argp_help(const struct argp*a,FILE*s,unsigned f,char*n){}' \
|
|
'void argp_error(const struct argp_state*s,const char*f,...){}' \
|
|
'void argp_state_help(const struct argp_state*s,FILE*t,unsigned f){}' \
|
|
'void argp_usage(const struct argp_state*s){}' > compat/argp-stub.c && \
|
|
$CC -c compat/argp-stub.c -o compat/argp-stub.o && ar rcs compat/libargp.a compat/argp-stub.o && \
|
|
printf '%s\\n' \
|
|
'typedef struct{int x;}FTS;typedef struct{int y;}FTSENT;' \
|
|
'FTS*fts_open(char*const*p,int o,int(*c)(const FTSENT**,const FTSENT**)){return 0;}' \
|
|
'FTSENT*fts_read(FTS*f){return 0;}' 'FTSENT*fts_children(FTS*f,int o){return 0;}' \
|
|
'int fts_set(FTS*f,FTSENT*e,int o){return 0;}' 'int fts_close(FTS*f){return 0;}' > compat/fts-stub.c && \
|
|
$CC -c compat/fts-stub.c -o compat/fts-stub.o && ar rcs compat/libfts.a compat/fts-stub.o && \
|
|
printf '%s\\n' \
|
|
'struct obstack;void(*obstack_alloc_failed_handler)(void);int obstack_exit_failure;' \
|
|
'int _obstack_begin(struct obstack*o,int s,int a,void*(*c)(long),void(*f)(void*)){return 1;}' \
|
|
'int _obstack_begin_1(struct obstack*o,int s,int a,void*(*c)(void*,long),void(*f)(void*,void*),void*x){return 1;}' \
|
|
'void _obstack_newchunk(struct obstack*o,int l){}' 'int _obstack_allocated_p(struct obstack*o,void*p){return 0;}' \
|
|
'void _obstack_free(struct obstack*o,void*p){}' 'int _obstack_memory_used(struct obstack*o){return 0;}' \
|
|
> compat/obstack-stub.c && \
|
|
$CC -c compat/obstack-stub.c -o compat/obstack-stub.o && ar rcs compat/libobstack.a compat/obstack-stub.o && \
|
|
CFLAGS="-O2 -g -I$PWD/compat" CPPFLAGS="-I$PWD/compat" LDFLAGS="-L$PWD/compat" \
|
|
./configure --prefix=/usr --libdir=/usr/lib --disable-nls --disable-demangler \
|
|
--disable-libdebuginfod --disable-debuginfod --program-prefix=eu-
|
|
"""
|
|
# El -include del shim de rawmemchr va SÓLO en compile (en configure rompe el test "undeclared builtins"
|
|
# de autoconf). CFLAGS aquí reemplaza el de configure (mismo valor + el -include); AM_CFLAGS (warnings/
|
|
# -Werror) se preserva.
|
|
compile = "make -C lib CFLAGS=\"-O2 -g -I$PWD/compat -include $PWD/compat/musl-extra.h\" && make -C libelf libelf.a libelf.so CFLAGS=\"-O2 -g -I$PWD/compat -include $PWD/compat/musl-extra.h\""
|
|
install = """
|
|
mkdir -p /out/usr/lib/pkgconfig /out/usr/include && \
|
|
cp -a libelf/libelf.a libelf/libelf.so* /out/usr/lib/ && \
|
|
cp -a libelf/libelf.h libelf/gelf.h /out/usr/include/ && \
|
|
cp -a config/libelf.pc /out/usr/lib/pkgconfig/ 2>/dev/null || true
|
|
"""
|