summaryrefslogtreecommitdiffstats
path: root/.github/workflows
diff options
context:
space:
mode:
Diffstat (limited to '.github/workflows')
-rw-r--r--.github/workflows/build.yml543
-rw-r--r--.github/workflows/cleanup_caches.yml40
-rw-r--r--.github/workflows/comment.yml46
-rw-r--r--.github/workflows/docs.yml26
-rw-r--r--.github/workflows/lint.yml35
5 files changed, 690 insertions, 0 deletions
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
new file mode 100644
index 0000000000..763655cf34
--- /dev/null
+++ b/.github/workflows/build.yml
@@ -0,0 +1,543 @@
+name: build
+
+on:
+ push:
+ branches:
+ - master
+ - ci
+ - 'release/**'
+ paths-ignore:
+ - 'DOCS/**'
+ - 'TOOLS/lua/**'
+ - '.editorconfig'
+ - '.gitignore'
+ - 'Copyright'
+ - 'README.md'
+ - 'RELEASE_NOTES'
+ pull_request:
+ branches: [master]
+ paths-ignore:
+ - 'DOCS/**'
+ - 'TOOLS/lua/**'
+ - '.editorconfig'
+ - '.gitignore'
+ - 'Copyright'
+ - 'README.md'
+ - 'RELEASE_NOTES'
+
+jobs:
+ mingw:
+ runs-on: ubuntu-22.04
+ env:
+ CCACHE_BASEDIR: ${{ github.workspace }}
+ CCACHE_DIR: ${{ github.workspace }}/.ccache
+ CCACHE_MAXSIZE: 500M
+ strategy:
+ fail-fast: false
+ matrix:
+ target: [i686-w64-mingw32, x86_64-w64-mingw32]
+ steps:
+ - uses: actions/checkout@v4
+
+ - name: Get time
+ id: get_time
+ run: echo "timestamp=`date +%s%N`" >> $GITHUB_OUTPUT
+
+ - name: Restore cache
+ uses: actions/cache/restore@v4
+ with:
+ path: ${{ env.CCACHE_DIR }}
+ key: ${{ matrix.target }}-${{ steps.get_time.outputs.timestamp }}
+ restore-keys: ${{ matrix.target }}-
+
+ - name: Install dependencies
+ run: |
+ sudo dpkg --add-architecture i386
+ sudo apt-get update
+ sudo apt-get install -y ccache g++-mingw-w64 gcc-multilib nasm ninja-build pkg-config python3-pip wine
+ sudo python3 -m pip install meson
+
+ - name: Build libraries
+ run: |
+ ./ci/build-mingw64.sh
+ env:
+ TARGET: ${{ matrix.target }}
+
+ - name: Build with meson
+ id: build
+ run: |
+ ./ci/build-mingw64.sh meson pack
+ env:
+ TARGET: ${{ matrix.target }}
+
+ - name: Print meson log
+ if: ${{ failure() && steps.build.outcome == 'failure' }}
+ run: |
+ cat ./build/meson-logs/meson-log.txt
+
+ - name: Functional test
+ id: tests
+ run: |
+ cd artifact && wine ./mpv.com -v --no-config
+ env:
+ WINEDEBUG: '+loaddll'
+
+ - uses: actions/upload-artifact@v4
+ with:
+ name: mpv-${{ matrix.target }}
+ path: mpv-git-*.zip
+
+ - name: Save Cache
+ uses: actions/cache/save@v4
+ if: always()
+ with:
+ path: ${{ env.CCACHE_DIR }}
+ key: ${{ matrix.target }}-${{ steps.get_time.outputs.timestamp }}
+
+ win32:
+ runs-on: windows-latest
+ env:
+ VS: "C:\\Program Files\\Microsoft Visual Studio\\2022\\Enterprise"
+ CC: "ccache clang"
+ CXX: "ccache clang++"
+ CC_LD: "lld"
+ CXX_LD: "lld"
+ WINDRES: "llvm-rc"
+ CCACHE_BASEDIR: ${{ github.workspace }}
+ CCACHE_DIR: "${{ github.workspace }}\\.ccache"
+ CCACHE_MAXSIZE: 500M
+ steps:
+ - name: Disable autocrlf
+ run: |
+ git config --global core.autocrlf false
+ git config --global core.eol lf
+
+ - uses: actions/checkout@v4
+
+ - name: Get time
+ id: get_time
+ run: |
+ "timestamp=$((Get-Date).Ticks)" >> $env:GITHUB_OUTPUT
+
+ - name: Restore cache
+ uses: actions/cache/restore@v4
+ with:
+ path: ${{ env.CCACHE_DIR }}
+ key: x86_64-windows-msvc-${{ steps.get_time.outputs.timestamp }}
+ restore-keys: x86_64-windows-msvc-
+
+ # https://github.com/mesonbuild/meson/pull/11715
+ - name: Install dependencies
+ run: |
+ git clone https://github.com/kasper93/meson --depth 1 -b 8981
+ python -m pip install build wheel
+ python -m build --wheel --no-isolation meson
+ python -m pip install (Get-Item ./meson/dist/meson-*-py3-none-any.whl).FullName
+ choco install ccache
+
+ - name: Update Meson WrapDB
+ run: |
+ meson wrap update-db
+ # Explicitly download wraps, as nested projects may have older versions of them.
+ meson wrap install expat
+ meson wrap install harfbuzz
+ meson wrap install libpng
+ meson wrap install zlib
+
+ - name: Build
+ id: build
+ run: |
+ $env:PATH = ($env:PATH -split ';' | Where-Object { $_ -ne 'C:\Program Files\LLVM\bin' -and `
+ $_ -ne 'C:\Strawberry\c\bin' }) -join ';'
+ Import-Module "$env:VS\Common7\Tools\Microsoft.VisualStudio.DevShell.dll"
+ Enter-VsDevShell -VsInstallPath $env:VS -SkipAutomaticLocation -DevCmdArguments "-arch=x64 -host_arch=x64"
+ ./ci/build-win32.ps1
+
+ - name: Print build log
+ if: ${{ failure() && steps.build.outcome == 'failure' }}
+ run: |
+ cat ./build/meson-logs/meson-log.txt
+
+ - name: Run meson tests
+ id: tests
+ run: |
+ $env:PATH = ($env:PATH -split ';' | Where-Object { $_ -ne 'C:\Program Files\LLVM\bin' -and `
+ $_ -ne 'C:\Strawberry\c\bin' }) -join ';'
+ Import-Module "$env:VS\Common7\Tools\Microsoft.VisualStudio.DevShell.dll"
+ Enter-VsDevShell -VsInstallPath $env:VS -SkipAutomaticLocation -DevCmdArguments "-arch=x64 -host_arch=x64"
+ meson test -C build mpv:
+
+ - name: Print meson test log
+ if: ${{ failure() && steps.tests.outcome == 'failure' }}
+ run: |
+ cat ./build/meson-logs/testlog.txt
+
+ - uses: actions/upload-artifact@v4
+ with:
+ name: mpv-x86_64-windows-msvc
+ path: |
+ build/mpv.???
+ build/vulkan-*.dll
+ !build/mpv.lib
+
+ - name: Save Cache
+ uses: actions/cache/save@v4
+ if: always()
+ with:
+ path: ${{ env.CCACHE_DIR }}
+ key: x86_64-windows-msvc-${{ steps.get_time.outputs.timestamp }}
+
+ macos:
+ runs-on: ${{ matrix.os }}
+ strategy:
+ matrix:
+ cc:
+ - "clang"
+ cxx:
+ - "clang++"
+ os:
+ - "macos-12"
+ - "macos-13"
+ - "macos-14"
+ include:
+ - os: "macos-12"
+ arch: "intel"
+ - os: "macos-13"
+ arch: "intel"
+ - os: "macos-14"
+ arch: "arm"
+ xcode: "Xcode_15.2"
+ steps:
+ - uses: actions/checkout@v4
+
+ - name: Remove stray upstream python binary symlinks under /usr/local
+ run: |
+ find /usr/local/bin -lname '*/Library/Frameworks/Python.framework/*' -delete -print
+ brew unlink python && brew link --overwrite python
+
+ - name: Change Xcode version
+ if: ${{ matrix.xcode != '' }}
+ run: |
+ sudo xcode-select -s /Applications/${{ matrix.xcode }}.app
+
+ - name: Install dependencies
+ run: |
+ brew update
+ brew install -q autoconf automake pkg-config libtool python freetype fribidi little-cms2 \
+ luajit libass ffmpeg meson uchardet mujs libplacebo molten-vk vulkan-loader vulkan-headers
+
+ - name: Build with meson
+ id: build
+ run: |
+ ./ci/build-macos.sh
+ env:
+ CC: "${{ matrix.cc }}"
+ CXX: "${{ matrix.cxx }}"
+ TRAVIS_OS_NAME: "${{ matrix.os }}"
+
+ - name: Create App Bundle
+ run: |
+ meson compile -C build macos-bundle
+ tar -czvf mpv.tar.gz -C build mpv.app
+
+ - name: Print meson log
+ if: ${{ failure() && steps.build.outcome == 'failure' }}
+ run: |
+ cat ./build/meson-logs/meson-log.txt
+
+ - name: Run meson tests
+ id: tests
+ run: |
+ meson test -C build
+
+ - name: Print meson test log
+ if: ${{ failure() && steps.tests.outcome == 'failure' }}
+ run: |
+ cat ./build/meson-logs/testlog.txt
+
+ - uses: actions/upload-artifact@v4
+ with:
+ name: mpv-${{ matrix.os }}-${{ matrix.arch }}
+ path: mpv.tar.gz
+
+ linux:
+ runs-on: ubuntu-latest
+ container:
+ image: "registry.opensuse.org/home/mia/images/images/mpv-ci:stable-deps"
+ env:
+ CC: "${{ matrix.config.cc }}"
+ CXX: "${{ matrix.config.cxx }}"
+ strategy:
+ matrix:
+ config:
+ - {
+ cc: "gcc",
+ cxx: "g++",
+ }
+ - {
+ cc: "clang",
+ cxx: "clang++",
+ }
+ steps:
+ - uses: actions/checkout@v4
+
+ - name: Install dependencies
+ run: |
+ # workaround to avoid "fatal: unsafe repository" error
+ git config --global --add safe.directory "$GITHUB_WORKSPACE"
+
+ - name: Build with meson
+ id: build
+ run: |
+ ./ci/build-tumbleweed.sh
+
+ - name: Print meson log
+ if: ${{ failure() && steps.build.outcome == 'failure' }}
+ run: |
+ cat ./build/meson-logs/meson-log.txt
+
+ - name: Run meson tests
+ id: tests
+ run: |
+ meson test -C build
+
+ - name: Print meson test log
+ if: ${{ failure() && steps.tests.outcome == 'failure' }}
+ run: |
+ cat ./build/meson-logs/testlog.txt
+
+ linux-fuzz:
+ runs-on: ubuntu-latest
+ container:
+ image: "registry.opensuse.org/home/mia/images/images/mpv-ci:stable-deps"
+ env:
+ CC: "clang"
+ CXX: "clang++"
+ steps:
+ - uses: actions/checkout@v4
+
+ - name: Build with meson
+ id: build
+ run: |
+ meson setup build \
+ --werror \
+ -Dc_args="-Wno-error=deprecated -Wno-error=deprecated-declarations" \
+ -Dfuzzers=true -Dlibmpv=true -Dcplayer=false
+ meson compile -C build
+
+ - name: Print meson log
+ if: ${{ failure() && steps.build.outcome == 'failure' }}
+ run: |
+ cat ./build/meson-logs/meson-log.txt
+
+ linux-ffmpeg-4-4:
+ runs-on: ubuntu-latest
+ container:
+ # We want to test ffmpeg 4.4 which alpine 3.15 has exactly.
+ # Furthermore, this is a very minimal build of mpv without commonly
+ # used features to test build compatibility. Musl is a nice bonus as well
+ image: alpine:3.15
+ steps:
+ - uses: actions/checkout@v4
+ - name: Install dependencies
+ run: |
+ apk update
+ apk add \
+ binutils \
+ ffmpeg-dev \
+ gcc \
+ git \
+ g++ \
+ libass-dev \
+ lua5.2-dev \
+ pulseaudio-dev \
+ libx11-dev \
+ libxfixes-dev \
+ libxkbcommon-dev \
+ libxrandr-dev \
+ libxpresent-dev \
+ libxscrnsaver-dev \
+ musl-dev \
+ py3-pip \
+ samurai
+ pip install meson
+
+ - name: Build with meson
+ id: build
+ run: |
+ ./ci/build-linux-old.sh
+
+ - name: Print meson log
+ if: ${{ failure() && steps.build.outcome == 'failure' }}
+ run: |
+ cat ./build/meson-logs/meson-log.txt
+
+ - name: Run meson tests
+ id: tests
+ run: |
+ meson test -C build
+
+ - name: Print meson test log
+ if: ${{ failure() && steps.tests.outcome == 'failure' }}
+ run: |
+ cat ./build/meson-logs/testlog.txt
+
+ openbsd:
+ runs-on: ubuntu-latest # until https://github.com/actions/runner/issues/385
+ timeout-minutes: 30 # avoid any weirdness with the VM
+ steps:
+ - uses: actions/checkout@v4
+ - name: Test in OpenBSD VM
+ uses: cross-platform-actions/action@v0.23.0
+ with:
+ operating_system: openbsd
+ version: '7.4'
+ run: |
+ sudo pkg_add -U \
+ cmake \
+ ffmpeg \
+ git \
+ libarchive \
+ libbluray \
+ libcaca \
+ libcdio-paranoia \
+ libdvdnav \
+ libiconv \
+ libv4l \
+ libxkbcommon \
+ luajit \
+ meson \
+ openal \
+ pkgconf \
+ pulseaudio \
+ python3 \
+ rubberband \
+ sdl2 \
+ shaderc \
+ spirv-cross \
+ spirv-headers \
+ uchardet \
+ vulkan-loader \
+ vulkan-headers \
+ zimg
+ ./ci/build-openbsd.sh
+ meson test -C build
+
+ freebsd:
+ runs-on: ubuntu-latest # until https://github.com/actions/runner/issues/385
+ timeout-minutes: 30 # avoid any weirdness with the VM
+ steps:
+ - uses: actions/checkout@v4
+ - name: Test in FreeBSD VM
+ uses: cross-platform-actions/action@v0.23.0
+ with:
+ operating_system: freebsd
+ version: '14.0'
+ run: |
+ sudo pkg update
+ sudo pkg install -y \
+ alsa-lib \
+ cmake \
+ evdev-proto \
+ ffmpeg \
+ git \
+ iconv \
+ jackit \
+ libarchive \
+ libbluray \
+ libcaca \
+ libcdio-paranoia \
+ libdvdnav \
+ libplacebo \
+ libXinerama \
+ libxkbcommon \
+ libxpresent \
+ libXv \
+ luajit \
+ meson \
+ mujs \
+ openal-soft \
+ pipewire \
+ pkgconf \
+ pulseaudio \
+ python3 \
+ rubberband \
+ sekrit-twc-zimg \
+ sdl2 \
+ sndio \
+ uchardet \
+ v4l_compat \
+ vulkan-headers \
+ wayland-protocols
+ ./ci/build-freebsd.sh
+ meson test -C build
+
+ msys2:
+ runs-on: windows-latest
+ strategy:
+ fail-fast: false
+ matrix:
+ sys:
+ - clang64
+ - mingw64
+ - ucrt64
+ defaults:
+ run:
+ shell: msys2 {0}
+ steps:
+ - name: Disable autocrlf
+ shell: pwsh
+ run: |
+ git config --global core.autocrlf false
+ git config --global core.eol lf
+ - uses: actions/checkout@v4
+ - uses: msys2/setup-msys2@v2
+ with:
+ msystem: ${{ matrix.sys }}
+ update: true
+ install: git
+ pacboy: >-
+ angleproject:p
+ ca-certificates:p
+ cc:p
+ diffutils:p
+ ffmpeg:p
+ lcms2:p
+ libarchive:p
+ libass:p
+ libcdio-paranoia:p
+ libdvdnav:p
+ libjpeg-turbo:p
+ libplacebo:p
+ lua51:p
+ meson:p
+ ninja:p
+ pkgconf:p
+ python:p
+ rst2pdf:p
+ rubberband:p
+ shaderc:p
+ spirv-cross:p
+ uchardet:p
+ vapoursynth:p
+ vulkan-devel:p
+
+ - name: Build with meson
+ id: build
+ run: |
+ ./ci/build-msys2.sh meson
+
+ - name: Print meson log
+ if: ${{ failure() && steps.build.outcome == 'failure' }}
+ run: |
+ cat ./build/meson-logs/meson-log.txt
+
+ - name: Run meson tests
+ id: tests
+ run: |
+ meson test -C build
+
+ - name: Print meson test log
+ if: ${{ failure() && steps.tests.outcome == 'failure' }}
+ run: |
+ cat ./build/meson-logs/testlog.txt
diff --git a/.github/workflows/cleanup_caches.yml b/.github/workflows/cleanup_caches.yml
new file mode 100644
index 0000000000..b839cea15f
--- /dev/null
+++ b/.github/workflows/cleanup_caches.yml
@@ -0,0 +1,40 @@
+name: Cleanup caches
+
+on:
+ workflow_run:
+ workflows: [build]
+ types: [completed]
+
+jobs:
+ cache:
+ runs-on: ubuntu-latest
+ steps:
+ - run: |
+ gh cache list -L 100 --json id,key,ref -S last_accessed_at -O desc --jq '
+ map(select(.key | startswith("x86_64-w64-mingw32-") or
+ startswith("i686-w64-mingw32-") or
+ startswith("x86_64-windows-msvc-"))) |
+ group_by(.ref) |
+ map({
+ ref: .[0].ref,
+ caches: map({
+ key: .key,
+ prefix: (.key | capture("^(?<prefix>[\\w_-]+-)\\d+$").prefix)
+ }) | group_by(.prefix) | map({keys: map(.key)})
+ }) |
+ .[]
+ ' |
+ while read -r group; do
+ pr=$(echo "$group" | jq -r '.ref | capture("refs/pull/(?<num>[0-9]+)/merge").num')
+ if [[ -n "$pr" ]] && [ "$(gh pr view $pr --json state --jq '.state')" != "OPEN" ]; then
+ keys=$(echo "$group" | jq -c '.caches | map(.keys) | .[]')
+ else
+ keys=$(echo "$group" | jq -c '.caches | map(.keys[1:]) | .[]')
+ fi
+ for key in $(echo "$keys" | jq -r '.[]'); do
+ gh cache delete "$key"
+ done
+ done
+ env:
+ GH_REPO: ${{ github.repository }}
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.github/workflows/comment.yml b/.github/workflows/comment.yml
new file mode 100644
index 0000000000..4038ff8de1
--- /dev/null
+++ b/.github/workflows/comment.yml
@@ -0,0 +1,46 @@
+name: comment
+
+on:
+ workflow_run:
+ workflows: [build]
+ types: [completed]
+
+jobs:
+ pr_comment:
+ if: github.event.workflow_run.event == 'pull_request' &&
+ github.event.workflow_run.conclusion == 'success'
+ runs-on: ubuntu-latest
+ steps:
+ - env:
+ GH_REPO: ${{ github.repository }}
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ run: |
+ pr=$(gh pr list --state open --json headRefOid,number \
+ --jq '.[] | select(.headRefOid == "${{ github.event.workflow_run.head_sha }}") | .number')
+ if [ -z "$pr" ]; then
+ echo "No matching pull request found"
+ exit 1
+ fi
+
+ artifacts=$(gh api repos/{owner}/{repo}/actions/runs/${{ github.event.workflow_run.id }}/artifacts --jq '.artifacts')
+ if [ "$(echo "$artifacts" | jq 'length')" -eq 0 ]; then
+ echo "No artifacts found"
+ exit 0
+ fi
+
+ body=$(echo "$artifacts" | jq -r '
+ def link: "https://nightly.link/${{ github.repository }}/actions/artifacts/\(.id).zip";
+ def entry: "* [\(.name)](\(link))";
+ "Download the artifacts for this pull request:\n<details><summary>Windows</summary>\n\n" +
+ (sort_by(.name) | map(select(.name | test("w64|msvc")) | entry) | join("\n")) +
+ "\n</details>\n<details><summary>macOS</summary>\n\n" +
+ (sort_by(.name) | map(select(.name | test("macos")) | entry) | join("\n")) +
+ "\n</details>"
+ ')
+
+ comment_id=$(gh issue view $pr --json comments \
+ --jq '.comments[] | select(.author.login == "github-actions") | .id')
+ if [ -n "$comment_id" ]; then
+ edit=--edit-last
+ fi
+ gh pr comment $pr --body "$body" $edit
diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml
new file mode 100644
index 0000000000..3936769854
--- /dev/null
+++ b/.github/workflows/docs.yml
@@ -0,0 +1,26 @@
+name: docs
+
+on:
+ push:
+ branches:
+ - master
+ - ci
+ - 'release/**'
+ paths:
+ - 'DOCS/**'
+ pull_request:
+ branches: [master]
+ paths:
+ - 'DOCS/**'
+
+jobs:
+ check-docs:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - name: Docs
+ run: |
+ sudo apt-get install python3-docutils rst2pdf
+ ./TOOLS/docutils-wrapper.py rst2man --strip-elements-with-class=contents --halt=2 ./DOCS/man/mpv.rst mpv.1
+ ./TOOLS/docutils-wrapper.py rst2html --halt=2 ./DOCS/man/mpv.rst mpv.html
+ ./TOOLS/docutils-wrapper.py rst2pdf -c -b 1 --repeat-table-rows ./DOCS/man/mpv.rst -o mpv.pdf
diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
new file mode 100644
index 0000000000..425e8d1a07
--- /dev/null
+++ b/.github/workflows/lint.yml
@@ -0,0 +1,35 @@
+name: lint
+
+on:
+ push:
+ branches:
+ - master
+ - ci
+ - 'release/**'
+ pull_request:
+ branches: [master]
+
+jobs:
+ commit-msg:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ fetch-depth: 50
+
+ - name: Lint
+ run: |
+ ./ci/lint-commit-msg.py
+
+ swift-lint:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+
+ - uses: norio-nomura/action-swiftlint@3.2.1
+
+ lua-lint:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - uses: lunarmodules/luacheck@v1