name: ci
run-name: ${{ github.actor }} is testing out GitHub Actions 🚀

on: 
  push:
  workflow_dispatch:

jobs:
  windows:
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os: [windows-latest, windows-2019]
        toolkit: [v143, v142, v141, v140]
        std: [98, 11, 14, 17, 20]
        config: [Debug, Release]
        exclude:
          - os: windows-2019
            toolkit: v143
          - os: windows-2019
            toolkit: v142
          - os: windows-latest
            toolkit: v140
          - os: windows-latest
            toolkit: v141
          - os: windows-2019
            std: 20
          - os: windows-2019
            toolkit: v140
            std: 17
          - os: windows-2019
            toolkit: v140
            std: 14

    steps:
      - run: echo "🎉 The job was automatically triggered by a ${{ github.event_name }} event."
      - run: echo "🐧 This job is now running on a ${{ runner.os }} server hosted by GitHub!"
      - run: echo "🔎 The name of your branch is ${{ github.ref }} and your repository is ${{ github.repository }}."
      - name: Check out repository code
        uses: actions/checkout@v4
      - run: echo "💡 The ${{ github.repository }} repository has been cloned to the runner."
      - run: echo "🖥️ The workflow is now ready to test your code on the runner."
      - name: List files in the repository
        run: |
          ls ${{ github.workspace }}
      - run: echo "🍏 This job's status is ${{ job.status }}."
      - name: CMake Version
        run: cmake --version

      - name: Run with automagic detection
        run: |
          cmake -S. -B ./build_auto -T ${{matrix.toolkit}}
          cmake --build ./build_auto --config ${{matrix.config}}
          ctest --verbose -C ${{matrix.config}} --test-dir ./build_auto

      - name: Run with GLM_FORCE_PURE
        run: |
          cmake -S. -B ./build_pure_std -T ${{matrix.toolkit}} -DGLM_FORCE_PURE=ON -DGLM_ENABLE_CXX_${{matrix.std}}=ON
          cmake --build ./build_pure_std --config ${{matrix.config}}
          ctest --verbose -C ${{matrix.config}} --test-dir ./build_pure_std

      - name: Run with GLM_FORCE_PURE and language extensions
        run: |
          cmake -S. -B ./build_pure_ext -T ${{matrix.toolkit}} -DGLM_FORCE_PURE=ON -DGLM_ENABLE_CXX_${{matrix.std}}=ON -DGLM_ENABLE_LANG_EXTENSIONS=ON
          cmake --build ./build_pure_ext --config ${{matrix.config}}
          ctest --verbose -C ${{matrix.config}} --test-dir ./build_pure_ext

      - name: Run with GLM_ENABLE_SIMD_SSE2
        run: |
          cmake -S. -B ./build_sse2_std -T ${{matrix.toolkit}} -DGLM_FORCE_PURE=ON -DGLM_ENABLE_CXX_${{matrix.std}}=ON
          cmake --build ./build_sse2_std --config ${{matrix.config}}
          ctest --verbose -C ${{matrix.config}} --test-dir ./build_sse2_std

      - name: Run with GLM_ENABLE_SIMD_SSE2 and language extensions
        run: |
          cmake -S. -B ./build_sse2_ext -T ${{matrix.toolkit}} -DGLM_ENABLE_SIMD_SSE2=ON -DGLM_ENABLE_CXX_${{matrix.std}}=ON -DGLM_ENABLE_LANG_EXTENSIONS=ON
          cmake --build ./build_sse2_ext --config ${{matrix.config}}
          ctest --verbose -C ${{matrix.config}} --test-dir ./build_sse2_ext

      - name: Run with GLM_ENABLE_SIMD_AVX
        run: |
          cmake -S. -B ./build_avx1_std -T ${{matrix.toolkit}} -DGLM_ENABLE_SIMD_AVX=ON -DGLM_ENABLE_CXX_${{matrix.std}}=ON
          cmake --build ./build_avx1_std --config ${{matrix.config}}
          ctest --verbose -C ${{matrix.config}} --test-dir ./build_avx1_std

      - name: Run with GLM_ENABLE_SIMD_AVX and language extensions
        run: |
          cmake -S. -B ./build_avx1_ext -T ${{matrix.toolkit}} -DGLM_ENABLE_SIMD_AVX=ON -DGLM_ENABLE_CXX_${{matrix.std}}=ON -DGLM_ENABLE_LANG_EXTENSIONS=ON
          cmake --build ./build_avx1_ext --config ${{matrix.config}}
          ctest --verbose -C ${{matrix.config}} --test-dir ./build_avx1_ext

      - name: Run with GLM_ENABLE_SIMD_AVX2
        run: |
          cmake -S. -B ./build_avx2_std -T ${{matrix.toolkit}} -DGLM_ENABLE_SIMD_AVX2=ON -DGLM_ENABLE_CXX_${{matrix.std}}=ON
          cmake --build ./build_avx2_std --config ${{matrix.config}} 
          ctest --verbose -C ${{matrix.config}} --test-dir ./build_avx2_std

      - name: Run with GLM_ENABLE_SIMD_AVX2 and language extensions
        run: |
          cmake -S. -B ./build_avx2_ext -T ${{matrix.toolkit}} -DGLM_ENABLE_SIMD_AVX2=ON -DGLM_ENABLE_CXX_${{matrix.std}}=ON -DGLM_ENABLE_LANG_EXTENSIONS=ON
          cmake --build ./build_avx2_ext --config ${{matrix.config}}
          ctest --verbose -C ${{matrix.config}} --test-dir ./build_avx2_ext

  ubuntu:
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest, ubuntu-20.04]
        std: [98, 11, 14, 17, 20]
        config: [Debug, Release]
        exclude:
          - os: ubuntu-20.04
            std: 20

    steps:
      - run: echo "🎉 The job was automatically triggered by a ${{ github.event_name }} event."
      - run: echo "🐧 This job is now running on a ${{ runner.os }} server hosted by GitHub!"
      - run: echo "🔎 The name of your branch is ${{ github.ref }} and your repository is ${{ github.repository }}."
      - name: Check out repository code
        uses: actions/checkout@v4
      - run: echo "💡 The ${{ github.repository }} repository has been cloned to the runner."
      - run: echo "🖥️ The workflow is now ready to test your code on the runner."
      - name: List files in the repository
        run: |
          ls ${{ github.workspace }}
      - run: echo "🍏 This job's status is ${{ job.status }}."
      - name: CMake Version
        run: cmake --version
      - name: Run with automagic detection
        run: |
          cmake -S. -B ./build_auto
          cmake --build ./build_auto --config ${{matrix.config}}
          ctest --verbose -C ${{matrix.config}} --test-dir ./build_auto

      - name: Run with GLM_FORCE_PURE
        run: |
          cmake -S. -B ./build_pure_std -DGLM_FORCE_PURE=ON -DGLM_ENABLE_CXX_${{matrix.std}}=ON
          cmake --build ./build_pure_std --config ${{matrix.config}}
          ctest --verbose -C ${{matrix.config}} --test-dir ./build_pure_std
      - name: Run with GLM_FORCE_PURE and language extensions
        run: |
          cmake -S. -B ./build_pure_ext -DGLM_FORCE_PURE=ON -DGLM_ENABLE_CXX_${{matrix.std}}=ON -DGLM_ENABLE_LANG_EXTENSIONS=ON
          cmake --build ./build_pure_ext --config ${{matrix.config}}
          ctest --verbose -C ${{matrix.config}} --test-dir ./build_pure_ext

      - name: Run with GLM_ENABLE_SIMD_SSE2
        run: |
          cmake -S. -B ./build_sse2_std -DGLM_FORCE_PURE=ON -DGLM_ENABLE_CXX_${{matrix.std}}=ON
          cmake --build ./build_sse2_std --config ${{matrix.config}}
          ctest --verbose -C ${{matrix.config}} --test-dir ./build_sse2_std
      - name: Run with GLM_ENABLE_SIMD_SSE2 and language extensions
        run: |
          cmake -S. -B ./build_sse2_ext -DGLM_ENABLE_SIMD_SSE2=ON -DGLM_ENABLE_CXX_${{matrix.std}}=ON -DGLM_ENABLE_LANG_EXTENSIONS=ON
          cmake --build ./build_sse2_ext --config ${{matrix.config}}
          ctest --verbose -C ${{matrix.config}} --test-dir ./build_sse2_ext

      - name: Run with GLM_ENABLE_SIMD_AVX
        run: |
          cmake -S. -B ./build_avx1_std -DGLM_ENABLE_SIMD_AVX=ON -DGLM_ENABLE_CXX_${{matrix.std}}=ON
          cmake --build ./build_avx1_std --config ${{matrix.config}}
          ctest --verbose -C ${{matrix.config}} --test-dir ./build_avx1_std
      - name: Run with GLM_ENABLE_SIMD_AVX and language extensions
        run: |
          cmake -S. -B ./build_avx1_ext -DGLM_ENABLE_SIMD_AVX=ON -DGLM_ENABLE_CXX_${{matrix.std}}=ON -DGLM_ENABLE_LANG_EXTENSIONS=ON
          cmake --build ./build_avx1_ext --config ${{matrix.config}}
          ctest --verbose -C ${{matrix.config}} --test-dir ./build_avx1_ext

      - name: Run with GLM_ENABLE_SIMD_AVX2
        run: |
          cmake -S. -B ./build_avx2_std -DGLM_ENABLE_SIMD_AVX2=ON -DGLM_ENABLE_CXX_${{matrix.std}}=ON
          cmake --build ./build_avx2_std --config ${{matrix.config}}
          ctest --verbose -C ${{matrix.config}} --test-dir ./build_avx2_std
      - name: Run with GLM_ENABLE_SIMD_AVX2 and language extensions
        run: |
          cmake -S. -B ./build_avx2_ext -DGLM_ENABLE_SIMD_AVX2=ON -DGLM_ENABLE_CXX_${{matrix.std}}=ON -DGLM_ENABLE_LANG_EXTENSIONS=ON
          cmake --build ./build_avx2_ext --config ${{matrix.config}}
          ctest --verbose -C ${{matrix.config}} --test-dir ./build_avx2_ext

  macos:
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os: [macos-latest, macos-11]
        std: [98, 11, 14, 17, 20]
        config: [Debug, Release]
        exclude:
          - os: macos-11
            std: 20

    steps:
      - run: echo "🎉 The job was automatically triggered by a ${{ github.event_name }} event."
      - run: echo "🐧 This job is now running on a ${{ runner.os }} server hosted by GitHub!"
      - run: echo "🔎 The name of your branch is ${{ github.ref }} and your repository is ${{ github.repository }}."
      - name: Check out repository code
        uses: actions/checkout@v4
      - run: echo "💡 The ${{ github.repository }} repository has been cloned to the runner."
      - run: echo "🖥️ The workflow is now ready to test your code on the runner."
      - name: List files in the repository
        run: |
          ls ${{ github.workspace }}
      - run: echo "🍏 This job's status is ${{ job.status }}."
      - name: CMake Version
        run: cmake --version
      - name: Run with automagic detection
        run: |
          cmake -S. -B ./build_auto
          cmake --build ./build_auto --config ${{matrix.config}}
          ctest --verbose -C ${{matrix.config}} --test-dir ./build_auto

      - name: Run with GLM_FORCE_PURE
        run: |
          cmake -S. -B ./build_pure_std -DGLM_FORCE_PURE=ON -DGLM_ENABLE_CXX_${{matrix.std}}=ON
          cmake --build ./build_pure_std --config ${{matrix.config}}
          ctest --verbose -C ${{matrix.config}} --test-dir ./build_pure_std
      - name: Run with GLM_FORCE_PURE and language extensions
        run: |
          cmake -S. -B ./build_pure_ext -DGLM_FORCE_PURE=ON -DGLM_ENABLE_CXX_${{matrix.std}}=ON -DGLM_ENABLE_LANG_EXTENSIONS=ON
          cmake --build ./build_pure_ext --config ${{matrix.config}}
          ctest --verbose -C ${{matrix.config}} --test-dir ./build_pure_ext

      - name: Run with GLM_ENABLE_SIMD_SSE2
        run: |
          cmake -S. -B ./build_sse2_std -DGLM_FORCE_PURE=ON -DGLM_ENABLE_CXX_${{matrix.std}}=ON
          cmake --build ./build_sse2_std --config ${{matrix.config}}
          ctest --verbose -C ${{matrix.config}} --test-dir ./build_sse2_std
      - name: Run with GLM_ENABLE_SIMD_SSE2 and language extensions
        run: |
          cmake -S. -B ./build_sse2_ext -DGLM_ENABLE_SIMD_SSE2=ON -DGLM_ENABLE_CXX_${{matrix.std}}=ON -DGLM_ENABLE_LANG_EXTENSIONS=ON
          cmake --build ./build_sse2_ext --config ${{matrix.config}}
          ctest --verbose -C ${{matrix.config}} --test-dir ./build_sse2_ext

      - name: Run with GLM_ENABLE_SIMD_AVX
        run: |
          cmake -S. -B ./build_avx1_std -DGLM_ENABLE_SIMD_AVX=ON -DGLM_ENABLE_CXX_${{matrix.std}}=ON
          cmake --build ./build_avx1_std --config ${{matrix.config}}
          ctest --verbose -C ${{matrix.config}} --test-dir ./build_avx1_std
      - name: Run with GLM_ENABLE_SIMD_AVX and language extensions
        run: |
          cmake -S. -B ./build_avx1_ext -DGLM_ENABLE_SIMD_AVX=ON -DGLM_ENABLE_CXX_${{matrix.std}}=ON -DGLM_ENABLE_LANG_EXTENSIONS=ON
          cmake --build ./build_avx1_ext --config ${{matrix.config}}
          ctest --verbose -C ${{matrix.config}} --test-dir ./build_avx1_ext
 