Files
takana/recipes/ffmpeg.toml
T
Sergio 681bb642c2 corpus: subir nasm, alsa-lib y ffmpeg desde las colas — los tres con hash idéntico
Primer paso del frente de apps (ADR 0015, montón A: mpv → OBS → Firefox). `mpv` va al corpus
porque lo quieren las cuatro imágenes, y una receta del corpus resuelve sibling-first en
`recipes/`: desde ahí NO alcanza `incoming-kde/` ni `incoming-cosmic/`. Sus tres deps de sistema
vivían sólo en colas.

Lo que hace que esto no sea duplicar: `hammer hash` da el MISMO ArtifactHash a cada par
(nasm b3:3624bdd8, alsa-lib b3:73fb200a, ffmpeg b3:bfef7bf3), porque las deps que las colas les
resolvían ya caían al catálogo padre. Cache hit, cero rebuild, y una imagen que arrastre las dos
recetas hidrata UN artefacto en vez de dos peleando por la misma ruta.

Verificado también que comentar la receta es gratis: las cabeceras nuevas no mueven el hash.
2026-09-03 03:09:01 +00:00

72 lines
3.2 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.
#
# ⚠ LO QUE ESTA COPIA HEREDA Y `mpv` PAGA: `--disable-x86asm`. Para kpipewire —que sólo codifica un
# stream de escritorio— da igual; para un reproductor de video es la diferencia entre decodificar con
# SIMD y decodificar sin ella. Se deja ASÍ A PROPÓSITO: cambiarlo acá produciría un ffmpeg con hash
# distinto al de `incoming-kde/`, y entonces sí habría DOS ffmpeg peleando por las mismas rutas en
# una imagen KDE. El arreglo correcto no es esta receta sino promover una sola ffmpeg con x86asm y
# jubilar la de la cola —cambio con radio propio, que se mide antes de hacerlo. `nasm` ya está en el
# corpus para cuando toque.
# 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"
[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 \
--disable-x86asm
'''
compile = 'make -j"$(nproc)"'
install = "make DESTDIR=/out install"
[deps]
build = ["pkgconf", "zlib-shared"]