name: CMake build workflows

on:
  workflow_call:

jobs:
  cmake-unix:
    name: Ubuntu
    runs-on: ${{ matrix.os }}
    strategy:
      #-
      # The CMake builds produce artifacts (*) and the runner image's name is
      # used in the artifact's name, simh-4.1.0-x86_64-ubuntu-20.04.deb.
      # Consequently, each runner image is enumerated for each artifact (*)
      # that the build produces.
      #
      # (*) "artefact" for the rest of the Anglosphere
      #-
      matrix:
        os: [ubuntu-20.04, ubuntu-22.04, ubuntu-latest]
    steps:
    - uses: actions/checkout@v4
    - name: Install dependencies
      run: |
        sh -ex .travis/deps.sh linux
        sudo apt install -ym ninja-build
    - name: cmake-builder.sh
      run: |
        cmake/cmake-builder.sh --config Release --flavor ninja --lto --notest --parallel --verbose --cpack_suffix x86_64-${{matrix.os}}
    - name: SIMH simulator suite test
      run: |
        cmake/cmake-builder.sh --config Release --flavor ninja --testonly
    ## Install isn't strictly necessary, but it's a good way to see what dependencies
    ## (IMPORTED_RUNTIME_ARTIFACTS) get installed.
    - name: Install
      run: |
        cmake/cmake-builder.sh --config Release --flavor ninja --installonly
    - name: SIMH packaging
      run: |
        cd cmake/build-ninja
        cpack -G DEB -C Release
    - name: Upload DEB
      uses: actions/upload-artifact@v4
      with:
        name: simh-4.1.0-x86_64-${{matrix.os}}.deb
        path: cmake/build-ninja/simh-4.1.0-x86_64-${{matrix.os}}.deb


  cmake-macOS:
    name: macOS 12+
    runs-on: ${{ matrix.os }}
    strategy:
      #-
      # The CMake builds produce artifacts (*) and the runner image's name is
      # used in the artifact's name, e.g., simh-4.1.0-m1.macos-14.dmg.
      # Consequently, each runner image is enumerated for each artifact (*)
      # that the build produces.
      #
      # (*) "artefact" for the rest of the Anglosphere -
      matrix:
        os: [macos-12, macos-13, macos-latest]

    env:
      CPACK_SUFFIX: ${{matrix.os != 'macos-14' && 'x86_64' || 'm1'}}.${{matrix.os}}

    steps:
    - uses: actions/checkout@v4

    ## Workaround for remnant symlinks in /usr/local pointing back to
    ## macOS frameworks.
    ##
    ## Future: Will have to keep an eye on SDL_ttf's Python dependency
    ## so that the correct/appropriate Python version is removed.
    ##
    ## Redirect stderr to /dev/null so that GH doesn't emit useless failure
    ## messages.
    - name: Remnant symlink cleanup
      run: |
        brew unlink python@3 2> /dev/null || true
        brew uninstall --ignore-dependencies python@3 2> /dev/null || true
        brew unlink python@3.12 2> /dev/null || true
        brew uninstall --ignore-dependencies python@3.12 2> /dev/null || true
        for f in $(find /usr/local/bin -type l -print); do \
          (readlink $f | grep -q -s "/Library") && echo Removing "$f" && rm -f "$f"; \
        done || exit 0

    - name: Install dependencies
      run: sh -ex .travis/deps.sh osx

    - name: cmake-builder.sh
      run: |
        cmake/cmake-builder.sh --config Release --flavor xcode --notest --cpack_suffix ${{env.CPACK_SUFFIX}}

    - name: SIMH simulator suite test
      run: |
        cmake/cmake-builder.sh --config Release --flavor xcode --testonly

    ## Install isn't strictly necessary, but it's a good way to see what dependencies
    ## (IMPORTED_RUNTIME_ARTIFACTS) get installed.

    - name: Install
      run: |
        cmake/cmake-builder.sh --config Release --flavor xcode --installonly

    - name: SIMH packaging
      run: |
        cd cmake/build-xcode
        cpack -G "ZIP;TGZ" -C Release
        cpack -G DragNDrop -C Release

    - name: Upload ZIP
      uses: actions/upload-artifact@v4
      with:
        name: simh-4.1.0-${{env.CPACK_SUFFIX}}.zip
        path: cmake/build-xcode/simh-4.1.0-${{env.CPACK_SUFFIX}}.zip

    - name: Upload DMG
      uses: actions/upload-artifact@v4
      with:
        name: simh-4.1.0-${{env.CPACK_SUFFIX}}.dmg
        path: cmake/build-xcode/simh-4.1.0-${{env.CPACK_SUFFIX}}.dmg


  cmake-vs2022xp:
    name: VS 2022 XP-compatible LEGACY
    runs-on: windows-latest
    steps:
    - uses: actions/checkout@v4
    - name: Install v141_xp (XP toolkit) and build SIMH
      shell: pwsh
      run: |
          $ErrorActionPreference = "Stop"
          $WarningPreference = "Continue"
          $DebugPreference = "Continue"

          # Fix PATH so that "C:\Strawberry" (Strawberry Perl) doesn't mess with the build
          # CMake WILL find incompatible libraries within Strawberry.
          $fixPATH = (${env:PATH}.Split(';') | `
              Where-Object { $_ -notlike "*\Strawberry\*" -and $_ -notlike "*/Strawberry/*" }) -join ';'
          $env:Path = $fixPATH

          ## Install the XP toolkit, aka v141_xp. This script is specific to the Github environment.
          ./cmake/github_v141_xp.ps1

          #+
          # The GH Windows runner image documentation says that the VSSetup module is installed, from
          # whence Get-VSSetupInstance and Select-VSSetupInstance are imported. This step is pure
          # paranoia, ensuring that we really, truly and honestly have WinXP support.
          #-
          Write-Debug "Get-VSSetupInstance/Select-VSSetupInstance"
          $instances=$(Get-VSSetupInstance -All | Select-VSSetupInstance -Require 'Microsoft.VisualStudio.Component.WinXP' -Latest)
          if ($null -eq $instances)
          {
            throw "v141_xp didn't install correctly or incomplete install."
          }
          else
          {
            $instances | Write-Output
          }

          ## Don't use LTO for XP. XP compatibility comes from VS2017 -- MS is
          ## at VS2022. There are likely legacy bugs that have been fixed.
          ./cmake/cmake-builder.ps1 -flavor vs2022-xp -config Release -clean -verbose -notest -cpack_suffix win32-xp


    - name: SIMH simulator suite test
      shell: pwsh
      run: |
          ./cmake/cmake-builder.ps1 -flavor vs2022-xp -config Release -testOnly
    ## Install isn't strictly necessary, but it's a good way to see what dependencies
    ## (IMPORTED_RUNTIME_ARTIFACTS) get installed.
    - name: Install
      shell: pwsh
      run: |
        cmake/cmake-builder.ps1 -config Release -flavor vs2022-xp -installOnly
    - name: SIMH packaging
      shell: pwsh
      run: |
          cd cmake\build-vs2022-xp
          cpack -G "ZIP;WIX" -C Release
    - name: Upload ZIP
      uses: actions/upload-artifact@v4
      with:
        name: simh-4.1.0-win32-vs2022xp.zip
        path: cmake/build-vs2022-xp/simh-4.1.0-win32-xp.zip
    - name: Upload MSI
      uses: actions/upload-artifact@v4
      with:
        name: simh-4.1.0-win32-vs2022xp.msi
        path: cmake/build-vs2022-xp/simh-4.1.0-win32-xp.msi

  cmake-vs2022:
    name: VS 2022 Win10 native VCPKG
    runs-on: windows-latest
    steps:
    - uses: actions/checkout@v4
    - name: vs2022 build
      shell: pwsh
      run: |
          $ErrorActionPreference="Stop"
          $WarningPreference="Continue"
          # Fix PATH so that "C:\Strawberry" (Strawberry Perl) doesn't mess with the build
          # CMake WILL find incompatible libraries within Strawberry.
          $fixPATH = (${env:PATH}.Split(';') | `
              Where-Object { $_ -notlike "*\Strawberry\*" -and $_ -notlike "*/Strawberry/*" }) -join ';'
          $env:PATH = $fixPATH
          # Make this a vcpkg build:
          $env:VCPKG_ROOT=$env:VCPKG_INSTALLATION_ROOT
          Push-Location $env:VCPKG_ROOT
          git pull
          Pop-Location
          ./cmake/cmake-builder.ps1 -flavor vs2022 -config Release -clean -lto -verbose -notest -cpack_suffix win32-native
    - name: SIMH simulator suite test
      shell: pwsh
      run: |
          ./cmake/cmake-builder.ps1 -flavor vs2022 -config Release -testOnly
    ## Install isn't strictly necessary, but it's a good way to see what dependencies
    ## (IMPORTED_RUNTIME_ARTIFACTS) get installed.
    - name: Install
      shell: pwsh
      run: |
        cmake/cmake-builder.ps1 -config Release -flavor vs2022 -installOnly
    - name: SIMH packaging
      shell: pwsh
      run: |
          cd cmake\build-vs2022
          cpack -G "NSIS;WIX;ZIP" -C Release
    - name: Upload ZIP
      uses: actions/upload-artifact@v4
      with:
        name: simh-4.1.0-win32-vs2022.zip
        path: cmake/build-vs2022/simh-4.1.0-win32-native.zip
    - name: Upload EXE installer
      uses: actions/upload-artifact@v4
      with:
        name: simh-4.1.0-win32-vs2022.exe
        path: cmake/build-vs2022/simh-4.1.0-win32-native.exe
    - name: Upload MSI installer
      uses: actions/upload-artifact@v4
      with:
        name: simh-4.1.0-win32-vs2022.msi
        path: cmake/build-vs2022/simh-4.1.0-win32-native.msi
