From 876754c30bbee2c6fc138b97e0598c3e5558221c Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Tue, 23 Jun 2026 12:53:08 -0700 Subject: [PATCH 1/2] ffmpeg: build shared libs, halve the wheel size --- ffmpeg/build.sh | 28 +++++++++++++++++----------- ffmpeg/pyproject.toml | 2 +- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/ffmpeg/build.sh b/ffmpeg/build.sh index 48f2fb8..fbfa8ef 100755 --- a/ffmpeg/build.sh +++ b/ffmpeg/build.sh @@ -15,7 +15,8 @@ INSTALL_DIR="$DIR/ffmpeg/install" NJOBS="$(nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 2)" CC="ccache ${CC:-cc}" PREFIX="$DIR/build/prefix" -mkdir -p "$DIR/build" +rm -rf "$PREFIX" "$DIR/build/lib" +mkdir -p "$DIR/build" "$PREFIX" # --- Build zlib (static) --- if [ ! -d "zlib-src/.git" ]; then @@ -113,6 +114,7 @@ git -C ffmpeg-src fetch --depth 1 origin "n${FFMPEG_VERSION}" git -C ffmpeg-src checkout --force FETCH_HEAD cd ffmpeg-src +make distclean >/dev/null 2>&1 || true # Platform-specific hardware acceleration flags HW_FLAGS=() @@ -151,8 +153,8 @@ PKG_CONFIG_PATH="$PREFIX/lib/pkgconfig${PKG_CONFIG_PATH:+:$PKG_CONFIG_PATH}" \ --cc="${CC:-cc}" \ --prefix="$PREFIX" \ --enable-gpl \ - --enable-static \ - --disable-shared \ + --disable-static \ + --enable-shared \ --enable-zlib \ --enable-libx264 \ --enable-pic \ @@ -171,6 +173,7 @@ PKG_CONFIG_PATH="$PREFIX/lib/pkgconfig${PKG_CONFIG_PATH:+:$PKG_CONFIG_PATH}" \ --enable-bsf=extract_extradata,h264_mp4toannexb,hevc_mp4toannexb \ --extra-cflags="-I$PREFIX/include" \ --extra-ldflags="-L$PREFIX/lib" \ + --install-name-dir=@rpath \ "${HW_FLAGS[@]}" make -j"$NJOBS" make install @@ -184,22 +187,25 @@ mkdir -p "$INSTALL_DIR"/{bin,lib,include} cp "$PREFIX/bin/ffmpeg" "$INSTALL_DIR/bin/" cp "$PREFIX/bin/ffprobe" "$INSTALL_DIR/bin/" -# Libraries -LIBS="libavformat.a libavcodec.a libavutil.a libswresample.a libx264.a libz.a" if [ "$PLATFORM" = "Linux" ]; then - LIBS="$LIBS libva.a libva-drm.a libdrm.a" + find "$PREFIX/lib" -maxdepth 1 -type l \( -name 'libav*.so.[0-9]*' -o -name 'libsw*.so.[0-9]*' -o -name 'libpostproc.so.[0-9]*' \) | + while read -r lib; do name="$(basename "$lib")"; cp -L "$lib" "$INSTALL_DIR/lib/$name"; printf 'INPUT(%s)\n' "$name" > "$INSTALL_DIR/lib/${name%%.so.*}.so"; done + for bin in "$INSTALL_DIR/bin/"*; do patchelf --set-rpath '$ORIGIN/../lib' "$bin"; done + for lib in "$INSTALL_DIR/lib/"*.so.*; do patchelf --set-rpath '$ORIGIN' "$lib"; done +elif [ "$PLATFORM" = "Darwin" ]; then + find "$PREFIX/lib" -maxdepth 1 -type l \( -name 'libav*.[0-9]*.dylib' -o -name 'libsw*.[0-9]*.dylib' -o -name 'libpostproc*.[0-9]*.dylib' \) | + while read -r lib; do cp -L "$lib" "$INSTALL_DIR/lib/$(basename "$lib")"; done + for bin in "$INSTALL_DIR/bin/"*; do install_name_tool -add_rpath "@loader_path/../lib" "$bin" 2>/dev/null || true; done + for lib in "$INSTALL_DIR/lib/"*.dylib; do install_name_tool -id "@rpath/$(basename "$lib")" "$lib"; done fi -for lib in $LIBS; do - cp "$PREFIX/lib/$lib" "$INSTALL_DIR/lib/" -done # Headers for dir in libavformat libavcodec libavutil libswresample; do cp -r "$PREFIX/include/$dir" "$INSTALL_DIR/include/" done -# Strip binaries -strip "$INSTALL_DIR/bin/ffmpeg" "$INSTALL_DIR/bin/ffprobe" 2>/dev/null || true +# Strip binaries and shared libraries +strip "$INSTALL_DIR/bin/ffmpeg" "$INSTALL_DIR/bin/ffprobe" "$INSTALL_DIR/lib/"*.so.* "$INSTALL_DIR/lib/"*.dylib 2>/dev/null || true echo "Installed ffmpeg to $INSTALL_DIR" du -sh "$INSTALL_DIR" diff --git a/ffmpeg/pyproject.toml b/ffmpeg/pyproject.toml index 5ac7fa2..d665350 100644 --- a/ffmpeg/pyproject.toml +++ b/ffmpeg/pyproject.toml @@ -13,7 +13,7 @@ ffmpeg = "ffmpeg:_run_ffmpeg" ffprobe = "ffmpeg:_run_ffprobe" [tool.setuptools.packages.find] -include = ["ffmpeg*"] +include = ["ffmpeg"] [tool.setuptools.package-data] ffmpeg = ["install/**/*"] From 8b4a004a7acbe6348c75fa7670d20ab77daa6875 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Tue, 23 Jun 2026 13:54:55 -0700 Subject: [PATCH 2/2] do it in build --- ffmpeg/build.sh | 52 ++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 43 insertions(+), 9 deletions(-) diff --git a/ffmpeg/build.sh b/ffmpeg/build.sh index fbfa8ef..ecf18fa 100755 --- a/ffmpeg/build.sh +++ b/ffmpeg/build.sh @@ -118,7 +118,13 @@ make distclean >/dev/null 2>&1 || true # Platform-specific hardware acceleration flags HW_FLAGS=() +LOADER_FLAGS=() +FFMPEG_LDEXEFLAGS= +FFMPEG_LDSOFLAGS= if [ "$PLATFORM" = "Linux" ]; then + FFMPEG_LDEXEFLAGS='-Wl,-rpath,\$$ORIGIN/../lib -Wl,-z,origin' + FFMPEG_LDSOFLAGS='-Wl,-rpath,\$$$$ORIGIN -Wl,-z,origin' + HW_FLAGS+=( # NVIDIA CUDA/NVDEC (uses dlopen at runtime) --enable-ffnvcodec --enable-cuda --enable-cuvid --enable-nvdec @@ -140,6 +146,11 @@ if [ "$PLATFORM" = "Linux" ]; then --enable-encoder=h264_vulkan,hevc_vulkan ) elif [ "$PLATFORM" = "Darwin" ]; then + FFMPEG_LDEXEFLAGS='-Wl,-rpath,@loader_path/../lib' + LOADER_FLAGS+=( + --install-name-dir=@rpath + ) + HW_FLAGS+=( # VideoToolbox (Apple Silicon / macOS) --enable-videotoolbox @@ -149,6 +160,8 @@ elif [ "$PLATFORM" = "Darwin" ]; then fi PKG_CONFIG_PATH="$PREFIX/lib/pkgconfig${PKG_CONFIG_PATH:+:$PKG_CONFIG_PATH}" \ +LDEXEFLAGS="$FFMPEG_LDEXEFLAGS" \ +LDSOFLAGS="$FFMPEG_LDSOFLAGS" \ ./configure \ --cc="${CC:-cc}" \ --prefix="$PREFIX" \ @@ -173,7 +186,7 @@ PKG_CONFIG_PATH="$PREFIX/lib/pkgconfig${PKG_CONFIG_PATH:+:$PKG_CONFIG_PATH}" \ --enable-bsf=extract_extradata,h264_mp4toannexb,hevc_mp4toannexb \ --extra-cflags="-I$PREFIX/include" \ --extra-ldflags="-L$PREFIX/lib" \ - --install-name-dir=@rpath \ + "${LOADER_FLAGS[@]}" \ "${HW_FLAGS[@]}" make -j"$NJOBS" make install @@ -187,16 +200,37 @@ mkdir -p "$INSTALL_DIR"/{bin,lib,include} cp "$PREFIX/bin/ffmpeg" "$INSTALL_DIR/bin/" cp "$PREFIX/bin/ffprobe" "$INSTALL_DIR/bin/" +FFMPEG_LIBS=(avdevice avfilter avformat avcodec postproc swresample swscale avutil) + +copy_linux_ffmpeg_lib() { + local lib="$1" + local soname + + soname="$(readelf -d "$PREFIX/lib/lib${lib}.so" | sed -n 's/.*Library soname: \[\(.*\)\]/\1/p')" + [ -n "$soname" ] || { echo "error: could not find SONAME for lib${lib}.so" >&2; exit 1; } + + cp -L "$PREFIX/lib/$soname" "$INSTALL_DIR/lib/$soname" + printf 'INPUT(%s)\n' "$soname" > "$INSTALL_DIR/lib/lib${lib}.so" +} + +copy_darwin_ffmpeg_lib() { + local lib="$1" + local dylib + + dylib="$(otool -D "$PREFIX/lib/lib${lib}.dylib" | sed -n '2s|.*/||p')" + [ -n "$dylib" ] || { echo "error: could not find install name for lib${lib}.dylib" >&2; exit 1; } + + cp -L "$PREFIX/lib/$dylib" "$INSTALL_DIR/lib/$dylib" +} + if [ "$PLATFORM" = "Linux" ]; then - find "$PREFIX/lib" -maxdepth 1 -type l \( -name 'libav*.so.[0-9]*' -o -name 'libsw*.so.[0-9]*' -o -name 'libpostproc.so.[0-9]*' \) | - while read -r lib; do name="$(basename "$lib")"; cp -L "$lib" "$INSTALL_DIR/lib/$name"; printf 'INPUT(%s)\n' "$name" > "$INSTALL_DIR/lib/${name%%.so.*}.so"; done - for bin in "$INSTALL_DIR/bin/"*; do patchelf --set-rpath '$ORIGIN/../lib' "$bin"; done - for lib in "$INSTALL_DIR/lib/"*.so.*; do patchelf --set-rpath '$ORIGIN' "$lib"; done + for lib in "${FFMPEG_LIBS[@]}"; do + copy_linux_ffmpeg_lib "$lib" + done elif [ "$PLATFORM" = "Darwin" ]; then - find "$PREFIX/lib" -maxdepth 1 -type l \( -name 'libav*.[0-9]*.dylib' -o -name 'libsw*.[0-9]*.dylib' -o -name 'libpostproc*.[0-9]*.dylib' \) | - while read -r lib; do cp -L "$lib" "$INSTALL_DIR/lib/$(basename "$lib")"; done - for bin in "$INSTALL_DIR/bin/"*; do install_name_tool -add_rpath "@loader_path/../lib" "$bin" 2>/dev/null || true; done - for lib in "$INSTALL_DIR/lib/"*.dylib; do install_name_tool -id "@rpath/$(basename "$lib")" "$lib"; done + for lib in "${FFMPEG_LIBS[@]}"; do + copy_darwin_ffmpeg_lib "$lib" + done fi # Headers