# Copyright 2022 Alexander Grund # # Distributed under the Boost Software License, Version 1.0. # (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt) name: CI on: pull_request: push: branches: - main - develop - feature/** concurrency: group: ${{format('{0}:{1}', github.repository, github.ref)}} cancel-in-progress: true env: NET_RETRY_COUNT: 5 DOCBOOK_XSL_DIR: /usr/share/xml/docbook/stylesheet/docbook-xsl DOCBOOK_DTD_DIR: /usr/share/xml/docbook/schema/dtd/4.2 jobs: Formatting: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Formatting uses: DoozyX/clang-format-lint-action@v0.13 with: clangFormatVersion: 10 posix: defaults: run: shell: bash strategy: fail-fast: false matrix: include: # Linux, gcc - { compiler: gcc-7, cxxstd: '14,17', boostBranch: boost-1.86.0, os: ubuntu-latest, container: 'ubuntu:20.04' } - { compiler: gcc-10, cxxstd: '14,17,20', boostBranch: boost-1.86.0, os: ubuntu-22.04 } - { compiler: gcc-12, cxxstd: '14,17,20', boostBranch: master, os: ubuntu-22.04 } - { compiler: gcc-14, cxxstd: '14,17,20', boostBranch: boost-1.86.0, os: ubuntu-24.04 } - { compiler: gcc-14, cxxstd: '14,17,20', boostBranch: master, os: ubuntu-24.04 } # Linux, clang - { compiler: clang-14, cxxstd: '14,17,20', boostBranch: boost-1.86.0, os: ubuntu-24.04 } - { compiler: clang-18, cxxstd: '14,17,20', boostBranch: boost-1.86.0, os: ubuntu-24.04 } - { compiler: clang-18, cxxstd: '14,17,20', boostBranch: master, os: ubuntu-24.04 } - { name: Collect coverage, coverage: yes, compiler: gcc-8, cxxstd: '14', boostBranch: boost-1.86.0, os: ubuntu-latest, container: 'ubuntu:20.04' } timeout-minutes: 120 runs-on: ${{matrix.os}} container: ${{matrix.container}} steps: - name: Prepare container environment if: matrix.container run: | export DEBIAN_FRONTEND=noninteractive apt-get -o Acquire::Retries=$NET_RETRY_COUNT update apt-get -o Acquire::Retries=$NET_RETRY_COUNT install -y sudo software-properties-common curl lsb-release # Need (newer) git & cmake, and the older Ubuntu container may require requesting the key manually using port 80 curl -sSL --retry ${NET_RETRY_COUNT:-5} 'http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xE1DD270288B4E6030699E45FA1715D88E1DF1F24' | sudo gpg --dearmor > /etc/apt/trusted.gpg.d/git-core_ubuntu_ppa.gpg for i in {1..${NET_RETRY_COUNT:-5}}; do sudo -E add-apt-repository -y ppa:git-core/ppa && break || sleep 10; done curl -sSL --retry ${NET_RETRY_COUNT:-5} 'https://apt.kitware.com/keys/kitware-archive-latest.asc' | sudo gpg --dearmor > /etc/apt/trusted.gpg.d/kitware-archive-latest.gpg for i in {1..${NET_RETRY_COUNT:-5}}; do sudo -E add-apt-repository -y "deb https://apt.kitware.com/ubuntu/ $(lsb_release -cs) main" && break || sleep 10; done apt-get -o Acquire::Retries=$NET_RETRY_COUNT update apt-get -o Acquire::Retries=$NET_RETRY_COUNT install -y g++ git cmake git config --global pack.threads 0 git config --global --add safe.directory "$GITHUB_WORKSPACE" # Avoid ownership issues of repo in container - uses: actions/checkout@v4 with: # For coverage builds fetch the whole history, else only 1 commit using a 'fake ternary' fetch-depth: ${{ matrix.coverage && '0' || '1' }} # Checking out Boost and all its submodules takes ages... - name: Cache Boost uses: actions/cache@v4 with: path: boost-root key: boost-${{matrix.boostBranch}} - name: Checkout Boost uses: actions/checkout@v4 with: repository: boostorg/boost ref: ${{matrix.boostBranch}} submodules: true path: boost-root persist-credentials: false - name: Install packages and setup env run: | sudo apt-get -o Acquire::Retries=$NET_RETRY_COUNT update CXX=${{matrix.compiler}} CXX="${CXX/gcc-/g++-}" # Package names are g++-* and clang-*, so set this before correcting CXX for Clang pkgs="$CXX xsltproc docbook-xsl docbook-xml lcov ccache" sudo apt-get -o Acquire::Retries=$NET_RETRY_COUNT install -y $pkgs CXX="ccache ${CXX/clang-/clang++-}" echo "CXX=$CXX" >> $GITHUB_ENV echo "CC=${{matrix.compiler}}" >> $GITHUB_ENV if [[ "$CXX" =~ clang ]]; then B2_TOOLSET=clang else B2_TOOLSET=gcc fi echo "B2_TOOLSET=$B2_TOOLSET" >> $GITHUB_ENV echo "using $B2_TOOLSET : : $CXX ;" > ~/user-config.jam # Move the Boost root to a sibling folder mv boost-root .. echo "BOOST_ROOT=${{github.workspace}}/../boost-root" >> $GITHUB_ENV - name: Cache ccache uses: hendrikmuhs/ccache-action@v1 with: key: ${{matrix.os}}-${{matrix.compiler}}-${{matrix.boostBranch}} - name: Prepare boost working-directory: ${{env.BOOST_ROOT}} run: ./bootstrap.sh && ./b2 headers - name: Boost build run: | B2_FLAGS="cxxstd=${{matrix.cxxstd}}" if [[ "${{matrix.coverage}}" == "yes" ]]; then B2_FLAGS="$B2_FLAGS cxxflags=--coverage linkflags=--coverage" fi scripts/build.sh --toolset=$B2_TOOLSET $B2_FLAGS -j3 - name: Collect coverage if: matrix.coverage run: | lcov --version lcov --gcov-tool=gcov-8 --directory "$GITHUB_WORKSPACE/test" --capture --output-file all.info # dump a summary on the console lcov --list all.info # Limit to our files (header-only in this case) lcov --extract all.info "$GITHUB_WORKSPACE/include/*" --output-file coverage.info # Output what was collected lcov --list coverage.info - name: Upload coverage if: matrix.coverage uses: coverallsapp/github-action@master with: path-to-lcov: ${{github.workspace}}/coverage.info github-token: ${{secrets.GITHUB_TOKEN}} - name: Build required boost libs working-directory: ${{env.BOOST_ROOT}} run: | ./b2 --toolset=$B2_TOOLSET --with-test --with-thread --with-chrono --with-system --with-atomic --with-date_time -a -j3 # Add lib folder to LD_LIBRARY_PATH, so the tests can load them echo "LD_LIBRARY_PATH=$PWD/stage/lib:$LD_LIBRARY_PATH" >> $GITHUB_ENV - name: CMake build run: | mkdir build && cd build CXX_STANDARD="${{matrix.cxxstd}}" cmake .. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_FLAGS="-std=c++${CXX_STANDARD##*,}" -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_VERBOSE_MAKEFILE=ON cmake --build . --config Debug -- -j3 ctest --output-on-failure --build-config Debug -j3 - name: Cleanup Boost folder to reduce cache usage if: ${{ always() }} working-directory: ${{env.BOOST_ROOT}} run: git clean -fxd