name: build
on: [push, pull_request]
jobs:
  build:
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os: [windows-latest, macos-latest, ubuntu-latest]
        build_type: [RelWithDebInfo, Debug]
        ui: [gui, cli]
        scripting: [lua, noscripts]
        exclude:
          - build_type: Debug
            ui: gui
          - build_type: RelWithDebInfo
            ui: cli
          - build_type: RelWithDebInfo
            scripting: noscripts
    steps:
    - uses: actions/checkout@v4
      with:
        submodules: 'recursive'
    - name: Install Dependencies
      if: runner.os == 'Linux'
      shell: bash
      run: |
        sudo apt-get update -qq
        sudo apt-get install -y \
          libpixman-1-dev libfreetype6-dev libharfbuzz-dev zlib1g-dev \
          libx11-dev libxcursor-dev libxi-dev libgl1-mesa-dev libfontconfig1-dev
    - name: Install Skia
      if: ${{ matrix.ui == 'gui' }}
      shell: bash
      run: |
        if [[ "${{ runner.os }}" == "Windows" ]] ; then
          choco install wget -y --no-progress
          wget https://github.com/aseprite/skia/releases/download/m102-861e4743af/Skia-Windows-Release-x64.zip
          unzip Skia-Windows-Release-x64.zip -d skia
        elif [[ "${{ runner.os }}" == "macOS" ]] ; then
          wget https://github.com/aseprite/skia/releases/download/m102-861e4743af/Skia-macOS-Release-arm64.zip
          unzip Skia-macOS-Release-arm64.zip -d skia
        else
          wget https://github.com/aseprite/skia/releases/download/m102-861e4743af/Skia-Linux-Release-x64-libstdc++.zip
          unzip Skia-Linux-Release-x64-libstdc++.zip -d skia
        fi
    - name: ccache
      uses: hendrikmuhs/ccache-action@v1
      if: ${{ runner.os == 'Linux' || runner.os == 'macOS' }}
      with:
        key: ${{ matrix.os }}-${{ matrix.ui }}-${{ matrix.scripting }}-${{ matrix.build_type }}
    - uses: aseprite/get-ninja@main
    - uses: ilammy/msvc-dev-cmd@v1
      if: runner.os == 'Windows'
    - name: Generating Makefiles
      shell: bash
      run: |
        if [[ "${{ runner.os }}" == "Windows" ]] ; then
          export enable_ccache=off
        else
          export enable_ccache=on
        fi

        if [[ "${{ matrix.ui }}" == "gui" ]] ; then
          export laf_backend=skia
        else
          export laf_backend=none
        fi

        if [[ "${{ matrix.scripting }}" == "lua" ]] ; then
          export enable_scripting=on
        else
          export enable_scripting=off
        fi

        if [[ "${{ runner.os }}" == "macOS" ]] ; then
          export skia_arch=arm64
        else
          export skia_arch=x64
        fi

        cmake -S . -B build -G Ninja \
          -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} \
          -DCMAKE_OSX_DEPLOYMENT_TARGET=10.9 \
          -DENABLE_TESTS=ON \
          -DENABLE_SCRIPTING=$enable_scripting \
          -DENABLE_CCACHE=$enable_ccache \
          -DLAF_BACKEND=$laf_backend \
          -DSKIA_DIR=skia \
          -DSKIA_LIBRARY_DIR=skia/out/Release-$skia_arch
    - name: Compiling
      shell: bash
      run: |
        cd build && ninja
    - name: Running C++ Tests
      shell: bash
      run: |
        if [[ "${{ runner.os }}" == "Linux" ]] ; then
          export XVFB=xvfb-run
        fi
        cd build && $XVFB ctest --output-on-failure
    - name: Running CLI Tests
      if: ${{ matrix.scripting == 'lua' }}
      shell: bash
      run: |
        if [[ "${{ runner.os }}" == "Linux" ]] ; then
          export XVFB=xvfb-run
        fi
        export ASEPRITE=$PWD/build/bin/aseprite
        cd tests
        $XVFB bash run-tests.sh
