name: Package Check
on: [push, pull_request]
jobs:
  pkgcheck:
    name: ${{ matrix.name }}
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        include:
          - name: Ubuntu GCC
            os: ubuntu-latest
            compiler: gcc
            cxx-compiler: g++

          - name: Ubuntu GCC -m32
            os: ubuntu-latest
            compiler: gcc
            cxx-compiler: g++
            packages: gcc-multilib g++-multilib
            cmake-args: -DCMAKE_C_FLAGS=-m32 -DCMAKE_CXX_FLAGS=-m32
            cflags: -m32
            cxxflags: -m32
            ldflags: -m32

          - name: Ubuntu GCC ARM HF
            os: ubuntu-latest
            chost: arm-linux-gnueabihf
            compiler: arm-linux-gnueabihf-gcc
            cxx-compiler: g++-arm-linux-gnueabihf
            cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-armhf.cmake
            packages: qemu gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf libc6-dev-armhf-cross

          - name: Ubuntu GCC AARCH64
            os: ubuntu-latest
            chost: aarch64-linux-gnu
            compiler: aarch64-linux-gnu-gcc
            cxx-compiler: g++-aarch64-linux-gnu
            cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-aarch64.cmake
            packages: qemu gcc-aarch64-linux-gnu g++-aarch64-linux-gnu libc6-dev-arm64-cross

          - name: Ubuntu GCC PPC
            os: ubuntu-latest
            chost: powerpc-linux-gnu
            compiler: powerpc-linux-gnu-gcc
            cxx-compiler: g++-powerpc-linux-gnu
            cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-powerpc.cmake
            packages: qemu gcc-powerpc-linux-gnu g++-powerpc-linux-gnu libc6-dev-powerpc-cross

          - name: Ubuntu GCC PPC64LE
            os: ubuntu-latest
            chost: powerpc64le-linux-gnu
            compiler: powerpc64le-linux-gnu-gcc
            cxx-compiler: g++-powerpc64le-linux-gnu
            cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-powerpc64le.cmake
            packages: qemu gcc-powerpc64le-linux-gnu g++-powerpc64le-linux-gnu libc6-dev-ppc64el-cross

          - name: macOS Clang
            os: macOS-latest
            compiler: clang
            cxx-compiler: clang++

          - name: macOS Clang Native
            os: macOS-latest
            compiler: clang
            cxx-compiler: clang++
            cmake-args: -DWITH_NATIVE_INSTRUCTIONS=ON
            configure-args: --native

          - name: macOS Clang Symbol Prefix
            os: macOS-latest
            compiler: clang
            cxx-compiler: clang++
            cmake-args: -DZLIB_SYMBOL_PREFIX=zTest_
            configure-args: --sprefix=zTest_

    steps:
    - name: Checkout repository
      uses: actions/checkout@v3

    - name: Install packages (Ubuntu)
      if: runner.os == 'Linux'
      run: |
        sudo apt-get update
        sudo apt-get install -y --no-install-recommends ${{ matrix.packages }} \
          abigail-tools \
          diffoscope \
          ninja-build

    - name: Install packages (macOS)
      if: runner.os == 'macOS'
      run: brew install ninja diffoscope ${{ matrix.packages }}
      env:
        HOMEBREW_NO_INSTALL_CLEANUP: 1

    - name: Select Xcode version (macOS)
      # Use a version of Xcode that supports ZERO_AR_DATE until CMake supports
      # AppleClang linking with libtool using -D argument
      # https://gitlab.kitware.com/cmake/cmake/-/issues/19852
      if: runner.os == 'macOS'
      uses: maxim-lobanov/setup-xcode@v1
      with:
        xcode-version: '11.7.0'

    - name: Compare builds
      run: sh test/pkgcheck.sh
      env:
        CC: ${{ matrix.compiler }}
        CXX: ${{ matrix.cxx-compiler }}
        CFLAGS: ${{ matrix.cflags }}
        CXXFLAGS: ${{ matrix.cxxflags }}
        CHOST: ${{ matrix.chost }}
        CMAKE_ARGS: ${{ matrix.cmake-args }}
        CONFIGURE_ARGS: ${{ matrix.configure-args }}
        LDFLAGS: ${{ matrix.ldflags }}

    - name: Compare builds (compat)
      run: sh test/pkgcheck.sh --zlib-compat
      env:
        CC: ${{ matrix.compiler }}
        CFLAGS: ${{ matrix.cflags }}
        CHOST: ${{ matrix.chost }}
        CMAKE_ARGS: ${{ matrix.cmake-args }}
        CONFIGURE_ARGS: ${{ matrix.configure-args }}
        LDFLAGS: ${{ matrix.ldflags }}

    - name: Check ABI
      # macOS runner does not contain abigail
      if: runner.os != 'macOS'
      run: sh test/abicheck.sh --refresh-if
      env:
        CC: ${{ matrix.compiler }}
        CXX: ${{ matrix.cxx-compiler }}
        CFLAGS: ${{ matrix.cflags }}
        CXXFLAGS: ${{ matrix.cxxflags }}
        CHOST: ${{ matrix.chost }}
        CMAKE_ARGS: ${{ matrix.cmake-args }}
        CONFIGURE_ARGS: ${{ matrix.configure-args }}
        LDFLAGS: ${{ matrix.ldflags }}

    - name: Check ABI (compat)
      # macOS runner does not contain abigail
      if: runner.os != 'macOS'
      run: sh test/abicheck.sh --zlib-compat --refresh-if
      env:
        CC: ${{ matrix.compiler }}
        CXX: ${{ matrix.cxx-compiler }}
        CFLAGS: ${{ matrix.cflags }}
        CXXFLAGS: ${{ matrix.cxxflags }}
        CHOST: ${{ matrix.chost }}
        CMAKE_ARGS: ${{ matrix.cmake-args }}
        CONFIGURE_ARGS: ${{ matrix.configure-args }}
        LDFLAGS: ${{ matrix.ldflags }}

    - name: Upload build errors
      uses: actions/upload-artifact@v2
      if: failure()
      with:
        name: ${{ matrix.name }}
        path: |
          **/*.abi
          btmp1/configure.log
          btmp1/CMakeFiles/CMakeOutput.log
          btmp1/CMakeFiles/CMakeError.log
          btmp2/configure.log
          btmp2/CMakeFiles/CMakeOutput.log
          btmp2/CMakeFiles/CMakeError.log
        retention-days: 30
