diff --git a/.github/workflows/ci_linux.yml b/.github/workflows/ci_linux.yml index cbb6561..b0d519d 100644 --- a/.github/workflows/ci_linux.yml +++ b/.github/workflows/ci_linux.yml @@ -1,140 +1,65 @@ -name: CI on Linux +# SPDX-FileCopyrightText: 2006-2023, Knut Reinert & Freie Universität Berlin +# SPDX-FileCopyrightText: 2016-2023, Knut Reinert & MPI für molekulare Genetik +# SPDX-License-Identifier: CC0-1.0 + +name: Linux on: push: branches: - - 'master' - 'main' pull_request: + workflow_dispatch: concurrency: group: linux-${{ github.event.pull_request.number || github.ref }} - cancel-in-progress: true + cancel-in-progress: ${{ github.event_name != 'push' }} env: - CMAKE_VERSION: 3.10.3 - SEQAN3_NO_VERSION_CHECK: 1 TZ: Europe/Berlin defaults: run: - shell: bash -ex {0} + shell: bash -Eexuo pipefail {0} jobs: build: - name: ${{ matrix.name }} - runs-on: ubuntu-22.04 - timeout-minutes: 120 + runs-on: ubuntu-latest + name: ${{ matrix.compiler }} + if: github.repository_owner == 'seqan' || github.event_name == 'workflow_dispatch' strategy: - fail-fast: true + fail-fast: false matrix: - include: - - name: "Coverage gcc12" - cxx: "g++-12" - cc: "gcc-12" - build: coverage - build_type: Coverage - - - name: "gcc12" - cxx: "g++-12" - cc: "gcc-12" - build_type: Release - - - name: "gcc11" - cxx: "g++-11" - cc: "gcc-11" - build_type: Release - - - name: "gcc10" - cxx: "g++-10" - cc: "gcc-10" - build_type: Release - + compiler: ["clang-18", "clang-17", "gcc-14", "gcc-13", "gcc-12", "intel"] + container: + image: ghcr.io/seqan/${{ matrix.compiler }} + volumes: + - /home/runner:/home/runner steps: - name: Checkout - uses: actions/checkout@v3 - with: - path: needle - fetch-depth: 2 - submodules: recursive - - - name: Add package source - run: bash ./needle/lib/seqan3/.github/workflows/scripts/configure_apt.sh - - - name: Install CMake - run: bash ./needle/lib/seqan3/.github/workflows/scripts/install_cmake.sh - - - name: Install ccache - run: sudo apt-get install --yes ccache - - - name: Install compiler ${{ matrix.cxx }} - run: sudo apt-get install --yes ${{ matrix.cxx }} - - - name: Install lcov - if: matrix.build == 'coverage' - run: | - sudo apt-get install --yes lcov - sudo update-alternatives --install /usr/bin/gcov gcov /usr/bin/gcov-12 100 + uses: actions/checkout@v4 - name: Load ccache - uses: actions/cache@v3 + uses: actions/cache@v4 with: - path: .ccache - key: ${{ runner.os }}-${{ matrix.name }}-ccache-${{ github.ref }}-${{ github.run_number }} - # Restoring: From current branch, otherwise from base branch, otherwise from any branch. - restore-keys: | - ${{ runner.os }}-${{ matrix.name }}-ccache-${{ github.ref }} - ${{ runner.os }}-${{ matrix.name }}-ccache-${{ github.base_ref }} - ${{ runner.os }}-${{ matrix.name }}-ccache- - - - name: Tool versions - run: | - env cmake --version - env ${{ matrix.cxx }} --version + path: /home/runner/.ccache + save-always: true + key: ccache-${{ runner.os }}-${{ github.workflow }}-${{ matrix.compiler }}-${{ github.ref }} - name: Configure tests - env: - CXX: ${{ matrix.cxx }} - CC: ${{ matrix.cc }} run: | - mkdir build - cd build - cmake ../needle -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} -DCMAKE_CXX_FLAGS="${{ matrix.cxx_flags }} -Wno-interference-size" + mkdir build && cd build + cmake .. -DCMAKE_BUILD_TYPE=Release + make gtest_main - name: Build tests - env: - CCACHE_BASEDIR: ${{ github.workspace }} - CCACHE_DIR: ${{ github.workspace }}/.ccache - CCACHE_COMPRESS: true - CCACHE_COMPRESSLEVEL: 6 - CCACHE_MAXSIZE: 500M - run: | - ccache -p || true - cd build - make -k -j2 api_test cli_test - ccache -s || true - - - name: Generate coverage baseline - if: matrix.build == 'coverage' + working-directory: build run: | - lcov --directory ./build/ --zerocounters - lcov --directory ./build/ --capture --initial --output-file ./build/coverage_report.baseline + ccache -z + make -k tests + ccache -svvx - name: Run tests - run: | - cd build - ctest . -j2 --output-on-failure + working-directory: build + run: ctest -j --output-on-failure --test-dir test - - name: Generate coverage report - if: matrix.build == 'coverage' - run: | - lcov --directory ./build/ --capture --output-file ./build/coverage_report.captured - lcov -a ./build/coverage_report.baseline -a ./build/coverage_report.captured --output-file ./build/coverage_report.total - lcov --remove ./build/coverage_report.total '/usr/*' '${{ github.workspace }}/needle/lib/*' '${{ github.workspace }}/needle/test/*' '${{ github.workspace }}/build/vendor/*' --output-file ./build/coverage_report - - - name: Submit coverage report - if: matrix.build == 'coverage' - uses: codecov/codecov-action@v2 - with: - files: ${{ github.workspace }}/build/coverage_report - root_dir: ${{ github.workspace }}/needle diff --git a/.github/workflows/ci_macos.yml b/.github/workflows/ci_macos.yml index 3e74e3b..bdd7397 100644 --- a/.github/workflows/ci_macos.yml +++ b/.github/workflows/ci_macos.yml @@ -1,115 +1,59 @@ -name: CI on macOS +# SPDX-FileCopyrightText: 2006-2024 Knut Reinert & Freie Universität Berlin +# SPDX-FileCopyrightText: 2016-2024 Knut Reinert & MPI für molekulare Genetik +# SPDX-License-Identifier: CC0-1.0 + +name: macOS on: push: branches: - - 'master' - 'main' pull_request: + workflow_dispatch: concurrency: group: macos-${{ github.event.pull_request.number || github.ref }} - cancel-in-progress: true + cancel-in-progress: ${{ github.event_name != 'push' }} env: - CMAKE_VERSION: 3.10.3 - SEQAN3_NO_VERSION_CHECK: 1 TZ: Europe/Berlin defaults: run: - shell: bash -ex {0} + shell: bash -Eeuxo pipefail {0} jobs: build: - name: ${{ matrix.name }} - runs-on: macos-12 - timeout-minutes: 120 + name: ${{ matrix.compiler }} + runs-on: macos-14 + if: github.repository_owner == 'seqan' || github.event_name == 'workflow_dispatch' strategy: - fail-fast: true + fail-fast: false matrix: - include: - - name: "gcc12" - cxx: "g++-12" - cc: "gcc-12" - build_type: Release - - - name: "gcc11" - cxx: "g++-11" - cc: "gcc-11" - build_type: Release - - - name: "gcc10" - cxx: "g++-10" - cc: "gcc-10" - build_type: Release - + compiler: ["clang-18", "clang-17", "gcc-14", "gcc-13", "gcc-12"] steps: - name: Checkout - uses: actions/checkout@v3 - with: - path: needle - fetch-depth: 2 - submodules: recursive - - - name: Configure Homebrew - uses: Homebrew/actions/setup-homebrew@master + uses: actions/checkout@v4 - - name: Install CMake - run: bash ./needle/lib/seqan3/.github/workflows/scripts/install_cmake.sh - - - name: Install ccache - run: bash ./needle/lib/seqan3/.github/workflows/scripts/install_via_brew.sh ccache - - - name: Install compiler ${{ matrix.cxx }} - run: bash ./needle/lib/seqan3/.github/workflows/scripts/install_via_brew.sh gcc $(echo "${{ matrix.cxx }}" | sed "s/g++-//g") - - - name: Load ccache - uses: actions/cache@v3 + - name: Setup toolchain + uses: seqan/actions/setup-toolchain@main with: - path: .ccache - key: ${{ runner.os }}-${{ matrix.name }}-ccache-${{ github.ref }}-${{ github.run_number }} - # Restoring: From current branch, otherwise from base branch, otherwise from any branch. - restore-keys: | - ${{ runner.os }}-${{ matrix.name }}-ccache-${{ github.ref }} - ${{ runner.os }}-${{ matrix.name }}-ccache-${{ github.base_ref }} - ${{ runner.os }}-${{ matrix.name }}-ccache- - - - name: Tool versions - run: | - env cmake --version - env ${{ matrix.cxx }} --version - sudo xcode-select -s '/Applications/Xcode_13.4.1.app/Contents/Developer' # https://github.com/actions/runner-images/issues/6350 + compiler: ${{ matrix.compiler }} + ccache_size: 75M - name: Configure tests - env: - CXX: ${{ matrix.cxx }} - CC: ${{ matrix.cc }} run: | - mkdir build - cd build - cmake ../needle -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} -DCMAKE_CXX_FLAGS="${{ matrix.cxx_flags }} -Wno-interference-size" + mkdir build && cd build + cmake .. -DCMAKE_BUILD_TYPE=Release + make gtest_main - - name: Build application - env: - CCACHE_BASEDIR: ${{ github.workspace }} - CCACHE_DIR: ${{ github.workspace }}/.ccache - CCACHE_COMPRESS: true - CCACHE_COMPRESSLEVEL: 6 - CCACHE_MAXSIZE: 500M + - name: Build tests + working-directory: build run: | - ccache -p || true - cd build - make -k -j3 - ccache -s || true + ccache -z + make -k tests + ccache -svvx - - name: Build and run tests - env: - CCACHE_BASEDIR: ${{ github.workspace }} - CCACHE_DIR: ${{ github.workspace }}/.ccache - CCACHE_COMPRESS: true - CCACHE_COMPRESSLEVEL: 6 - CCACHE_MAXSIZE: 500M - run: | - cd build - ctest . -j3 --output-on-failure + - name: Run tests + working-directory: build + run: ctest -j --output-on-failure --test-dir test diff --git a/.github/workflows/ci_misc.yml b/.github/workflows/ci_misc.yml deleted file mode 100644 index 7ea63ad..0000000 --- a/.github/workflows/ci_misc.yml +++ /dev/null @@ -1,137 +0,0 @@ -name: CI misc - -on: - push: - branches: - - 'master' - - 'main' - pull_request: - -concurrency: - group: misc-${{ github.event.pull_request.number || github.ref }} - cancel-in-progress: true - -env: - SEQAN3_NO_VERSION_CHECK: 1 - TZ: Europe/Berlin - -defaults: - run: - shell: bash -ex {0} - -jobs: - build: - name: ${{ matrix.name }} - runs-on: ubuntu-22.04 - timeout-minutes: 120 - strategy: - fail-fast: false - matrix: - include: - - name: "Documentation" - build: documentation - build_threads: 2 - test_threads: 2 - cmake: 3.10.3 - doxygen: 1.9.4 - requires_toolchain: false - requires_ccache: false - skip_build_tests: true - skip_run_tests: false - - steps: - - name: Checkout - uses: actions/checkout@v3 - with: - path: needle - fetch-depth: 2 - submodules: recursive - - - name: Add package source - run: bash ./needle/lib/seqan3/.github/workflows/scripts/configure_apt.sh - - - name: Install CMake - env: - BUILD: ${{ matrix.build }} - CMAKE_VERSION: ${{ matrix.cmake }} - run: bash ./needle/lib/seqan3/.github/workflows/scripts/install_cmake.sh - - - name: Install Doxygen - if: matrix.build == 'documentation' - env: - DOXYGEN_VERSION: ${{ matrix.doxygen }} - run: bash ./needle/lib/seqan3/.github/workflows/scripts/install_doxygen.sh - - - name: Install ccache - if: matrix.requires_ccache - run: sudo apt-get install --yes ccache - - - name: Install compiler ${{ matrix.cxx }} - if: matrix.requires_toolchain - run: sudo apt-get install --yes ${{ matrix.cxx }} - - - name: Load ccache - if: matrix.requires_ccache - uses: actions/cache@v3 - with: - path: .ccache - key: ${{ matrix.name }}-ccache-${{ github.ref }}-${{ github.run_number }} - # Restoring: From current branch, otherwise from base branch, otherwise from any branch. - restore-keys: | - ${{ matrix.name }}-ccache-${{ github.ref }} - ${{ matrix.name }}-ccache-${{ github.base_ref }} - ${{ matrix.name }}-ccache- - - - name: Tool versions - run: | - env cmake --version - env doxygen --version || true - env ${{ matrix.cxx }} --version || true - - - name: Configure tests - env: - CXX: ${{ matrix.cxx }} - CC: ${{ matrix.cc }} - run: | - mkdir build - cd build - cmake ../needle -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} -DCMAKE_CXX_FLAGS="${{ matrix.cxx_flags }} -Wno-interference-size" - - - name: Build tests - if: ${{!matrix.skip_build_tests}} - env: - CCACHE_BASEDIR: ${{ github.workspace }} - CCACHE_DIR: ${{ github.workspace }}/.ccache - CCACHE_COMPRESS: true - CCACHE_COMPRESSLEVEL: 6 - CCACHE_MAXSIZE: 500M - run: | - ccache -p || true - cd build - make -k -j${{ matrix.build_threads }} - ccache -s || true - - - name: Run tests - if: ${{!matrix.skip_run_tests}} - run: | - cd build - if [[ "${{ matrix.build }}" =~ ^(documentation)$ ]]; then - make -k -j2 doc 2>doxygen_warnings.txt - cat doxygen_warnings.txt - test ! -s doxygen_warnings.txt - else - ctest . -j${{ matrix.test_threads }} --output-on-failure - fi - - - name: Package documentation - if: matrix.build == 'documentation' - continue-on-error: true - run: tar -zcf documentation.tar.gz build - - - name: Upload documentation - if: matrix.build == 'documentation' - continue-on-error: true - uses: actions/upload-artifact@v3 - with: - name: documentation - path: documentation.tar.gz diff --git a/.github/workflows/ci_sanitizer.yml b/.github/workflows/ci_sanitizer.yml new file mode 100644 index 0000000..c8891db --- /dev/null +++ b/.github/workflows/ci_sanitizer.yml @@ -0,0 +1,99 @@ +# SPDX-FileCopyrightText: 2006-2024 Knut Reinert & Freie Universität Berlin +# SPDX-FileCopyrightText: 2016-2024 Knut Reinert & MPI für molekulare Genetik +# SPDX-License-Identifier: CC0-1.0 + +name: Sanitizer + +on: + schedule: + - cron: "0 6 * * SAT" + workflow_dispatch: + +concurrency: + group: sanitizer-actions + cancel-in-progress: true + +env: + TZ: Europe/Berlin + ASAN_OPTIONS: strict_string_checks=1:detect_stack_use_after_return=1:check_initialization_order=1:strict_init_order=1:detect_leaks=1 + TSAN_OPTIONS: ignore_noninstrumented_modules=1 + UBSAN_OPTIONS: print_stacktrace=1 + +defaults: + run: + shell: bash -Eeuxo pipefail {0} + +jobs: + build: + name: ${{ matrix.name }} ${{ matrix.build_type }} ${{ matrix.os }} + runs-on: ${{ matrix.os }} + if: github.repository_owner == 'seqan' || github.event_name == 'workflow_dispatch' + strategy: + fail-fast: false + matrix: + name: [ASan, TSan, UBSan] + os: [ubuntu-latest, macos-14] + build_type: [Release, RelWithDebInfo, Debug] + exclude: + - name: "TSan" + os: macos-14 + include: + - name: "ASan" + os: ubuntu-latest + cxx_flags: "-fno-omit-frame-pointer -fsanitize=address -Wno-maybe-uninitialized" + + - name: "ASan" + os: macos-14 + cxx_flags: "-fno-omit-frame-pointer -fsanitize=address" + + - name: "TSan" + cxx_flags: "-fno-omit-frame-pointer -fsanitize=thread" + + - name: "UBSan" + os: ubuntu-latest + cxx_flags: "-fno-omit-frame-pointer -fsanitize=undefined,float-divide-by-zero" + + - name: "UBSan" + os: macos-14 + cxx_flags: "-fno-omit-frame-pointer -fsanitize=undefined,float-divide-by-zero,local-bounds,nullability -fno-sanitize=function -Wno-pass-failed" + + - os: macos-14 + compiler: clang-18 + + - os: ubuntu-latest + compiler: gcc-14 + image: ghcr.io/seqan/gcc-14 + + - name: "TSan" + os: ubuntu-latest + compiler: clang-18 + image: ghcr.io/seqan/clang-18 + container: + image: ${{ matrix.image || '' }} + volumes: + - /home/runner:/home/runner + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup compiler + if: contains(matrix.os, 'macos') + uses: seqan/actions/setup-compiler@main + with: + compiler: ${{ matrix.compiler }} + + - name: Configure tests + run: | + mkdir build && cd build + cmake .. -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} \ + -DCMAKE_CXX_FLAGS="${{ matrix.cxx_flags }}" + make gtest_main + + - name: Build tests + working-directory: build + run: make -k tests + + - name: Run tests + working-directory: build + run: ctest -j --output-on-failure --test-dir test +