name: CI

on: [ push, pull_request ]

env:
  # Enable format attributes in ncurses headers
  # Enable fortified memory/string handling
  CPPFLAGS: -DGCC_PRINTF -DGCC_SCANF -D_FORTIFY_SOURCE=2

jobs:
  build-ubuntu-latest-minimal-gcc:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Install Dependencies
      run: sudo apt-get install --no-install-recommends libncursesw5-dev
    - name: Bootstrap
      run: ./autogen.sh
    - name: Configure
      run: ./configure --enable-werror --enable-affinity --disable-unicode --disable-sensors
    - name: Enable compatibility modes
      run: |
        sed -i 's/#define HAVE_FSTATAT 1/#undef HAVE_FSTATAT/g' config.h
        sed -i 's/#define HAVE_OPENAT 1/#undef HAVE_OPENAT/g' config.h
        sed -i 's/#define HAVE_READLINKAT 1/#undef HAVE_READLINKAT/g' config.h
    - name: Build
      run: make -k
    - name: Distcheck
      run: make distcheck DISTCHECK_CONFIGURE_FLAGS="--enable-werror --enable-affinity --disable-unicode --disable-sensors"

  build-ubuntu-latest-minimal-clang:
    runs-on: ubuntu-latest
    env:
      CC: clang-12
    steps:
    - uses: actions/checkout@v2
    - name: install clang repo
      run: |
        wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key 2>/dev/null | sudo apt-key add -
        sudo add-apt-repository 'deb http://apt.llvm.org/focal/ llvm-toolchain-focal-12 main' -y
        sudo apt-get update -q
    - name: Install Dependencies
      run: sudo apt-get install --no-install-recommends clang-12 libncursesw5-dev
    - name: Bootstrap
      run: ./autogen.sh
    - name: Configure
      run: ./configure --enable-werror --enable-affinity --disable-unicode --disable-sensors
    - name: Build
      run: make -k
    - name: Distcheck
      run: make distcheck DISTCHECK_CONFIGURE_FLAGS="--enable-werror --enable-affinity --disable-unicode --disable-sensors"

  build-ubuntu-latest-full-featured-gcc:
    runs-on: ubuntu-latest
    # Enable LTO, might trigger additional warnings on advanced inlining
    env:
      CFLAGS: -O3 -g -flto
      LDFLAGS: -O3 -g -flto -Wl,--as-needed
    steps:
    - uses: actions/checkout@v2
    - name: Install Dependencies
      run: sudo apt-get install --no-install-recommends libncursesw5-dev libhwloc-dev libnl-3-dev libnl-genl-3-dev libsensors4-dev libcap-dev
    - name: Bootstrap
      run: ./autogen.sh
    - name: Configure
      run: ./configure --enable-werror --enable-openvz --enable-vserver --enable-ancient-vserver --enable-unicode --enable-hwloc --enable-delayacct --enable-sensors --enable-capabilities
    - name: Build
      run: make -k
    - name: Distcheck
      run: make distcheck DISTCHECK_CONFIGURE_FLAGS='--enable-werror --enable-openvz --enable-vserver --enable-ancient-vserver --enable-unicode --enable-hwloc --enable-delayacct --enable-sensors --enable-capabilities'

  build-ubuntu-latest-full-featured-clang:
    runs-on: ubuntu-latest
    env:
      CC: clang-12
    steps:
    - uses: actions/checkout@v2
    - name: install clang repo
      run: |
        wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key 2>/dev/null | sudo apt-key add -
        sudo add-apt-repository 'deb http://apt.llvm.org/focal/ llvm-toolchain-focal-12 main' -y
        sudo apt-get update -q
    - name: Install Dependencies
      run: sudo apt-get install --no-install-recommends clang-12 libncursesw5-dev libhwloc-dev libnl-3-dev libnl-genl-3-dev libsensors4-dev libcap-dev
    - name: Bootstrap
      run: ./autogen.sh
    - name: Configure
      run: ./configure --enable-werror --enable-openvz --enable-vserver --enable-ancient-vserver --enable-unicode --enable-hwloc --enable-delayacct --enable-sensors --enable-capabilities
    - name: Build
      run: make -k
    - name: Distcheck
      run: make distcheck DISTCHECK_CONFIGURE_FLAGS='--enable-werror --enable-openvz --enable-vserver --enable-ancient-vserver --enable-unicode --enable-hwloc --enable-delayacct --enable-sensors --enable-capabilities'

  build-ubuntu-latest-gcc-static:
    runs-on: ubuntu-latest
    # Enable LTO, might trigger additional warnings on advanced inlining
    env:
      CFLAGS: -O3 -g -flto
      LDFLAGS: -O3 -g -flto
    steps:
    - uses: actions/checkout@v2
    - name: Install Dependencies
      run: sudo apt-get install --no-install-recommends libncursesw5-dev libtinfo-dev libgpm-dev libsensors4-dev libcap-dev
    - name: Bootstrap
      run: ./autogen.sh
    - name: Configure
      run: ./configure --enable-static --enable-werror --enable-openvz --enable-vserver --enable-ancient-vserver --enable-unicode --disable-hwloc --disable-delayacct --enable-sensors --enable-capabilities
    - name: Build
      run: make -k
    - name: Distcheck
      run: make distcheck DISTCHECK_CONFIGURE_FLAGS='--enable-static --enable-werror --enable-openvz --enable-vserver --enable-ancient-vserver --enable-unicode --disable-hwloc --disable-delayacct --enable-sensors --enable-capabilities'

  build-ubuntu-latest-pcp:
    # Turns out 'ubuntu-latest' can be older than 20.04, we want PCP v5+
    runs-on: ubuntu-20.04
    steps:
    - uses: actions/checkout@v2
    - name: Install Dependencies
      run: sudo apt-get install --no-install-recommends libpcp3-dev libncursesw5-dev libtinfo-dev libgpm-dev
    - name: Bootstrap
      run: ./autogen.sh
    - name: Configure
      # Until Ubuntu catches up with pcp-5.2.3+, cannot use -werror due to:
      # passing argument 2 of ‘pmLookupName’ from incompatible pointer type
      run: ./configure --enable-pcp --enable-unicode
    - name: Build
      run: make -k

  build-ubuntu-latest-clang-analyzer:
    runs-on: ubuntu-latest
    env:
      CC: clang-12
    steps:
    - uses: actions/checkout@v2
    - name: install clang repo
      run: |
        wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key 2>/dev/null | sudo apt-key add -
        sudo add-apt-repository 'deb http://apt.llvm.org/focal/ llvm-toolchain-focal-12 main' -y
        sudo apt-get update -q
    - name: Install Dependencies
      run: sudo apt-get install --no-install-recommends clang-12 clang-tools-12 libncursesw5-dev libnl-3-dev libnl-genl-3-dev libsensors4-dev libcap-dev
    - name: Bootstrap
      run: ./autogen.sh
    - name: Configure
      run: scan-build-12 -analyze-headers --status-bugs ./configure --enable-debug --enable-werror --enable-openvz --enable-vserver --enable-ancient-vserver --enable-unicode --enable-delayacct --enable-sensors --enable-capabilities
    - name: Build
      run: scan-build-12 -analyze-headers --status-bugs make -j"$(nproc)"

  build-macos-latest-clang:
    runs-on: macOS-latest
    env:
      CC: clang
    steps:
    - uses: actions/checkout@v2
    - name: Install Dependencies
      run: brew install automake
    - name: Bootstrap
      run: ./autogen.sh
    - name: Configure
      run: ./configure --enable-werror
    - name: Build
      run: make -k
    - name: Distcheck
      run: make distcheck DISTCHECK_CONFIGURE_FLAGS="--enable-werror"

  whitespace_check:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: check-whitespaces
        run: git diff-tree --check $(git hash-object -t tree /dev/null) HEAD
