Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 27 additions & 5 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ jobs:
matrix:
os: [ubuntu-latest, macos-latest]
compiler: [gcc, clang]
build_type: [Release, Debug]
preset: [release-strict, debug-full]
exclude:
- os: macos-latest
compiler: gcc
Expand All @@ -27,20 +27,42 @@ jobs:
- name: Install Conan
run: pipx install conan

- name: Install lcov (Linux)
if: runner.os == 'Linux' && matrix.preset == 'debug-full'
run: sudo apt-get install -y lcov

- name: Install lcov (macOS)
if: runner.os == 'macOS' && matrix.preset == 'debug-full'
run: brew install lcov

- name: Configure Conan profile
run: conan profile detect --force

- name: Install dependencies
run: conan install . --build=missing -s build_type=${{ matrix.build_type }}
run: |
BUILD_TYPE=$(echo "${{ matrix.preset }}" | grep -q "release" && echo "Release" || echo "Debug")
conan install . --build=missing -s build_type=$BUILD_TYPE

- name: Configure CMake
run: cmake --preset conan-${{ matrix.build_type == 'Release' && 'release' || 'debug' }}
run: cmake --preset ${{ matrix.preset }}
env:
CC: ${{ matrix.compiler == 'gcc' && 'gcc' || 'clang' }}
CXX: ${{ matrix.compiler == 'gcc' && 'g++' || 'clang++' }}

- name: Build
run: cmake --build --preset conan-${{ matrix.build_type == 'Release' && 'release' || 'debug' }}
run: cmake --build --preset ${{ matrix.preset }}

- name: Test
run: ctest --preset conan-${{ matrix.build_type == 'Release' && 'release' || 'debug' }} --output-on-failure
run: ctest --preset ${{ matrix.preset }} --output-on-failure

- name: Generate coverage report
if: matrix.preset == 'debug-full'
run: cmake --build --preset debug-full --target coverage

- name: Upload coverage to Codecov
if: matrix.preset == 'debug-full' && matrix.compiler == 'clang' && runner.os == 'Linux'
uses: codecov/codecov-action@v4
with:
files: ./build/debug-full/coverage/coverage_filtered.info
fail_ci_if_error: true
verbose: true
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ CMakeFiles/
cmake_install.cmake
Makefile
compile_commands.json
CMakeUserPresets.json

# OS files
.DS_Store
Expand Down
3 changes: 2 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,11 @@ else()
endif()

include(cmake/ConanSetup.cmake)
include(cmake/LintTargets.cmake)
include(cmake/CodeCoverage.cmake)
include(cmake/Sanitizers.cmake)

enable_testing()
add_subdirectory(src)
add_subdirectory(tests)

include(cmake/LintTargets.cmake)
146 changes: 146 additions & 0 deletions CMakePresets.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,146 @@
{
"version": 6,
"cmakeMinimumRequired": {
"major": 3,
"minor": 27,
"patch": 0
},
"configurePresets": [
{
"name": "base",
"hidden": true,
"binaryDir": "${sourceDir}/build/${presetName}",
"cacheVariables": {
"CMAKE_EXPORT_COMPILE_COMMANDS": "ON"
}
},
{
"name": "release",
"displayName": "Release",
"description": "Optimized release build",
"inherits": "base",
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Release",
"CMAKE_TOOLCHAIN_FILE": "${sourceDir}/build/Release/generators/conan_toolchain.cmake"
}
},
{
"name": "debug",
"displayName": "Debug",
"description": "Debug build with full symbols",
"inherits": "base",
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug",
"CMAKE_TOOLCHAIN_FILE": "${sourceDir}/build/Debug/generators/conan_toolchain.cmake"
}
},
{
"name": "debug-sanitizers",
"displayName": "Debug with Sanitizers",
"description": "Debug build with AddressSanitizer and UndefinedBehaviorSanitizer",
"inherits": "debug",
"cacheVariables": {
"ENABLE_SANITIZERS": "ON"
}
},
{
"name": "debug-coverage",
"displayName": "Debug with Coverage",
"description": "Debug build with code coverage instrumentation",
"inherits": "debug",
"cacheVariables": {
"ENABLE_COVERAGE": "ON"
}
},
{
"name": "debug-full",
"displayName": "Debug Full Check",
"description": "Debug build with sanitizers, coverage, and linting",
"inherits": "debug",
"cacheVariables": {
"ENABLE_SANITIZERS": "ON",
"ENABLE_COVERAGE": "ON",
"ENABLE_LINTING": "ON"
}
},
{
"name": "release-strict",
"displayName": "Release with Strict Linting",
"description": "Release build with linting enforced during compilation",
"inherits": "release",
"cacheVariables": {
"ENABLE_LINTING": "ON"
}
}
],
"buildPresets": [
{
"name": "release",
"configurePreset": "release"
},
{
"name": "debug",
"configurePreset": "debug"
},
{
"name": "debug-sanitizers",
"configurePreset": "debug-sanitizers"
},
{
"name": "debug-coverage",
"configurePreset": "debug-coverage"
},
{
"name": "debug-full",
"configurePreset": "debug-full"
},
{
"name": "release-strict",
"configurePreset": "release-strict"
}
],
"testPresets": [
{
"name": "release",
"configurePreset": "release",
"output": {
"outputOnFailure": true
}
},
{
"name": "debug",
"configurePreset": "debug",
"output": {
"outputOnFailure": true
}
},
{
"name": "debug-sanitizers",
"configurePreset": "debug-sanitizers",
"output": {
"outputOnFailure": true
}
},
{
"name": "debug-coverage",
"configurePreset": "debug-coverage",
"output": {
"outputOnFailure": true
}
},
{
"name": "debug-full",
"configurePreset": "debug-full",
"output": {
"outputOnFailure": true
}
},
{
"name": "release-strict",
"configurePreset": "release-strict",
"output": {
"outputOnFailure": true
}
}
]
}
Loading