name: Linux build with full test matrix
on:
  schedule:
    - cron: '0 0 * * 0'
  workflow_dispatch:
jobs:
  build:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        include:
          - name: "gcc 8.3 (Boost 1.72)"
            shortname: gcc8
            tag: cosmic
            cc: gcc
            cxx: g++
          - name: "gcc 9.3 (Boost 1.78)"
            shortname: gcc9
            tag: focal
            cc: gcc
            cxx: g++
          - name: "gcc 10.3 (Boost 1.79)"
            shortname: gcc10
            tag: hirsute
            cc: gcc
            cxx: g++
          - name: "gcc 11.4 (Boost 1.82)"
            shortname: gcc11
            tag: jammy
            cc: gcc
            cxx: g++
          - name: "gcc 12.3 (Boost 1.86)"
            shortname: gcc12
            tag: lunar
            cc: gcc
            cxx: g++
          - name: "gcc 13.x"
            shortname: gcc13
            tag: noble
            cc: gcc
            cxx: g++
          - name: "gcc 14.x"
            shortname: gcc14
            tag: plucky
            cc: gcc
            cxx: g++
          - name: "Clang 7 (Boost 1.72)"
            shortname: clang7
            tag: cosmic
            cc: clang
            cxx: clang++
          - name: "Clang 8 (Boost 1.72)"
            shortname: clang8
            tag: disco
            cc: clang
            cxx: clang++
          - name: "Clang 9 (Boost 1.74)"
            shortname: clang9
            tag: eoan
            cc: clang
            cxx: clang++
          - name: "Clang 10 (Boost 1.78)"
            shortname: clang10
            tag: focal
            cc: clang
            cxx: clang++
          - name: "Clang 11 (Boost 1.78)"
            shortname: clang11
            tag: groovy
            cc: clang
            cxx: clang++
          - name: "Clang 12 (Boost 1.79)"
            shortname: clang12
            tag: hirsute
            cc: clang
            cxx: clang++
          - name: "Clang 13 (Boost 1.79)"
            shortname: clang13
            tag: impish
            cc: clang
            cxx: clang++
          - name: "Clang 14 (Boost 1.82)"
            shortname: clang14
            tag: jammy
            cc: clang
            cxx: clang++
          - name: "Clang 15 (Boost 1.86)"
            shortname: clang15
            tag: lunar
            cc: clang
            cxx: clang++
          - name: "Clang 16 (Boost 1.86)"
            shortname: clang16
            tag: mantic
            cc: clang
            cxx: clang++
          - name: "Clang 17 (Boost 1.84)"
            shortname: clang17
            tag: clang-17
            cc: clang
            cxx: clang++
          - name: "Clang 18"
            shortname: clang18
            tag: noble
            cc: clang
            cxx: clang++
          - name: "Clang 19"
            shortname: clang19
            tag: oracular
            cc: clang
            cxx: clang++
          - name: "Clang 20"
            shortname: clang20
            tag: plucky
            cc: clang
            cxx: clang++
          - name: "C++17 mode"
            shortname: c++17
            tag: rolling
            cc: gcc
            cxx: g++
            cxxflags: "-std=c++17"
          - name: "C++20 mode"
            shortname: c++20
            tag: rolling
            cc: gcc
            cxx: g++
            cxxflags: "-std=c++20"
          - name: "C++23 mode"
            shortname: c++23
            tag: rolling
            cc: gcc
            cxx: g++
            cxxflags: "-std=c++23"
          - name: "Unity build enabled"
            shortname: unity
            tag: rolling
            cc: gcc
            cxx: g++
            configureflags: --enable-unity-build
          - name: "Intraday calculations enabled"
            shortname: intraday
            tag: rolling
            cc: gcc
            cxx: g++
            configureflags: --enable-intraday
          - name: "Throwing in cycles enabled"
            shortname: cycles
            tag: rolling
            cc: gcc
            cxx: g++
            configureflags: --enable-throwing-in-cycles --disable-faster-lazy-objects
          - name: "Indexed coupons enabled"
            shortname: indexed
            tag: rolling
            cc: gcc
            cxx: g++
            configureflags: --enable-indexed-coupons
          - name: "Standard Library classes enabled"
            shortname: stdclasses
            tag: rolling
            cc: gcc
            cxx: g++
            configureflags: --enable-std-classes
          - name: "Thread-safe observer enabled"
            shortname: threadsafe
            tag: rolling
            cc: gcc
            cxx: g++
            configureflags: --enable-thread-safe-observer-pattern
          - name: "Sessions enabled"
            shortname: sessions
            tag: rolling
            cc: gcc
            cxx: g++
            configureflags: --enable-sessions
          - name: "OpenMP enabled"
            shortname: openmp
            tag: rolling
            cc: gcc
            cxx: g++
            configureflags: --enable-openmp
          - name: "Parallel unit-test runner"
            shortname: paralleltests
            tag: rolling
            cc: gcc
            cxx: g++
            configureflags: --enable-parallel-unit-test-runner
          - name: "Null as function template"
            shortname: nullfunctions
            tag: rolling
            cc: gcc
            cxx: g++
            configureflags: --enable-null-as-functions
    container: ghcr.io/lballabio/quantlib-devenv:${{ matrix.tag }}
    steps:
    - uses: actions/checkout@v4
    - name: Compiler version
      run: |
        ${{ matrix.cc }} --version
    - name: Build
      run: |
        ./autogen.sh
        ./configure --disable-static ${{ matrix.configureflags }} CC="${{ matrix.cc }}" CXX="${{ matrix.cxx }}" CXXFLAGS="-O2 -g0 -Wall -Wno-unknown-pragmas -Werror ${{ matrix.cxxflags }}"
        cat ql/config.hpp
        make -j 4
    - name: Run tests
      run: |
        ./test-suite/quantlib-test-suite --log_level=message
    - name: Run examples
      run: |
        make check-examples
    - name: Check global header
      run: |
        echo "#include <ql/quantlib.hpp>" > test1.cpp && echo "int main() { return 0; }" >> test1.cpp
        echo "#include <ql/quantlib.hpp>" > test2.cpp
        make install
        ${{ matrix.cxx }} -O2 -g0 -Wall -Wno-unknown-pragmas -Werror ${{ matrix.cxxflags }} `quantlib-config --cflags` test1.cpp test2.cpp `quantlib-config --libs`
