name: CMake (Windows, vcpkg/LLVM)

on:

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

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

jobs:

  llvm-windows:
    name: "${{ matrix.ui.name }}, ${{ matrix.build.name }}, ${{ matrix.dynarec.name }}, ${{ matrix.target.name }}"
    if: 0

    runs-on: windows-2022

    env:
      BUILD_WRAPPER_OUT_DIR: build_wrapper_output_directory # Directory where build-wrapper output will be placed
      VCPKG_BINARY_SOURCES: 'clear;nuget,GitHub,readwrite'

    strategy:
      fail-fast: true
      matrix:
        build:
#          - name: Regular
#            preset: regular
          - name: Debug
            preset: debug
            slug: -Debug
          - name: Dev
            preset: experimental
            slug: -Dev
        dynarec:
          - name: ODR
            new: off
            slug: -ODR
          - name: NDR
            new: on
            slug: -NDR
        ui:
          - name: Win32 GUI
            qt: off
          - name: Qt GUI
            qt: on
            slug: -Qt
        target:
          - name: x86
            triplet: x86-windows-static
            toolchain: ./cmake/llvm-win32-i686.cmake
            vcvars: x64_x86
          - name: x64
            triplet: x64-windows-static
            toolchain: ./cmake/llvm-win32-x86_64.cmake
            vcvars: x64
#          - name: ARM
#            triplet: arm-windows-static
#            toolchain: ./cmake/llvm-win32-arm.cmake
#            vcvars: x64_arm
          - name: ARM64
            triplet: arm64-windows-static
            toolchain: ./cmake/llvm-win32-aarch64.cmake
            vcvars: x64_arm64
        exclude:
          - dynarec: 
              new: off
            target:
              name: ARM64

    steps:
      - name: Prepare VS environment
        uses: ilammy/msvc-dev-cmd@v1
        with:
          arch: ${{ matrix.target.vcvars }}

      - name: Add LLVM to path
        run: echo "C:/Program Files/LLVM/bin" >> $env:GITHUB_PATH

      - name: Download Ninja
        run: >
          Invoke-WebRequest https://github.com/ninja-build/ninja/releases/download/v1.11.1/ninja-win.zip -OutFile ninja-win.zip && 
          Expand-Archive ninja-win.zip -DestinationPath .

      - name: Setup NuGet Credentials
        run: >
          & (C:/vcpkg/vcpkg --vcpkg-root "${{ env.VCPKG_ROOT }}" fetch nuget | tail -n 2)
          sources add
          -source "https://nuget.pkg.github.com/86Box/index.json"
          -storepasswordincleartext
          -name "GitHub"
          -username "86Box"
          -password "${{ secrets.GITHUB_TOKEN }}"

      - name: Fix MSVC atomic headers
        run: dir "C:/Program Files/Microsoft Visual Studio/2022/*/VC/Tools/MSVC/*/include" -include stdatomic.h -recurse | del

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

      - name: Install sonar-scanner and build-wrapper
        uses: SonarSource/sonarcloud-github-c-cpp@v2

      - name: Configure CMake
        run: >
          cmake -G Ninja -S . -B build --preset ${{ matrix.build.preset }}
          --toolchain C:/vcpkg/scripts/buildsystems/vcpkg.cmake
          -D NEW_DYNAREC=${{ matrix.dynarec.new }} -D QT=${{ matrix.ui.qt }}
          -D CMAKE_INSTALL_PREFIX=./build/artifacts
          -D VCPKG_CHAINLOAD_TOOLCHAIN_FILE=${{ github.workspace }}/${{ matrix.target.toolchain }}
          -D VCPKG_TARGET_TRIPLET=${{ matrix.target.triplet }}
          -D VCPKG_HOST_TRIPLET=x64-windows
          -D VCPKG_USE_HOST_TOOLS=ON

      - name: Fix Qt
        if: matrix.ui.qt == 'on'
        run: |
         $qtTargetsPath = "${{ github.workspace }}/build/vcpkg_installed/${{ matrix.target.triplet }}/share/Qt6/Qt6Targets.cmake"
         (Get-Content $qtTargetsPath) -replace "^.*-Zc:__cplusplus;-permissive-.*$","#$&" | Set-Content $qtTargetsPath

      - name: Reconfigure CMake
        if: matrix.ui.qt == 'on'
        run: |
          cmake clean build

      - name: Build
        run: |
          .sonar/build-wrapper-win-x86/build-wrapper-win-x86-64.exe --out-dir ${{ env.BUILD_WRAPPER_OUT_DIR }} cmake --build build

      - name: Run sonar-scanner
        if: 0
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
        run: |
          .sonar/sonar-scanner-5.0.1.3006-windows/bin/sonar-scanner.bat --define sonar.cfamily.build-wrapper-output="${{ env.BUILD_WRAPPER_OUT_DIR }}"

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

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