name: linux

on:
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]

# Set permissions at the job level.
permissions: {}

jobs:
  linux:
    runs-on: ubuntu-22.04
    permissions:
      contents: read
    strategy:
      matrix:
        compiler: [clang, gcc]
    steps:
      - uses: actions/checkout@v3
        with:
          persist-credentials: false
      - uses: actions/setup-python@v4
        with:
          python-version: '3.9'
      - name: Install dependencies
        run: |
          python -m pip install --upgrade meson PyYAML
          sudo apt update
          sudo apt install -y \
            doxygen libxcb-xkb-dev valgrind ninja-build \
            libwayland-dev wayland-protocols bison graphviz
      - name: Install xkeyboard-config
        run: |
          # Install master version of xkeyboard-config, in order to ensure
          # its latest version works well with xkbcommon.
          # HACK: We use meson to install, while it would be cleaner
          #       to create a proper package to install or use some PPA.
          pushd ~
          git clone --depth=1 https://gitlab.freedesktop.org/xkeyboard-config/xkeyboard-config.git
          cd "xkeyboard-config"
          BUILDDIR=build
          meson setup $BUILDDIR -Dprefix=/usr
          meson install -C $BUILDDIR
          popd
      - name: Setup
        run: |
          # -gdwarf-4 - see https://github.com/llvm/llvm-project/issues/56550.
          CFLAGS='-gdwarf-4' meson setup build -Denable-cool-uris=true
        env:
          CC: ${{ matrix.compiler }}
      - name: Build
        run: |
          meson compile -C build
      - name: Test
        run:
          meson test -C build --print-errorlogs --no-suite python-tests
      - name: Test with valgrind
        run:
          meson test -C build --print-errorlogs --setup=valgrind --no-suite python-tests
      - name: Upload test logs
        uses: actions/upload-artifact@v3
        if: failure()
        with:
          name: test logs
          path: |
            build/meson-logs/
      - name: Ensure doxygen version is correct
        run: |
            doxygen --version > version.txt
            echo "1.9.6" >> version.txt
            if [ $(sort -V version.txt | tail -n1) != "1.9.6" ]; then
                echo "Doxygen version 1.9.6 or earlier expected, see #347"
                exit 1
            fi
      - name: Store doxygen docs for use by the pages workflow
        uses: actions/upload-artifact@v3
        if: success()
        with:
          name: doxygen-docs
          path: |
            build/html/
