From 32735f38b31e9e1fd44e8a773618d87170e424dc Mon Sep 17 00:00:00 2001 From: edde746 <86283021+edde746@users.noreply.github.com> Date: Mon, 9 Feb 2026 18:13:36 +0100 Subject: [PATCH] feat: build libmpv from source in CI --- .github/workflows/build.yml | 46 +++++++++- linux/packaging/build-libmpv.sh | 143 ++++++++++++++++++++++++++++++++ linux/packaging/bundle-libs.sh | 2 - 3 files changed, 185 insertions(+), 6 deletions(-) create mode 100755 linux/packaging/build-libmpv.sh diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 7ae1e5a0..22de31d6 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -429,13 +429,24 @@ jobs: - name: Cache APT packages uses: awalsh128/cache-apt-pkgs-action@latest with: - packages: clang cmake ninja-build pkg-config libgtk-3-dev liblzma-dev libstdc++-12-dev libasound2-dev libmpv-dev mpv libx11-dev libxext-dev libxrandr-dev libxcursor-dev libxi-dev libxss-dev libpulse-dev libdbus-1-dev libdrm-dev libgbm-dev libegl-dev libgl-dev libwayland-dev ruby ruby-dev rubygems build-essential rpm libarchive-tools imagemagick + packages: clang cmake meson ninja-build pkg-config nasm libgtk-3-dev liblzma-dev libstdc++-12-dev libasound2-dev libass-dev libfreetype-dev libfontconfig-dev libfribidi-dev libharfbuzz-dev libepoxy-dev libegl-dev libgl-dev libpipewire-0.3-dev libva-dev libvdpau-dev libx11-dev libxext-dev libxrandr-dev libxcursor-dev libxi-dev libxss-dev libxpresent-dev libxkbcommon-dev libpulse-dev libdbus-1-dev libdrm-dev libgbm-dev libwayland-dev wayland-protocols liblcms2-dev ruby ruby-dev rubygems build-essential rpm libarchive-tools imagemagick version: 1.1 - name: Install Linux dependencies run: | sudo apt-get update - sudo apt-get install -y clang cmake ninja-build pkg-config libgtk-3-dev liblzma-dev libstdc++-12-dev libasound2-dev libmpv-dev mpv libx11-dev libxext-dev libxrandr-dev libxcursor-dev libxi-dev libxss-dev libpulse-dev libdbus-1-dev libdrm-dev libgbm-dev libegl-dev libgl-dev libwayland-dev ruby ruby-dev rubygems build-essential rpm libarchive-tools imagemagick + sudo apt-get install -y clang cmake meson ninja-build pkg-config nasm libgtk-3-dev liblzma-dev libstdc++-12-dev libasound2-dev libass-dev libfreetype-dev libfontconfig-dev libfribidi-dev libharfbuzz-dev libepoxy-dev libegl-dev libgl-dev libpipewire-0.3-dev libva-dev libvdpau-dev libx11-dev libxext-dev libxrandr-dev libxcursor-dev libxi-dev libxss-dev libxpresent-dev libxkbcommon-dev libpulse-dev libdbus-1-dev libdrm-dev libgbm-dev libwayland-dev wayland-protocols liblcms2-dev ruby ruby-dev rubygems build-essential rpm libarchive-tools imagemagick + + - name: Cache libmpv build + id: libmpv-cache + uses: actions/cache@v4 + with: + path: libmpv-prefix + key: libmpv-${{ runner.arch }}-${{ hashFiles('linux/packaging/build-libmpv.sh') }} + + - name: Build libmpv + if: steps.libmpv-cache.outputs.cache-hit != 'true' + run: bash linux/packaging/build-libmpv.sh - name: Install fpm run: sudo gem install fpm @@ -445,10 +456,18 @@ jobs: - name: Build Linux x64 run: flutter build linux --release --dart-define=ENABLE_UPDATE_CHECK=true + env: + PKG_CONFIG_PATH: libmpv-prefix/lib/pkgconfig:libmpv-prefix/lib/x86_64-linux-gnu/pkgconfig - name: Build Linux Packages run: ARCH_SUFFIX=x64 OUTPUT_DIR=$GITHUB_WORKSPACE python3 linux/packaging/build-packages.py + - name: Copy libmpv into bundle + run: | + BUNDLE_LIB=build/linux/x64/release/bundle/lib + cp -a libmpv-prefix/lib/libmpv.so* "$BUNDLE_LIB/" + cp -a libmpv-prefix/lib/libshaderc_shared.so* "$BUNDLE_LIB/" + - name: Bundle shared libraries for portable tarball run: bash linux/packaging/bundle-libs.sh build/linux/x64/release/bundle @@ -517,13 +536,24 @@ jobs: - name: Cache APT packages uses: awalsh128/cache-apt-pkgs-action@latest with: - packages: clang cmake ninja-build pkg-config libgtk-3-dev liblzma-dev libstdc++-12-dev libasound2-dev libmpv-dev mpv libx11-dev libxext-dev libxrandr-dev libxcursor-dev libxi-dev libxss-dev libpulse-dev libdbus-1-dev libdrm-dev libgbm-dev libegl-dev libgl-dev libwayland-dev ruby ruby-dev rubygems build-essential rpm libarchive-tools imagemagick + packages: clang cmake meson ninja-build pkg-config nasm libgtk-3-dev liblzma-dev libstdc++-12-dev libasound2-dev libass-dev libfreetype-dev libfontconfig-dev libfribidi-dev libharfbuzz-dev libepoxy-dev libegl-dev libgl-dev libpipewire-0.3-dev libva-dev libvdpau-dev libx11-dev libxext-dev libxrandr-dev libxcursor-dev libxi-dev libxss-dev libxpresent-dev libxkbcommon-dev libpulse-dev libdbus-1-dev libdrm-dev libgbm-dev libwayland-dev wayland-protocols liblcms2-dev ruby ruby-dev rubygems build-essential rpm libarchive-tools imagemagick version: 1.1 - name: Install Linux dependencies run: | sudo apt-get update - sudo apt-get install -y clang cmake ninja-build pkg-config libgtk-3-dev liblzma-dev libstdc++-12-dev libasound2-dev libmpv-dev mpv libx11-dev libxext-dev libxrandr-dev libxcursor-dev libxi-dev libxss-dev libpulse-dev libdbus-1-dev libdrm-dev libgbm-dev libegl-dev libgl-dev libwayland-dev ruby ruby-dev rubygems build-essential rpm libarchive-tools imagemagick + sudo apt-get install -y clang cmake meson ninja-build pkg-config nasm libgtk-3-dev liblzma-dev libstdc++-12-dev libasound2-dev libass-dev libfreetype-dev libfontconfig-dev libfribidi-dev libharfbuzz-dev libepoxy-dev libegl-dev libgl-dev libpipewire-0.3-dev libva-dev libvdpau-dev libx11-dev libxext-dev libxrandr-dev libxcursor-dev libxi-dev libxss-dev libxpresent-dev libxkbcommon-dev libpulse-dev libdbus-1-dev libdrm-dev libgbm-dev libwayland-dev wayland-protocols liblcms2-dev ruby ruby-dev rubygems build-essential rpm libarchive-tools imagemagick + + - name: Cache libmpv build + id: libmpv-cache + uses: actions/cache@v4 + with: + path: libmpv-prefix + key: libmpv-${{ runner.arch }}-${{ hashFiles('linux/packaging/build-libmpv.sh') }} + + - name: Build libmpv + if: steps.libmpv-cache.outputs.cache-hit != 'true' + run: bash linux/packaging/build-libmpv.sh - name: Install fpm run: sudo gem install fpm @@ -533,6 +563,8 @@ jobs: - name: Build Linux arm64 run: flutter build linux --release --dart-define=ENABLE_UPDATE_CHECK=true + env: + PKG_CONFIG_PATH: libmpv-prefix/lib/pkgconfig:libmpv-prefix/lib/aarch64-linux-gnu/pkgconfig - name: Find bundle directory id: find-bundle @@ -547,6 +579,12 @@ jobs: OUTPUT_DIR=$GITHUB_WORKSPACE \ python3 linux/packaging/build-packages.py + - name: Copy libmpv into bundle + run: | + BUNDLE_LIB=${{ steps.find-bundle.outputs.bundle_dir }}/lib + cp -a libmpv-prefix/lib/libmpv.so* "$BUNDLE_LIB/" + cp -a libmpv-prefix/lib/libshaderc_shared.so* "$BUNDLE_LIB/" + - name: Bundle shared libraries for portable tarball run: bash linux/packaging/bundle-libs.sh ${{ steps.find-bundle.outputs.bundle_dir }} diff --git a/linux/packaging/build-libmpv.sh b/linux/packaging/build-libmpv.sh new file mode 100755 index 00000000..e9cb4549 --- /dev/null +++ b/linux/packaging/build-libmpv.sh @@ -0,0 +1,143 @@ +#!/usr/bin/env bash +set -euo pipefail + +PREFIX="$(pwd)/libmpv-prefix" +JOBS="$(nproc)" + +FFMPEG_VERSION="7.1" +SHADERC_VERSION="2024.4" +LIBPLACEBO_VERSION="7.351.0" +MPV_VERSION="0.40.0" + +PREFIX="$(realpath "$PREFIX")" +mkdir -p "$PREFIX" +export PKG_CONFIG_PATH="$PREFIX/lib/pkgconfig:$PREFIX/lib/$(uname -m)-linux-gnu/pkgconfig:${PKG_CONFIG_PATH:-}" + +SRCDIR="$(mktemp -d)" +trap 'rm -rf "$SRCDIR"' EXIT +cd "$SRCDIR" + +echo "==> Sources in $SRCDIR" +echo "==> Install prefix: $PREFIX" +echo "" + +# ─── Step 1: ffmpeg (static libraries) ─────────────────────────────────────── + +echo "==> Building ffmpeg $FFMPEG_VERSION (static, decoder-only)..." +curl -sL "https://ffmpeg.org/releases/ffmpeg-${FFMPEG_VERSION}.tar.xz" | tar xJ +cd "ffmpeg-${FFMPEG_VERSION}" + +./configure \ + --prefix="$PREFIX" \ + --enable-gpl \ + --enable-version3 \ + --enable-static \ + --disable-shared \ + --enable-pic \ + --disable-programs \ + --disable-doc \ + --disable-encoders \ + --disable-muxers \ + --enable-muxer=spdif \ + --disable-devices \ + --disable-bsfs \ + --enable-bsf=aac_adtstoasc,av1_metadata,extract_extradata,h264_metadata,h264_mp4toannexb,hevc_metadata,hevc_mp4toannexb,vp9_metadata \ + --disable-filters \ + --enable-filter=aformat,aresample,format,null,scale \ + --enable-vaapi \ + --enable-vdpau \ + --disable-debug \ + --disable-stripping + +make -j"$JOBS" +make install +cd "$SRCDIR" + +echo "" +echo "==> ffmpeg done." +echo "" + +# ─── Step 2: shaderc (static library) ───────────────────────────────────────── + +echo "==> Building shaderc $SHADERC_VERSION (static)..." +git clone --depth 1 --branch "v${SHADERC_VERSION}" \ + https://github.com/google/shaderc.git "shaderc-v${SHADERC_VERSION}" +cd "shaderc-v${SHADERC_VERSION}" +./utils/git-sync-deps + +cmake -S . -B build \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX="$PREFIX" \ + -DSHADERC_SKIP_TESTS=ON \ + -DSHADERC_SKIP_EXAMPLES=ON \ + -DSHADERC_SKIP_COPYRIGHT_CHECK=ON \ + -DBUILD_SHARED_LIBS=OFF \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON + +cmake --build build -j"$JOBS" +cmake --install build + +cd "$SRCDIR" + +echo "" +echo "==> shaderc done." +echo "" + +# ─── Step 3: libplacebo (static library) ───────────────────────────────────── + +echo "==> Building libplacebo $LIBPLACEBO_VERSION (static)..." +git clone --depth 1 --recursive --branch "v${LIBPLACEBO_VERSION}" \ + https://code.videolan.org/videolan/libplacebo.git "libplacebo-v${LIBPLACEBO_VERSION}" +cd "libplacebo-v${LIBPLACEBO_VERSION}" + +meson setup build \ + --prefix="$PREFIX" \ + --default-library=static \ + -Dvulkan=disabled \ + -Dd3d11=disabled \ + -Ddemos=false \ + -Dtests=false + +ninja -C build -j"$JOBS" +ninja -C build install +cd "$SRCDIR" + +echo "" +echo "==> libplacebo done." +echo "" + +# ─── Step 4: mpv (shared libmpv) ───────────────────────────────────────────── + +echo "==> Building mpv $MPV_VERSION (shared libmpv only)..." +curl -sL "https://github.com/mpv-player/mpv/archive/refs/tags/v${MPV_VERSION}.tar.gz" | tar xz +cd "mpv-${MPV_VERSION}" + +meson setup build \ + --prefix="$PREFIX" \ + -Dlibmpv=true \ + -Dcplayer=false \ + -Dbuild-date=false \ + -Dlua=disabled \ + -Djavascript=disabled \ + -Dcplugins=disabled \ + -Dmanpage-build=disabled \ + -Djack=disabled \ + -Dvulkan=disabled \ + -Dd3d11=disabled \ + -Dgl=enabled \ + -Dvaapi=enabled \ + -Dvdpau=enabled \ + -Dalsa=enabled \ + -Dpulse=enabled \ + -Dpipewire=enabled \ + -Dwayland=enabled \ + -Dx11=enabled + +ninja -C build -j"$JOBS" +ninja -C build install +cd "$SRCDIR" + +echo "" +echo "==> mpv done." +echo "" +echo "==> libmpv build complete. Output in $PREFIX" diff --git a/linux/packaging/bundle-libs.sh b/linux/packaging/bundle-libs.sh index 5d75e493..5bdb8c51 100755 --- a/linux/packaging/bundle-libs.sh +++ b/linux/packaging/bundle-libs.sh @@ -53,8 +53,6 @@ bundle_dlopen_lib() { fi } -bundle_dlopen_lib "libmpv.so" - echo "==> Discovering shared library dependencies..." # Seed: the main binary + all .so files already in lib/