name: build

on:
  push:
    branches:
      - master
      - ci
      - 'release/**'
    paths-ignore:
      - 'DOCS/**'
      - 'TOOLS/lua/**'
  pull_request:
    branches: [master]
    paths-ignore:
      - 'DOCS/**'
      - 'TOOLS/lua/**'

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@v3

      - name: Get time
        id: get_time
        run: echo "timestamp=`date +%s%N`" >> $GITHUB_OUTPUT

      - uses: actions/cache@v3
        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@v3
        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"
    steps:
      - uses: actions/checkout@v3

      - 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: Install dependencies
        run: |
          brew update
          brew install autoconf automake pkg-config libtool python freetype fribidi little-cms2 lua@5.1 libass ffmpeg meson libplacebo

      - name: Build with meson
        id: build
        run: |
          ./ci/build-macos.sh
        env:
          CC: "${{ matrix.cc }}"
          CXX: "${{ matrix.cxx }}"
          TRAVIS_OS_NAME: "${{ matrix.os }}"

      - 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:
    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@v3

      - 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

  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@v3
    - name: Test in FreeBSD VM
      uses: cross-platform-actions/action@v0.19.1
      with:
        operating_system: freebsd
        version: '13.2'
        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@v3
      - uses: msys2/setup-msys2@v2
        with:
          msystem: ${{ matrix.sys }}
          update: true
          install: git
          pacboy: >-
            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: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
