name: MacOS Build Steps

on:
  workflow_call:
    inputs:
      jobName:
        required: true
        type: string
      os:
        required: false
        type: string
        default: macos-11.0
      platform:
        required: false
        type: string
        default: x64
      gui:
        required: true
        type: string
      cheats_url:
        required: false
        type: string
        default: https://github.com/PCSX2/pcsx2_patches/releases/latest/download

jobs:
  build_macos:
    name: ${{ inputs.jobName }}
    runs-on: ${{ inputs.os }}
    # Set some sort of timeout in the event of run-away builds.  We are limited on concurrent jobs so, get rid of them.
    timeout-minutes: 90
    env:
      POWERSHELL_TELEMETRY_OPTOUT: 1
      CCACHE_BASEDIR: ${{ github.workspace }}
      CCACHE_DIR: ${{ github.workspace }}/.ccache
      CCACHE_COMPRESS: true
      CCACHE_COMPRESSLEVEL: 9
      CCACHE_MAXSIZE: 100M

    steps:
      - name: Checkout Repository
        uses: actions/checkout@v3
        with:
          submodules: recursive

      - name: Prepare Artifact Metadata
        id: artifact-metadata
        shell: bash
        env:
          OS: macos
          GUI_FRAMEWORK: ${{ inputs.gui }}
          ARCH: ${{ inputs.platform }}
          EVENT_NAME: ${{ github.event_name }}
          PR_TITLE: ${{ github.event.pull_request.title }}
          PR_NUM: ${{ github.event.pull_request.number }}
          PR_SHA: ${{ github.event.pull_request.head.sha }}
        run: ./.github/workflows/scripts/common/name-artifacts.sh

      - name: Install Packages
        env:
          PLATFORM: ${{ inputs.platform }}
          HOMEBREW_NO_INSTALL_CLEANUP: 1
          HOMEBREW_NO_ANALYTICS: 1
        run: |
          brew unlink libjpeg || true # Conflicts with our self-built dependencies
          brew unlink libpng || true
          # Unlike other packages, brew's MoltenVK build uses MoltenVK's minimum macOS version of 10.13 so we can use it
          if ! brew install molten-vk ccache; then
            brew update
            brew install molten-vk ccache
          fi

      - name: Cache Dependencies
        id: cache-deps
        uses: actions/cache@v3
        with:
          path: ~/deps
          key: ${{ inputs.os }} ${{ inputs.platform }} ${{ inputs.gui }} deps ${{ hashFiles('.github/workflows/scripts/macos/build-dependencies.sh') }}

      - name: Build Dependencies
        if: steps.cache-deps.outputs.cache-hit != 'true'
        env:
          GUI: ${{ inputs.gui }}
        run: .github/workflows/scripts/macos/build-dependencies.sh

      - name: Download cheats
        run: |
          cd bin/resources
          aria2c -Z "${{ inputs.cheats_url }}/cheats_ni.zip" "${{ inputs.cheats_url }}/cheats_ws.zip"

      # -- SETUP CCACHE - https://cristianadam.eu/20200113/speeding-up-c-plus-plus-github-actions-using-ccache/
      - name: Prepare ccache timestamp
        id: ccache_cache_timestamp
        run: echo "timestamp=$(date -u "+%Y-%m-%d-%H;%M;%S")" >> $GITHUB_OUTPUT

      - name: Cache ccache cache
        uses: actions/cache@v3
        with:
          path: .ccache
          key: ${{ inputs.os }} ${{ inputs.platform }} ${{ inputs.gui }} ccache ${{ steps.ccache_cache_timestamp.outputs.timestamp }}
          restore-keys: ${{ inputs.os }} ${{ inputs.platform }} ${{ inputs.gui }} ccache

      - name: Generate CMake Files
        run: |
          cmake -DCMAKE_PREFIX_PATH="$HOME/deps" \
                -DCMAKE_BUILD_TYPE=Release \
                -DUSE_OPENGL=OFF \
                -DDISABLE_ADVANCE_SIMD=ON \
                -DCMAKE_INTERPROCEDURAL_OPTIMIZATION=ON \
                -DUSE_SYSTEM_LIBS=OFF \
                -DUSE_SYSTEM_SDL2=ON \
                -DCMAKE_C_COMPILER_LAUNCHER=ccache \
                -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
                -DCMAKE_DISABLE_PRECOMPILE_HEADERS=ON \
                -B build .

      - name: Build PCSX2
        working-directory: build
        run: |
          ccache -p
          ccache -s
          ccache -z
          make -j$(getconf _NPROCESSORS_ONLN) # macOS doesn't use make install
          ccache -s
          # Ensure there's no global constructors in multi-isa files
          for dir in */CMakeFiles/GS-{avx,avx2}.dir; do
            if find "$dir" -name "*.o" | xargs nm | grep _GLOBAL_; then
              echo "::error::Multi-isa files must not have global constructors!"
              exit 1
            fi
          done

      - name: Run Tests
        if: inputs.gui == 'Qt'
        working-directory: build
        run: make -j$(getconf _NPROCESSORS_ONLN) unittests

      - name: Prepare Build Artifacts
        run: |
          cp /usr/local/lib/libMoltenVK.dylib build/pcsx2*/PCSX2.app/Contents/Frameworks/
          TAG="$(git tag --points-at HEAD)"
          if [ -z "$TAG" ]; then
            APPNAME="${{ steps.artifact-metadata.outputs.artifact-name }}"
          else
            APPNAME="PCSX2-$TAG"
          fi
          mv build/pcsx2*/PCSX2.app "$APPNAME.app"
          tar cvzf "${{ steps.artifact-metadata.outputs.artifact-name }}.tar.gz" "$APPNAME.app"
          mkdir ci-artifacts
          cp "${{ steps.artifact-metadata.outputs.artifact-name }}.tar.gz" ci-artifacts/macOS-${{ inputs.gui }}.tar.gz

      - name: Upload Artifact
        uses: actions/upload-artifact@v3
        with:
          name: ${{ steps.artifact-metadata.outputs.artifact-name }}
          path: "*.tar.gz"
