Tres que había clasificado como decisión legal y no lo eran. Las dos causas son distintas y las dos me las estaba perdiendo por mirar sólo el árbol: **ffmpeg → LGPL-2.1-or-later.** Su raíz trae cuatro COPYING.* y por eso el detector se planta, con razón: el árbol solo no puede decidir. Pero el `LICENSE.md` del propio ffmpeg explica la regla —«In combination the LGPL v2.1+ applies to FFmpeg» y «None of these parts are used by default, you have to explicitly pass `--enable-gpl`… In this case, FFmpeg's license changes to GPL v2+»— y la respuesta la da NUESTRA receta: no pasa `--enable-gpl` ni `--enable-version3`, y encima va con `--disable-autodetect`. O sea que la licencia sale de cruzar el árbol con los flags, no de elegir uno de los cuatro ficheros. **llvm18 y clang18 → Apache-2.0 WITH LLVM-exception.** Acá el detector veía «tres licencias distintas» en un solo `LICENSE.TXT` y se plantaba, pero el fichero ABRE diciendo «The LLVM Project is under the Apache License v2.0 with LLVM Exceptions»: lo demás es la sección legada. La regla de «varias licencias ⇒ decide un humano» es correcta como default y aquí el humano sólo tuvo que leer la primera línea. `licenses/` pasa de 48 a 49 textos: `LLVM-exception` hacía falta para poder declararla, que es el lazo de siempre —no se declara lo que no se puede entregar—. El único sin texto canónico sigue siendo `LicenseRef-qorpa-ajena-no-enumerable`, que es identificador nuestro y SPDX no publica. 97% (1135/1165); la cola baja de 27 a 24. Los 3 ArtifactHash, idénticos.
85 lines
4.1 KiB
TOML
85 lines
4.1 KiB
TOML
# ══ COPIA AL CORPUS, hash IDÉNTICO (b3:bfef7bf3…) ════════════════════════════════════
|
|
# El original vive en `incoming-kde/` porque entró por kpipewire (grabar streams). Sube al corpus
|
|
# porque `mpv` lo necesita y una receta del corpus no alcanza una cola hermana.
|
|
#
|
|
# GRATIS Y SIN DUPLICAR, medido con `hammer hash` antes de escribir esto: sus dos deps son `pkgconf`
|
|
# y `zlib-shared`; `incoming-kde/zlib-shared.toml` y `recipes/zlib-shared.toml` son el mismo texto
|
|
# (difieren en una línea en blanco, que no entra a `hash_inputs`) ⇒ el cierre no cambia y los dos
|
|
# ficheros dan el MISMO ArtifactHash. Una imagen KDE con mpv adentro hidrata UN ffmpeg.
|
|
#
|
|
# ══ x86asm ENCENDIDA (2026-09-04) — el bloqueo que lo impedía ya no existe ══════════════════════
|
|
# Esta receta llevó `--disable-x86asm` heredado de cuando ffmpeg entró SÓLO para kpipewire (codificar
|
|
# un stream de escritorio, donde da igual). Para un reproductor de video es la diferencia entre
|
|
# decodificar con SIMD y sin ella, y `mpv` lo pagaba.
|
|
#
|
|
# La razón para NO tocarlo era que un hash distinto dejaría DOS ffmpeg peleando por las mismas rutas
|
|
# en una imagen KDE, y decía que el arreglo correcto era «promover una sola ffmpeg y jubilar la de la
|
|
# cola». **Eso ya pasó: `incoming-kde/ffmpeg.toml` no existe** —hoy hay UNA sola receta ffmpeg en
|
|
# todo el disco (`find recipes -name 'ffmpeg*.toml'`) y las recetas de la cola la resuelven por caída
|
|
# al catálogo padre. La condición para encenderlo estaba cumplida y el comentario había envejecido
|
|
# hacia la mentira: seguía prohibiendo por un duplicado que ya no estaba.
|
|
#
|
|
# Radio medido ANTES de tocar (`yupana radio ffmpeg`): 4 dependientes, los 4 sellados y ninguno
|
|
# transitivo de más — corpus/mpv, corpus/wf-recorder, incoming-kde/kpipewire, incoming-kde/spectacle.
|
|
# Cuatro rebuilds es el precio completo.
|
|
#
|
|
# `nasm` (2.16.03, sellado) pasa a `[deps].build`: sin él configure no encuentra ensamblador y
|
|
# apagaría x86asm en silencio — que es justo el fallo que esta receta no puede permitirse, porque
|
|
# saldría un artefacto con OTRO hash y sin la SIMD que dice traer.
|
|
# ffmpeg 7.1 — libavcodec/libavutil/libavformat/libavfilter (+swscale/swresample). Campaña KDE (ADR 0011):
|
|
# **kpipewire** los exige los cuatro REQUIRED (`pkg_check_modules(AVCodec ... libavcodec REQUIRED)` etc.)
|
|
# para KPipeWireRecord (grabar streams a fichero), y spectacle linkea K::KPipeWireRecord duro.
|
|
#
|
|
# ffmpeg NO usa autotools: trae su propio `configure` con --cc/--ar/--nm/--ranlib. Se le pasan wrappers de
|
|
# UN SOLO TOKEN (`$PWD/.zwrap/*`): un `--ar="zig ar"` con espacio se ejecutaría como un binario único
|
|
# (mismo gotcha que el AR de los crates `cc` en las recetas Rust).
|
|
#
|
|
# **--disable-autodetect** es clave para el determinismo: sin él, configure escanea el sandbox y activa
|
|
# libs a discreción. Con él, ffmpeg queda auto-contenido (sus códecs nativos, sin x264/x265/vpx/etc.).
|
|
# Sin programas (ffmpeg/ffplay/ffprobe) ni doc: kpipewire sólo consume las libs.
|
|
name = "ffmpeg"
|
|
version = "7.1"
|
|
license = "LGPL-2.1-or-later"
|
|
|
|
[source]
|
|
tarball = "https://ffmpeg.org/releases/ffmpeg-7.1.tar.xz"
|
|
sha256 = "40973d44970dbc83ef302b0609f2e74982be2d85916dd2ee7472d30678a7abe6"
|
|
|
|
[build]
|
|
compiler = "zig-cc"
|
|
target = "x86_64-linux-musl"
|
|
link = "dynamic"
|
|
flags = []
|
|
|
|
[build.phases]
|
|
configure = '''
|
|
ZW="$PWD/.zwrap"; mkdir -p "$ZW"
|
|
cat > "$ZW/cc" <<'W'
|
|
#!/bin/sh
|
|
exec /opt/zig/zig cc -mcpu=baseline "$@"
|
|
W
|
|
cat > "$ZW/cxx" <<'W'
|
|
#!/bin/sh
|
|
exec /opt/zig/zig c++ -mcpu=baseline "$@"
|
|
W
|
|
cat > "$ZW/ar" <<'W'
|
|
#!/bin/sh
|
|
exec /opt/zig/zig ar "$@"
|
|
W
|
|
cat > "$ZW/ranlib" <<'W'
|
|
#!/bin/sh
|
|
exec /opt/zig/zig ranlib "$@"
|
|
W
|
|
chmod +x "$ZW/cc" "$ZW/cxx" "$ZW/ar" "$ZW/ranlib"
|
|
./configure --prefix=/usr \
|
|
--cc="$ZW/cc" --cxx="$ZW/cxx" --ar="$ZW/ar" --ranlib="$ZW/ranlib" \
|
|
--enable-shared --disable-static \
|
|
--disable-autodetect --disable-doc --disable-programs --disable-debug \
|
|
--x86asmexe=nasm
|
|
'''
|
|
compile = 'make -j"$(nproc)"'
|
|
install = "make DESTDIR=/out install"
|
|
|
|
[deps]
|
|
build = ["pkgconf", "zlib-shared", "nasm"]
|