name: Continuous Integration

on:
  push:
    branches: [ master ]
    tags: ['*']
    paths-ignore: ['**.md']
  pull_request:
    branches: [ master ]
    paths-ignore: ['**.md']
  workflow_dispatch:

jobs:
  build:
    name: ${{ matrix.config.name }}
    runs-on: ${{ matrix.config.os }}
    defaults:
      run:
        shell: ${{ matrix.config.shell }}
    strategy:
      fail-fast: false
      matrix:
        config:
          - {
              name: Linux GCC,
              os: ubuntu-latest,
              compiler: gcc,
              shell: bash,
            }
          - {
              name: macOS Clang,
              os: macos-latest,
              compiler: clang,
              shell: bash,
            }
          - {
              name: MSYS2 UCRT64,
              os: windows-latest,
              compiler: gcc,
              shell: 'msys2 {0}',
              msystem: ucrt64,
              msys-env: mingw-w64-ucrt-x86_64,
            }

    steps:
      - name: Install dependencies (Linux)
        if: runner.os == 'Linux'
        run: |
          sudo apt-get update
          sudo apt-get install \
            ninja-build \
            libsdl2-dev \
            libsdl2-net-dev \
            libopenal-dev \
            libsndfile1-dev \
            libfluidsynth-dev \
            libxmp-dev

      - name: Install dependencies (macOS)
        if: runner.os == 'macOS'
        env:
          HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK: 1
        run: |
          brew install \
            ninja \
            sdl2 \
            sdl2_net \
            openal-soft \
            libsndfile \
            fluid-synth \
            libxmp

      - name: Install dependencies (MSYS2)
        if: matrix.config.shell == 'msys2 {0}'
        uses: msys2/setup-msys2@v2
        with:
          msystem: ${{ matrix.config.msystem }}
          update: false
          install: >-
            ${{ matrix.config.msys-env }}-gcc
            ${{ matrix.config.msys-env }}-cmake
            ${{ matrix.config.msys-env }}-ninja
            ${{ matrix.config.msys-env }}-SDL2
            ${{ matrix.config.msys-env }}-SDL2_net
            ${{ matrix.config.msys-env }}-openal
            ${{ matrix.config.msys-env }}-libsndfile
            ${{ matrix.config.msys-env }}-fluidsynth
            ${{ matrix.config.msys-env }}-libxmp

      - uses: actions/checkout@v3

      - name: Configure
        env:
          CC: ${{ matrix.config.compiler }}
        run: |
          cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=Release \
                -DCMAKE_INSTALL_PREFIX=/usr \
                -DENABLE_WERROR=ON -DENABLE_HARDENING=ON -DENABLE_LTO=ON

      - name: Build
        run: cmake --build build

      - name: Install
        run: |
          cd build
          cpack

      - name: Upload AppImage
        if: runner.os == 'Linux'
        uses: actions/upload-artifact@v3
        with:
          name: Woof-AppImage
          path: build/*.appimage

      - name: Extract Version Number
        if: ${{ contains(github.ref, 'tags') && runner.os == 'Linux' }}
        shell: bash
        run: echo "VERSION=${GITHUB_REF##*_}" >> $GITHUB_ENV

      - name: Release
        if: ${{ contains(github.ref, 'tags') && runner.os == 'Linux' }}
        uses: ncipollo/release-action@v1
        with:
          name: Woof! ${{ env.VERSION }}
          bodyFile: CHANGELOG.md
          allowUpdates: true
          artifacts: build/*.appimage

  cppcheck:
    name: Cppcheck
    runs-on: ubuntu-latest

    steps:
      - name: Install dependencies
        run: sudo apt-get update && sudo apt-get install cppcheck

      - uses: actions/checkout@v3

      - name: Run cppcheck
        shell: bash
        run: |
          cppcheck --version ; cppcheck --error-exitcode=1 -j4 -q --force -U_WIN32 -Isrc opl src setup textscreen
