name: linux

# build on c/cpp changes or workflow changes
on:
  push:
    paths:
      - 'lib/**.[ch]'
      - 'lib/**.cpp'
      - 'src/**.[ch]'
      - 'src/**.cpp'
      - 'irr/**.[ch]'
      - 'irr/**.cpp'
      - '**/CMakeLists.txt'
      - 'cmake/Modules/**'
      - 'po/**.po'
      - 'util/ci/**'
      - '.github/workflows/linux.yml'
  pull_request:
    paths:
      - 'lib/**.[ch]'
      - 'lib/**.cpp'
      - 'src/**.[ch]'
      - 'src/**.cpp'
      - 'irr/**.[ch]'
      - 'irr/**.cpp'
      - '**/CMakeLists.txt'
      - 'cmake/Modules/**'
      - 'po/**.po'
      - 'util/ci/**'
      - '.github/workflows/linux.yml'

env:
  MINETEST_POSTGRESQL_CONNECT_STRING: 'host=localhost user=minetest password=minetest dbname=minetest'

jobs:
  # Older gcc version (should be close to our minimum supported version)
  gcc_7:
    runs-on: ubuntu-20.04
    steps:
      - uses: actions/checkout@v4
      - name: Install deps
        run: |
          source ./util/ci/common.sh
          install_linux_deps g++-7

      - name: Build
        run: |
          ./util/ci/build.sh
        env:
          CC: gcc-7
          CXX: g++-7
          # Test fallback SHA implementations
          CMAKE_FLAGS: '-DENABLE_OPENSSL=0'

      - name: Test
        run: |
          ./bin/luanti --run-unittests

  # Current gcc version
  gcc_14:
    runs-on: ubuntu-24.04
    steps:
      - uses: actions/checkout@v4
      - name: Install deps
        run: |
          source ./util/ci/common.sh
          install_linux_deps g++-14 libluajit-5.1-dev

      - name: Build
        run: |
          ./util/ci/build.sh
        env:
          CC: gcc-14
          CXX: g++-14

      - name: Test
        run: |
          mkdir nowrite
          chmod a-w nowrite
          cd nowrite
          ../bin/luanti --run-unittests

  # Older clang version (should be close to our minimum supported version)
  clang_7:
    runs-on: ubuntu-20.04
    steps:
      - uses: actions/checkout@v4
      - name: Install deps
        run: |
          source ./util/ci/common.sh
          install_linux_deps clang-7 llvm-7

      - name: Build
        run: |
          ./util/ci/build.sh
        env:
          CC: clang-7
          CXX: clang++-7
          CMAKE_FLAGS: '-DCMAKE_C_FLAGS="-fsanitize=address" -DCMAKE_CXX_FLAGS="-fsanitize=address"'

      - name: Unittest
        run: |
          ./bin/luanti --run-unittests

      # Do this here because we have ASan and error paths are sensitive to dangling pointers
      - name: Test error cases
        run: |
          ./util/test_error_cases.sh

  # Current clang version
  clang_18:
    runs-on: ubuntu-24.04
    steps:
      - uses: actions/checkout@v4
      - name: Install deps
        run: |
          source ./util/ci/common.sh
          install_linux_deps clang-18 lldb

      - name: Build
        run: |
          ./util/ci/build.sh
        env:
          CC: clang-18
          CXX: clang++-18

      - name: Test
        run: |
          ./bin/luanti --run-unittests

      - name: Integration test + devtest
        run: |
          ./util/test_multiplayer.sh

  # Build with prometheus-cpp (server-only)
  clang_11_prometheus:
    name: "clang_11 (PROMETHEUS=1)"
    runs-on: ubuntu-22.04
    steps:
      - uses: actions/checkout@v4
      - name: Install deps
        run: |
          source ./util/ci/common.sh
          install_linux_deps clang-11

      - name: Build prometheus-cpp
        run: ./util/ci/build_prometheus_cpp.sh

      - name: Build
        run: |
          ./util/ci/build.sh
        env:
          CC: clang-11
          CXX: clang++-11
          CMAKE_FLAGS: "-DENABLE_PROMETHEUS=1 -DBUILD_CLIENT=0 -DENABLE_CURSES=0"

      - name: Test
        run: |
          ./bin/luantiserver --run-unittests