build: switch every platform's libmpv supply chain to the unified mpv-build repo
Plezy consumed mpv through four unrelated supply chains: an MPVKit fork via SwiftPM for the Apple platforms, a libmpv-android fork's AAR for Android, an in-CI from-source build for Linux, and an unpinned sourceforge mpv-dev 7z for Windows. All four now consume the same per-commit, content-addressed binaries from https://github.com/edde746/mpv-build, pinned to one commit and built from one set of pinned sources (mpv v0.41.0 on Apple/Android/Windows, ffmpeg n8.0.1, our libass fork). - Apple: the SwiftPM package moves from edde746/MPVKit to edde746/mpv-build across the ios/macos/tvos projects; scripts/set_mpvkit_revision.sh becomes set_native_revision.sh, writes every pin site plus the new repo-root mpv-build.lock.json, and tvos/scripts/wire_mpv.rb derives the package repo from the locks. - Android: the mpv Kotlin API and JNI glue move in-app under android/libmpv (repackaged com.edde746.plezy.libmpv, exports renamed, shrinker rules covered), and the module downloads per-ABI native tarballs (lib/*.so incl. libc++_shared.so + include/) driven entirely by mpv-build.lock.json, with a PLEZY_LOCAL_MPV_DIR escape hatch for locally built artifacts. The fork AAR and its Maven coordinates are gone. - Linux: CI downloads the prebuilt self-relocating libmpv prefix (lock-driven, sha256-verified) instead of compiling mpv/ffmpeg/dav1d/ libplacebo/shaderc from source; linux/packaging/build-libmpv.sh and its test are deleted and native-inputs.json shrinks to the simdutf entry the CMake builds still fetch. - Windows: both arches FetchContent the mpv-build dev zips with URL_HASH enforcement, replacing the checksum-less sourceforge download and its ARM64 7-Zip special case; guard scripts updated. The lock plus the Apple pin sites all point at mpv-build commit d7c3d559, whose manifest was verified asset-by-asset against the published release digests (17/17 match). Verified locally: wire and pin-script suites green, runtime-input checks green, all four Android ABI tarballs downloaded/verified/extracted through the real Gradle tasks, the Windows FetchContent block exercised end to end through cmake, the Linux asset hash and layout checked against the workflow contract, and xcodebuild resolved the flipped SwiftPM graph with SwiftPM validating every binary checksum.
This commit is contained in:
+37
-12
@@ -414,9 +414,7 @@ jobs:
|
||||
- arch: arm64
|
||||
runner: windows-11-arm
|
||||
flutter_setup: git
|
||||
native_cache_path: |
|
||||
build/windows/arm64/_deps
|
||||
build/windows/arm64/mpv-dev-arm64
|
||||
native_cache_path: build/windows/arm64/_deps
|
||||
steps:
|
||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
||||
with:
|
||||
@@ -429,11 +427,6 @@ jobs:
|
||||
path: ${{ matrix.native_cache_path }}
|
||||
key: ${{ env.TRUSTED_BUILD_CACHE_VERSION }}-windows-native-${{ matrix.arch }}-${{ hashFiles('windows/CMakeLists.txt') }}
|
||||
|
||||
- name: Install 7-Zip
|
||||
if: matrix.arch == 'arm64' && steps.windows-native-cache.outputs.cache-hit != 'true'
|
||||
shell: pwsh
|
||||
run: choco install 7zip -y
|
||||
|
||||
- name: Setup Flutter
|
||||
if: matrix.flutter_setup == 'action'
|
||||
uses: subosito/flutter-action@1a449444c387b1966244ae4d4f8c696479add0b2 # v2
|
||||
@@ -725,17 +718,49 @@ jobs:
|
||||
|
||||
exit 1
|
||||
|
||||
- name: Cache libmpv build
|
||||
- name: Cache libmpv prefix
|
||||
id: libmpv-cache
|
||||
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6
|
||||
with:
|
||||
path: libmpv-prefix
|
||||
key: ${{ env.TRUSTED_BUILD_CACHE_VERSION }}-libmpv-${{ runner.arch }}-${{ hashFiles('linux/packaging/build-libmpv.sh', 'linux/packaging/native-inputs.json') }}
|
||||
key: ${{ env.TRUSTED_BUILD_CACHE_VERSION }}-libmpv-${{ runner.arch }}-${{ hashFiles('mpv-build.lock.json') }}
|
||||
|
||||
- name: Build libmpv
|
||||
# The prebuilt prefix from our unified mpv-build repo: the lock names the
|
||||
# asset and the expected SHA-256, so the bytes are verified before a
|
||||
# single one is extracted. The tarball is a self-relocating prefix tree
|
||||
# (lib/ or lib/<triplet>/ with the libmpv.so* chain, lib/libshaderc_shared.so*,
|
||||
# include/, and pkgconfig/ dirs with ${pcfiledir}-relative roots), so the
|
||||
# downstream PKG_CONFIG_PATH, bundle-copy, and find steps are unchanged.
|
||||
- name: Fetch libmpv
|
||||
if: steps.libmpv-cache.outputs.cache-hit != 'true'
|
||||
shell: bash
|
||||
run: bash linux/packaging/build-libmpv.sh
|
||||
run: |
|
||||
command -v zstd >/dev/null 2>&1 || { sudo apt-get update && sudo apt-get install -y --no-install-recommends zstd; }
|
||||
python3 - <<'PY'
|
||||
import hashlib
|
||||
import json
|
||||
import platform
|
||||
import subprocess
|
||||
import tempfile
|
||||
import urllib.request
|
||||
from pathlib import Path
|
||||
|
||||
lock = json.loads(Path("mpv-build.lock.json").read_text(encoding="utf-8"))
|
||||
group = lock["artifacts"]["linux"]
|
||||
entry = group["assets"][platform.machine()]
|
||||
url = f"{group['assetBase']}/{entry['asset']}"
|
||||
print(f"fetching {url}", flush=True)
|
||||
with urllib.request.urlopen(url) as response:
|
||||
data = response.read()
|
||||
digest = hashlib.sha256(data).hexdigest()
|
||||
if digest != entry["checksum"]:
|
||||
raise SystemExit(f"{entry['asset']}: SHA-256 {digest} does not match locked {entry['checksum']}")
|
||||
Path("libmpv-prefix").mkdir(exist_ok=True)
|
||||
with tempfile.NamedTemporaryFile(suffix=".tar.zst") as archive:
|
||||
archive.write(data)
|
||||
archive.flush()
|
||||
subprocess.run(["tar", "--zstd", "-xf", archive.name, "-C", "libmpv-prefix"], check=True)
|
||||
PY
|
||||
|
||||
- name: Install fpm
|
||||
shell: bash
|
||||
|
||||
+43
-19
@@ -252,9 +252,6 @@ jobs:
|
||||
- name: Verify native formatting
|
||||
run: scripts/format_native.sh --check
|
||||
|
||||
- name: Verify Linux native acquisition and build plan
|
||||
run: bash linux/packaging/build-libmpv_test.sh
|
||||
|
||||
linux-native-test:
|
||||
name: Linux native reliability (${{ matrix.sanitizer }})
|
||||
runs-on: ubuntu-latest
|
||||
@@ -645,10 +642,10 @@ jobs:
|
||||
cache: true
|
||||
pub-cache: false
|
||||
|
||||
# The packaging deps, minus libmpv: this job builds it from source below,
|
||||
# because the distro's is a different version with different windowing
|
||||
# backends, and a package smoke-built against it cannot show that
|
||||
# build-libmpv.sh still works or that the bundle it produces is coherent.
|
||||
# The packaging deps, minus libmpv: that arrives prebuilt from mpv-build
|
||||
# below. The dev packages still matter — they install the runtime
|
||||
# libraries the pinned libmpv links (ass, pulse, pipewire, ...), which
|
||||
# bundle-libs.sh resolves off the host into the bundle.
|
||||
- name: Install packaging dependencies
|
||||
run: |
|
||||
sudo apt-get update
|
||||
@@ -662,25 +659,52 @@ jobs:
|
||||
liblua5.2-dev rpm libarchive-tools imagemagick ruby-dev build-essential
|
||||
sudo gem install fpm --version 1.17.0 --no-document
|
||||
|
||||
# Keyed the same way build.yml keys it, so editing the script or its pinned
|
||||
# inputs is what invalidates the cache - and this branch's whole point is
|
||||
# that those edits get exercised somewhere.
|
||||
- name: Cache libmpv build
|
||||
# Keyed the same way build.yml keys it: the lock names the asset and its
|
||||
# checksum, so editing the lock is what invalidates the cache.
|
||||
- name: Cache libmpv prefix
|
||||
id: libmpv-cache
|
||||
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6
|
||||
with:
|
||||
path: libmpv-prefix
|
||||
key: ci-libmpv-${{ runner.arch }}-${{ hashFiles('linux/packaging/build-libmpv.sh', 'linux/packaging/native-inputs.json') }}
|
||||
key: ci-libmpv-${{ runner.arch }}-${{ hashFiles('mpv-build.lock.json') }}
|
||||
|
||||
- name: Build libmpv
|
||||
# Same contract as build.yml: read mpv-build.lock.json, download the
|
||||
# linux asset for this arch, verify its SHA-256, extract the prefix tree.
|
||||
- name: Fetch libmpv
|
||||
if: steps.libmpv-cache.outputs.cache-hit != 'true'
|
||||
run: bash linux/packaging/build-libmpv.sh
|
||||
run: |
|
||||
command -v zstd >/dev/null 2>&1 || { sudo apt-get update && sudo apt-get install -y --no-install-recommends zstd; }
|
||||
python3 - <<'PY'
|
||||
import hashlib
|
||||
import json
|
||||
import platform
|
||||
import subprocess
|
||||
import tempfile
|
||||
import urllib.request
|
||||
from pathlib import Path
|
||||
|
||||
# The windowing backends the runner depends on, read off the library the
|
||||
# script just produced. The plane hands mpv MPV_RENDER_PARAM_WL_DISPLAY, so
|
||||
# a libmpv without Wayland cannot find the VAAPI device and quietly decodes
|
||||
# in software; X11 and VDPAU are gone with the texture path.
|
||||
- name: Check the built libmpv's backends
|
||||
lock = json.loads(Path("mpv-build.lock.json").read_text(encoding="utf-8"))
|
||||
group = lock["artifacts"]["linux"]
|
||||
entry = group["assets"][platform.machine()]
|
||||
url = f"{group['assetBase']}/{entry['asset']}"
|
||||
print(f"fetching {url}", flush=True)
|
||||
with urllib.request.urlopen(url) as response:
|
||||
data = response.read()
|
||||
digest = hashlib.sha256(data).hexdigest()
|
||||
if digest != entry["checksum"]:
|
||||
raise SystemExit(f"{entry['asset']}: SHA-256 {digest} does not match locked {entry['checksum']}")
|
||||
Path("libmpv-prefix").mkdir(exist_ok=True)
|
||||
with tempfile.NamedTemporaryFile(suffix=".tar.zst") as archive:
|
||||
archive.write(data)
|
||||
archive.flush()
|
||||
subprocess.run(["tar", "--zstd", "-xf", archive.name, "-C", "libmpv-prefix"], check=True)
|
||||
PY
|
||||
|
||||
# The windowing backends the runner depends on, read off the pinned
|
||||
# library just extracted. The plane hands mpv MPV_RENDER_PARAM_WL_DISPLAY,
|
||||
# so a libmpv without Wayland cannot find the VAAPI device and quietly
|
||||
# decodes in software; X11 and VDPAU are gone with the texture path.
|
||||
- name: Check the pinned libmpv's backends
|
||||
run: |
|
||||
LIB=$(find libmpv-prefix -name 'libmpv.so.2' | head -1)
|
||||
echo "== $LIB =="
|
||||
|
||||
Reference in New Issue
Block a user