name: Linux build with non-default configuration
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.3 (Boost 1.89)"
            shortname: gcc13
            tag: noble
            cc: gcc
            cxx: g++
          - name: "gcc 14.x"
            shortname: gcc14
            tag: plucky
            cc: gcc
            cxx: g++
          - name: "gcc 15.x"
            shortname: gcc15
            tag: questing
            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 18 (Boost 1.89)"
            shortname: clang18
            tag: noble
            cc: clang
            cxx: clang++
          - name: "Clang 19 (Boost 1.89)"
            shortname: clang19
            tag: oracular
            cc: clang
            cxx: clang++
          - name: "Clang 20"
            shortname: clang20
            tag: questing
            cc: clang
            cxx: clang++
          - name: "Clang 21"
            shortname: clang21
            tag: resolute
            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: "C++26 mode"
            shortname: c++26
            tag: rolling
            cc: gcc
            cxx: g++
            cxxflags: "-std=c++26"
          - name: "Unity build enabled"
            shortname: unity
            tag: rolling
            cc: gcc
            cxx: g++
            configureflags: --enable-unity-build
          - name: "Standard Library classes enabled"
            shortname: stdclasses
            tag: rolling
            cc: gcc
            cxx: g++
            configureflags: --enable-std-pointers --disable-std-any --disable-std-optional
          - name: "OpenMP enabled"
            shortname: openmp
            tag: rolling
            cc: gcc
            cxx: g++
            configureflags: --enable-openmp
    container: ghcr.io/lballabio/quantlib-devenv:${{ matrix.tag }}
    steps:
    - uses: actions/checkout@v6
    - name: Compiler version
      run: |
        ${{ matrix.cc }} --version
    - name: Build
      run: |
        ./autogen.sh
        ./configure --disable-static --enable-error-lines --enable-error-functions --enable-tracing --enable-indexed-coupons --enable-extra-safety-checks --enable-sessions --enable-thread-safe-observer-pattern --enable-intraday --disable-faster-lazy-objects --enable-throwing-in-cycles --enable-null-as-functions ${{ matrix.configureflags }} CC="${{ matrix.cc }}" CXX="${{ matrix.cxx }}" CPPFLAGS="-Wall -Wno-unknown-pragmas -Wno-array-bounds -Werror" CXXFLAGS="-O2 -g0 ${{ 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`
