Files
mpv-natives/.github/workflows/build-linux.yml
T
david 248a9a0ecf build: add Linux libmpv.so build and drop the stray headers
Add a native x86_64 Linux build (ci/build-libmpv-linux.sh,
build-linux.yml). Every dependency is static and linked into a single
libmpv.so; only glibc/pthread/dl/m and the system zlib remain external.
The Linux-only additions are the font stack (fontconfig -> expat, where
macOS/Windows use CoreText/DirectWrite) and alsa audio output; gl is the
plain render-API support (no X11/Wayland context, since jlibmpv supplies
the GL context via JOGL).

For consistency, ship a single native per platform and no public headers
(jlibmpv loads the library via JNA and never compiles against it). Remove
the accidental header/import-library copies from the Windows build and the
phantom header copy from the macOS build.
2026-10-01 18:10:21 +02:00

112 lines
3.7 KiB
YAML

name: build-linux
# Builds a single self-contained libmpv.so for Linux (x86_64) from mpv source
# pinned to a release tag. Every dependency is built static and linked into
# the one .so; only glibc/pthread/dl/m and the system zlib stay external, so
# the artifact has no runtime dependency closure to ship (unlike mpv's own
# shared-lib CI build).
#
# Linux is the easiest of the three platforms: a single native build on an
# ubuntu runner, no cross-compile, no lipo. The only Linux-specific work is the
# font stack: libass (a hard mpv dependency) needs fontconfig (-> expat) where
# macOS/Windows use CoreText/DirectWrite.
#
# Pinned to mpv v0.41.0 - the version whose client API (131077) the jlibmpv
# JNA bindings are validated against. Bump the ref here for a libmpv update.
# The build recipe (dependency versions, static flags) lives in
# ci/build-libmpv-linux.sh in this repository.
on:
push:
branches: [main]
workflow_dispatch:
env:
MPV_REF: v0.41.0
TARGET: x86_64-linux
jobs:
build:
runs-on: ubuntu-24.04
env:
CCACHE_BASEDIR: ${{ github.workspace }}
CCACHE_DIR: ${{ github.workspace }}/.ccache
CCACHE_MAXSIZE: 500M
steps:
- name: Check out mpv-natives (build scripts)
uses: actions/checkout@v4
with:
fetch-depth: 1
- name: Check out mpv (pinned tag)
uses: actions/checkout@v4
with:
repository: mpv-player/mpv
ref: ${{ env.MPV_REF }}
path: mpv
fetch-depth: 1
- name: Get time
id: get_time
run: echo "timestamp=$(date +%s%N)" >> $GITHUB_OUTPUT
- name: Restore ccache
uses: actions/cache/restore@v4
with:
path: ${{ env.CCACHE_DIR }}
key: ${{ env.TARGET }}-${{ steps.get_time.outputs.timestamp }}
restore-keys: ${{ env.TARGET }}-
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install --no-install-recommends -y \
ccache nasm ninja-build pkgconf cmake autoconf automake libtool
python3 -m pip install meson
# Run the vendored build script from inside the mpv source tree, so the
# native build writes linux_prefix/ and the meson build next to mpv's
# meson.build and produces the self-contained .so in mpv/artifact/.
- name: Build self-contained libmpv
working-directory: mpv
run: bash "${{ github.workspace }}/ci/build-libmpv-linux.sh"
- name: Print meson log on failure
if: failure()
run: cat mpv/linux_build/meson-logs/meson-log.txt
- name: Collect artifact
run: |
mkdir -p artifact-libmpv
cp -pv mpv/artifact/libmpv.so artifact-libmpv/
echo "=== contents ==="
ls -l artifact-libmpv
- name: Checksums
run: |
cd artifact-libmpv
sha256sum libmpv.so > checksums.txt
cat checksums.txt
- name: Artifact name
id: artifact
run: |
VER=$(cat mpv/MPV_VERSION | tr -d '[:space:]')
echo "name=mpv-natives-linux-x86_64-mpv-$VER" >> "$GITHUB_OUTPUT"
echo "version=$VER" >> "$GITHUB_OUTPUT"
# upload-artifact zips the directory itself, so handing it the folder
# (not a pre-zipped file) yields a single-level archive without the
# double-zip wrapper.
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: ${{ steps.artifact.outputs.name }}
path: artifact-libmpv
- name: Save ccache
uses: actions/cache/save@v4
if: always()
with:
path: ${{ env.CCACHE_DIR }}
key: ${{ env.TARGET }}-${{ steps.get_time.outputs.timestamp }}