---
name: Build & Test

on:
  pull_request:
  push:

jobs:
  Linux:
    name: >-
      ${{ matrix.image }}
      (${{ matrix.build_system }})
      (${{ matrix.compiler }})
    runs-on: ubuntu-latest
    strategy:
      matrix:
        image:
          - "centos:7"
          - "debian:11"
          - "debian:12"
          - "debian:testing"
          - "fedora:38"
          - "fedora:39"
          - "fedora:rawhide"
          - "opensuse/leap:15"
          - "ubuntu:20.04"
          - "ubuntu:rolling"
        build_system:
          - CMake
        compiler:
          - GNU
        on_default_branch:
          - ${{ contains(github.ref, 'master') || contains(github.ref, 'develop') || contains(github.ref, 'CI') }}
        include:
          - image: "ubuntu:22.04"
            build_system: Autotools
            compiler: GNU
          - image: "ubuntu:22.04"
            build_system: Autotools
            compiler: LLVM
          - image: "ubuntu:22.04"
            build_system: CMake
            compiler: GNU
          - image: "ubuntu:22.04"
            build_system: CMake
            compiler: LLVM
        exclude:
          - on_default_branch: false
      fail-fast: false
    container:
      env:
        CC: ${{ matrix.compiler == 'LLVM' && 'clang' || 'gcc' }}
        CXX: ${{ matrix.compiler == 'LLVM' && 'clang++' || 'g++' }}
      image: ${{ matrix.image }}
    steps:
      - name: Install `git` (Amazon Linux 2)
        run: yum --assumeyes install git
        if: matrix.image == 'amazonlinux:2'

      - name: Install `git` (openSUSE)
        run: zypper --non-interactive install git
        if: startsWith(matrix.image, 'opensuse/')

      - name: Checkout code (CentOS 7)
        uses: actions/checkout@v3
        if: matrix.image == 'centos:7'

      - name: Checkout code
        uses: actions/checkout@v4
        if: matrix.image != 'centos:7'

      - name: Install dependencies
        uses: ./.github/actions/dependencies/install

      - name: Build `mod_tile`
        uses: ./.github/actions/build

      - name: Test `mod_tile`
        uses: ./.github/actions/test

      - name: Install `mod_tile`
        uses: ./.github/actions/install

  Linux-Latest-Mapnik:
    continue-on-error: true
    name: >-
      ${{ matrix.image }}
      (Latest Mapnik)
      (${{ matrix.build_system }})
      (${{ matrix.compiler }})
    runs-on: ubuntu-latest
    strategy:
      matrix:
        image:
          - "debian:12"
          - "ubuntu:22.04"
        build_system:
          - CMake
        compiler:
          - GNU
        mapnik_latest:
          - true
      fail-fast: false
    container:
      env:
        CC: ${{ matrix.compiler == 'LLVM' && 'clang' || 'gcc' }}
        CXX: ${{ matrix.compiler == 'LLVM' && 'clang++' || 'g++' }}
      image: ${{ matrix.image }}
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Install dependencies
        uses: ./.github/actions/dependencies/install

      - name: Build `mod_tile`
        uses: ./.github/actions/build

      - name: Test `mod_tile`
        uses: ./.github/actions/test

      - name: Install `mod_tile`
        uses: ./.github/actions/install

  macOS:
    env:
      CFLAGS: -Wno-implicit-function-declaration
      LDFLAGS: -undefined dynamic_lookup
      LIBRARY_PATH: /usr/local/lib
    name: >-
      ${{ matrix.os }}
      (${{ matrix.build_system }})
      (${{ matrix.compiler }})
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os:
          - macos-12
        build_system:
          - CMake
        compiler:
          - LLVM
        on_default_branch:
          - ${{ contains(github.ref, 'master') || contains(github.ref, 'develop') || contains(github.ref, 'CI') }}
        include:
          - os: macos-13
            build_system: Autotools
            compiler: LLVM
          - os: macos-13
            build_system: CMake
            compiler: LLVM
        exclude:
          - on_default_branch: false
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Install dependencies
        uses: ./.github/actions/dependencies/install

      - name: Set ICU_ROOT
        run: |
          echo "ICU_ROOT=$(brew --prefix icu4c)" >> ${GITHUB_ENV}

      - name: Build `mod_tile`
        uses: ./.github/actions/build

      - name: Test `mod_tile`
        uses: ./.github/actions/test

      - name: Install `mod_tile`
        uses: ./.github/actions/install

  FreeBSD:
    continue-on-error: true
    env:
      BUILD_PARALLEL_LEVEL: 2
      LIBRARY_PATH: /usr/local/lib
      TMPDIR: /tmp
    name: >-
      ${{ matrix.box_generic }}
      (${{ matrix.build_system }})
      (${{ matrix.compiler }})
    runs-on: ubuntu-latest
    strategy:
      matrix:
        box_generic:
          - freebsd12
          - freebsd13
        build_system:
          - CMake
        compiler:
          - LLVM
        on_default_branch:
          - ${{ contains(github.ref, 'master') || contains(github.ref, 'develop') || contains(github.ref, 'CI') }}
        include:
          - box_generic: freebsd14
            build_system: CMake
            compiler: LLVM
        exclude:
          - on_default_branch: false
      fail-fast: false
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Provision VM
        uses: hummeltech/freebsd-vagrant-action@v1.4
        with:
          box: generic/${{ matrix.box_generic }}
          cpus: ${{ env.BUILD_PARALLEL_LEVEL }}
          memory: 4096

      # Mapnik is not in the `quarterly` repository (2023.10.12)
      - name: Use "latest" repository
        run: |
          sudo mkdir -p /usr/local/etc/pkg/repos
          sed 's#/quarterly#/latest#g' /etc/pkg/FreeBSD.conf | sudo tee /usr/local/etc/pkg/repos/FreeBSD.conf
          sudo pkg upgrade

      - name: Install dependencies
        uses: ./.github/actions/dependencies/install

      - name: Build `mod_tile`
        uses: ./.github/actions/build

      - name: Test `mod_tile`
        uses: ./.github/actions/test

      - name: Install `mod_tile`
        uses: ./.github/actions/install
