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

      - uses: actions/cache@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 autoconf automake pkg-config g++-mingw-w64 gcc-multilib python3-pip ninja-build nasm wine wine32 wine64 ccache
          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 && wine64 ./mpv.com -v --no-config
        env:
          WINEDEBUG: '+loaddll'

      - uses: actions/upload-artifact@v4
        with:
          name: mpv-${{ matrix.target }}
          path: mpv-git-*.zip

  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 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-22.04"
    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-ffmpeg-4-4:
    runs-on: ubuntu-22.04
    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
