name: 🍏 Mac OS build
on:
  push:
    branches:
      - master
      - release-**
      - queued_ltr_backports
    paths:
  pull_request:
    branches:
      - master
      - release-**
      - queued_ltr_backports
    paths:

env:
  QT_VERSION: 5.15.2
  QGIS_DEPS_VERSION: 0.9
  QGIS_DEPS_PATCH_VERSION: 0
  CCACHE_DIR: /Users/runner/work/ccache
  BUILD_DIR: /Users/runner/work/QGIS/build-QGIS
  # apparently we cannot cache /opt directory as it fails to restore
  # so we copy the deps in the home directory
  DEPS_CACHE_DIR: /Users/runner/work/deps-cache

jobs:
  mac_os_build:
    if: github.repository == 'qgis/QGIS'
    runs-on: macos-latest
    steps:
      - uses: actions/checkout@v3

      - name: Prepare build cache for pull request
        uses: pat-s/always-upload-cache@v3.0.11
        if: github.event_name == 'pull_request'
        with:
          path: ${{ env.CCACHE_DIR }}
          key: build-mac-ccache-${{ github.actor }}-${{ github.head_ref }}-${{ github.sha }}
          # The head_ref or source branch of the pull request in a workflow run.
          # The base_ref or target branch of the pull request in a workflow run.
          restore-keys: |
            build-mac-ccache-${{ github.actor }}-${{ github.head_ref }}-
            build-mac-ccache-refs/heads/${{ github.base_ref }}-
            build-mac-ccache-refs/heads/master-

      - name: Prepare build cache for branch/tag
        # use a fork of actions/cache@v2 to upload cache even when the build or test failed
        uses: pat-s/always-upload-cache@v3.0.11
        if: github.event_name != 'pull_request'
        with:
          path: ${{ env.CCACHE_DIR }}
          # The branch or tag ref that triggered the workflow run. For branches this in the format refs/heads/<branch_name>, and for tags it is refs/tags/<tag_name>
          key: build-mac-ccache-${{ github.ref }}-${{ github.sha }}
          restore-keys: |
            build-mac-ccache-${{ github.ref }}-
            build-mac-ccache-refs/heads/master-


      # Qt caching
      - name: Cache Qt
        id: cache-qt
        uses: actions/cache@v3.3.1
        with:
          path: ${{ env.DEPS_CACHE_DIR }}/Qt/${{ env.QT_VERSION }}
          key: mac-qt-${{ env.QT_VERSION }}

      - name: Restore Qt
        if: steps.cache-qt.outputs.cache-hit == 'true'
        run: |
          sudo mkdir -p /opt
          sudo mkdir -p /opt/Qt
          sudo cp -r ${DEPS_CACHE_DIR}/Qt/${QT_VERSION} /opt/Qt/${QT_VERSION}

      - name: Download Qt
        if: steps.cache-qt.outputs.cache-hit != 'true'
        run: |
          wget https://qgis.org/downloads/macos/deps/qt-${QT_VERSION}.tar.gz
          mkdir -p ${DEPS_CACHE_DIR}
          mkdir -p ${DEPS_CACHE_DIR}/Qt


      # QGIS-deps caching
      - name: Cache qgis-deps
        id: cache-deps
        uses: actions/cache@v3.3.1
        with:
          path: ${{ env.DEPS_CACHE_DIR }}/QGIS/qgis-deps-${{ env.QGIS_DEPS_VERSION }}.${{ env.QGIS_DEPS_PATCH_VERSION }}
          key: mac-qgis-deps-${{ env.QGIS_DEPS_VERSION }}.${{ env.QGIS_DEPS_PATCH_VERSION }}

      - name: Restore qgis-deps
        if: steps.cache-deps.outputs.cache-hit == 'true'
        run: |
          sudo mkdir -p /opt
          sudo mkdir -p /opt/QGIS
          sudo cp -r ${DEPS_CACHE_DIR}/QGIS/qgis-deps-${QGIS_DEPS_VERSION}.${QGIS_DEPS_PATCH_VERSION} /opt/QGIS/qgis-deps-${QGIS_DEPS_VERSION}

      - name: Download qgis-deps
        if: steps.cache-deps.outputs.cache-hit != 'true'
        run: |
          wget https://qgis.org/downloads/macos/deps/qgis-deps-${QGIS_DEPS_VERSION}.${QGIS_DEPS_PATCH_VERSION}.tar.gz
          mkdir -p ${DEPS_CACHE_DIR}
          mkdir -p ${DEPS_CACHE_DIR}/QGIS



      - name: Install Qt and deps
        env:
          QT_ALREADY_CACHED: ${{ steps.cache-qt.outputs.cache-hit }}
          QGIS_DEPS_ALREADY_CACHED: ${{ steps.cache-deps.outputs.cache-hit }}
        run: |
          wget https://qgis.org/downloads/macos/deps/install_qgis_deps-${QGIS_DEPS_VERSION}.${QGIS_DEPS_PATCH_VERSION}.bash
          chmod +x ./install_qgis_deps-${QGIS_DEPS_VERSION}.${QGIS_DEPS_PATCH_VERSION}.bash
          echo ::group::Install deps
          sudo ./install_qgis_deps-${QGIS_DEPS_VERSION}.${QGIS_DEPS_PATCH_VERSION}.bash
          echo ::endgroup::
          [[ ${QT_ALREADY_CACHED} != "true" ]] && cp -r /opt/Qt/${QT_VERSION} ${DEPS_CACHE_DIR}/Qt/${QT_VERSION} || true
          [[ ${QGIS_DEPS_ALREADY_CACHED} != "true" ]] && cp -r /opt/QGIS/qgis-deps-${QGIS_DEPS_VERSION} ${DEPS_CACHE_DIR}/QGIS/qgis-deps-${QGIS_DEPS_VERSION}.${QGIS_DEPS_PATCH_VERSION} || true

      - name: Install ccache
        run: |
          mkdir -p ${CCACHE_DIR}
          brew install ccache
          ccache --set-config=max_size=2.0G
          ccache -s

      - name: Run cmake
        run: |
          mkdir -p ${BUILD_DIR}
          cd ${BUILD_DIR}

          PATH=/opt/QGIS/qgis-deps-${QGIS_DEPS_VERSION}/stage/bin:$PATH \
          cmake -DQGIS_MAC_DEPS_DIR=/opt/QGIS/qgis-deps-${QGIS_DEPS_VERSION}/stage \
               -DCMAKE_PREFIX_PATH=/opt/Qt/${QT_VERSION}/clang_64 \
               -DWITH_BINDINGS=TRUE \
               -DWITH_3D=TRUE \
               -DWITH_DRACO=FALSE \
               -DWITH_PDAL=TRUE \
               -DWITH_EPT=TRUE \
               ../QGIS

      - name: Build QGIS
        run: |
          cd ${BUILD_DIR}
          make -j $(sysctl -n hw.ncpu)