name: macos

# build on c/cpp changes or workflow changes
on:
  push:
    paths:
      - 'lib/**.[ch]'
      - 'lib/**.cpp'
      - 'src/**.[ch]'
      - 'src/**.cpp'
      - 'irr/**.[ch]'
      - 'irr/**.cpp'
      - 'irr/**.mm' # Objective-C(++)
      - '**/CMakeLists.txt'
      - 'cmake/Modules/**'
      - 'po/**.po'
      - '.github/workflows/macos.yml'
  pull_request:
    paths:
      - 'lib/**.[ch]'
      - 'lib/**.cpp'
      - 'src/**.[ch]'
      - 'src/**.cpp'
      - 'irr/**.[ch]'
      - 'irr/**.cpp'
      - 'irr/**.mm' # Objective-C(++)
      - '**/CMakeLists.txt'
      - 'cmake/Modules/**'
      - 'po/**.po'
      - '.github/workflows/macos.yml'

jobs:
  build-intel-macos:
    # use lowest possible macOS running on x86_64 supported by brew to support more users
    runs-on: macos-13
    steps:
      - uses: actions/checkout@v4
      - name: Install deps
        run: |
          source ./util/ci/common.sh
          install_macos_deps

      - name: Build
        run: |
          mkdir build
          cd build
          cmake .. \
            -DCMAKE_OSX_DEPLOYMENT_TARGET=13 \
            -DCMAKE_FIND_FRAMEWORK=LAST \
            -DCMAKE_INSTALL_PREFIX=../build/macos/ \
            -DRUN_IN_PLACE=FALSE -DENABLE_GETTEXT=TRUE \
            -DINSTALL_DEVTEST=TRUE
          cmake --build . -j$(sysctl -n hw.logicalcpu)
          make install

      - name: Test
        run: |
          ./build/macos/luanti.app/Contents/MacOS/luanti --run-unittests

      # Zipping the built .app preserves permissions on the contained files,
      #   which the GitHub artifact pipeline would otherwise strip away.
      - name: CPack
        run: |
          cd build
          rm -rf macos
          cmake .. -DINSTALL_DEVTEST=FALSE
          cpack -G ZIP -B macos

      - uses: actions/upload-artifact@v4
        with:
          name: luanti-macos
          path: ./build/macos/*.zip
  build-arm-macos-xcode:
    runs-on: macos-14
    steps:
      - uses: actions/checkout@v4
      - name: Install deps
        run: |
          source ./util/ci/common.sh
          install_macos_deps
          # brew jsoncpp do not include libjsoncpp.a, and if installed header conflict caused build failure
          brew uninstall jsoncpp

      - name: Build with Cmake
        run: |
          mkdir build
          cd build
          cmake .. \
            -DCMAKE_OSX_DEPLOYMENT_TARGET=14 \
            -DCMAKE_FIND_FRAMEWORK=LAST \
            -DCMAKE_INSTALL_PREFIX=../build/macos/ \
            -DRUN_IN_PLACE=FALSE -DENABLE_GETTEXT=TRUE \
            -DENABLE_SYSTEM_JSONCPP=OFF
          cmake --build . -j$(sysctl -n hw.logicalcpu)
          make install

      - name: Build and Archive with Xcode
        run: |
          mkdir build_xcode
          cd build_xcode
          ../util/ci/build_xcode.sh

      - name: Tests
        run: |
          mkdir -p "${HOME}/Library/Application Support/minetest/games/"
          ln -s "${PWD}/games/devtest" "${HOME}/Library/Application Support/minetest/games/"
          ./build/macos/luanti.app/Contents/MacOS/luanti --run-unittests
          ./build_xcode/luanti.xcarchive/Products/Applications/luanti.app/Contents/MacOS/luanti --run-unittests

      - name: Diff Resources
        run: |
          diff -rd ./build/macos/luanti.app/Contents/Resources ./build_xcode/build/Release/luanti.app/Contents/Resources || exit 1
          diff -rd ./build/macos/luanti.app/Contents/Resources ./build_xcode/luanti.xcarchive/Products/Applications/luanti.app/Contents/Resources || exit 1
