name: CMake (Windows)

on:

  push:
    paths:
      - src/**
      - cmake/**
      - "**/CMakeLists.txt"
      - "CMakePresets.json"
      - "!.github/workflows/**"
      - .github/workflows/cmake_windows_msys2.yml
      - vcpkg.json
      - "!**/Makefile*"

  pull_request:
    paths:
      - src/**
      - cmake/**
      - "**/CMakeLists.txt"
      - "CMakePresets.json"
      - "!.github/workflows/**"
      - .github/workflows/cmake_windows_msys2.yml
      - vcpkg.json
      - "!**/Makefile*"

jobs:

  windows:

    name: "${{ matrix.ui.name }}, ${{ matrix.build.name }}, ${{ matrix.dynarec.name }}, ${{ matrix.environment.msystem }}"

    runs-on: ${{ matrix.environment.runner }}

    defaults:
      run:
        shell: msys2 {0}

    strategy:
      fail-fast: true
      matrix:
        build:
#          - name: Regular
#            preset: regular
          - name: Debug
            preset: dev_debug
            slug: -Debug
          - name: Dev
            preset: development
            slug: -Dev
        dynarec:
          - name: ODR
            new: off
            slug: -ODR
          - name: NDR
            new: on
            slug: -NDR
        ui:
          - name: Qt 5 GUI
            qt: on
            slug: -Qt5
            static: on
            packages: >-
              qt5-static:p
              vulkan-headers:p
#              qt5-base:p
#              qt5-tools:p
        environment:
#          - msystem: MSYS
#            toolchain: ./cmake/flags-gcc-x86_64.cmake
#            slug: "-MSYS64"
          - msystem: MINGW64
            prefix: mingw-w64-x86_64
            toolchain: ./cmake/flags-gcc-x86_64.cmake
            slug: "-64"
            runner: windows-2022
#          - msystem: CLANG64
#            prefix: mingw-w64-clang-x86_64
#            toolchain: ./cmake/llvm-win32-x86_64.cmake
#            slug: "CLANG64"
#            runner: windows-2022
#          - msystem: UCRT64
#            prefix: mingw-w64-ucrt-x86_64
#            toolchain: ./cmake/flags-gcc-x86_64.cmake
#            slug: "UCRT64"
#            runner: windows-2022
          - msystem: CLANGARM64
            toolchain: ./cmake/flags-gcc-aarch64.cmake
            slug: -arm64
            runner: windows-11-arm
        exclude:
          - dynarec:
              new: off
            environment:
              msystem: CLANGARM64

    steps:
      - name: Prepare MSYS2 environment
        uses: msys2/setup-msys2@v2
        with:
          release: true
          update: true
          msystem: ${{ matrix.environment.msystem }}
          pacboy: >-
            ninja:p
            cmake:p
            gcc:p
            pkgconf:p
            freetype:p
            SDL2:p
            zlib:p
            libpng:p
            openal:p
            rtmidi:p
            libslirp:p
            fluidsynth:p
            libserialport:p
            ${{ matrix.ui.packages }}
            openmp:p

      - name: Checkout repository
        uses: actions/checkout@v4
        with:
          fetch-depth: 0  # Shallow clones should be disabled for a better relevancy of analysis

      - name: Configure CMake
        run: >-
          cmake -S . -B build --preset ${{ matrix.build.preset }}
          --toolchain ${{ matrix.environment.toolchain }}
          -D NEW_DYNAREC=${{ matrix.dynarec.new }}
          -D QT=${{ matrix.ui.qt }}

      - name: Build
        run: cmake --build build

      - name: Generate package
        run: cmake --install build

      - name: Upload artifact
        uses: actions/upload-artifact@v4
        with:
          name: '86Box${{ matrix.dynarec.slug }}${{ matrix.build.slug }}-Windows${{ matrix.environment.slug }}-gha${{ github.run_number }}'
          path: build/artifacts/**
