Skip to content
Merged
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
8 changes: 4 additions & 4 deletions .github/workflows/cpp.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,14 @@ jobs:

test:
needs: formatting-check
name: "Test (${{ matrix.toolchain.os }}/${{ matrix.toolchain.compiler }}, ${{ matrix.build-type }})"
name: "Test (${{ matrix.toolchain.os }}/${{ matrix.toolchain.compiler-id }}, ${{ matrix.build-type }})"

strategy:
fail-fast: false
matrix:
toolchain:
- { os: Linux, compiler: GCC, runner-label: gcc-14 }
- { os: Linux, compiler: Clang, runner-label: clang-19 }
- { os: Linux, compiler-id: GCC, runner-label: gcc-14 }
- { os: Linux, compiler-id: Clang, runner-label: clang-19 }
build-type:
- Release
- Debug
Expand All @@ -42,7 +42,7 @@ jobs:
runs-on: [self-hosted, ubuntu, base, "${{ matrix.toolchain.runner-label }}"]

env:
CT_CMAKE_PRESET: "CI-${{ matrix.toolchain.compiler }}-${{ matrix.build-type }}"
CT_CMAKE_PRESET: "Default-${{ matrix.build-type }}"

defaults:
run:
Expand Down
18 changes: 8 additions & 10 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
cmake_minimum_required(VERSION 3.21...3.31)
cmake_minimum_required(VERSION 3.24...3.31)

list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
include(SetupToolchain)
include(ConfigureTarget)
include(ConfigureCompiler)
include(CompilerWarnings)

project(template LANGUAGES CXX)
Expand All @@ -12,27 +11,26 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

ct_configure_compiler()
include(Dependencies)

# Setup a 'solution' target
file(GLOB SOLUTION_SRC CONFIGURE_DEPENDS src/*.cpp src/*.h)
add_library(solution ${SOLUTION_SRC})
target_include_directories(solution PUBLIC src)
set_target_properties(solution PROPERTIES LINKER_LANGUAGE CXX)
ct_configure_target(solution)
ct_set_compiler_warnings(solution)

# Setup a 'tests' target
file(GLOB TESTS_SRC CONFIGURE_DEPENDS test/*.cpp test/*.h)
add_executable(tests ${TESTS_SRC})
target_include_directories(tests PRIVATE test)
ct_configure_target(tests)
ct_set_compiler_warnings(tests)

# Link tests with solution
target_link_libraries(tests PRIVATE solution)

# Link tests with dependencies
find_package(Catch2 REQUIRED)
find_package(Catch2 CONFIG REQUIRED)
target_link_libraries(tests PRIVATE Catch2::Catch2WithMain)

# Enable warnings
option(CT_TREAT_WARNINGS_AS_ERRORS "Treat warnings as errors" OFF)
ct_set_compiler_warnings(solution ${CT_TREAT_WARNINGS_AS_ERRORS})
ct_set_compiler_warnings(tests ${CT_TREAT_WARNINGS_AS_ERRORS})
72 changes: 0 additions & 72 deletions CMakePresets.json
Original file line number Diff line number Diff line change
Expand Up @@ -52,78 +52,6 @@
"cacheVariables": {
"CT_SANITIZED": "ON"
}
},
{
"name": "CI-Linux",
"description": "Base preset for CI builds on Linux",
"hidden": true,
"inherits": "Base",
"cacheVariables": {
"CT_TRIPLET_TEMPLATE": "${sourceDir}/cmake/vcpkg-triplet-templates/ct-x64-linux.cmake.in",
"CT_TOOLCHAIN_TEMPLATE": "${sourceDir}/cmake/toolchain-templates/ci.cmake.in"
}
},
{
"name": "CI-GCC",
"description": "Base preset for Linux/GCC CI builds",
"hidden": true,
"inherits": "CI-Linux",
"cacheVariables": {
"CT_C_EXE": "gcc-14",
"CT_CXX_EXE": "gcc-14",
"CT_COMPILER_ID": "GNU"
}
},
{
"name": "CI-Clang",
"description": "Base preset for Linux/Clang CI builds",
"hidden": true,
"inherits": "CI-Linux",
"cacheVariables": {
"CT_C_EXE": "clang-19",
"CT_CXX_EXE": "clang++-19",
"CT_COMPILER_ID": "Clang"
}
},
{
"name": "CI-GCC-Release",
"inherits": ["CI-GCC", "Default-Release"]
},
{
"name": "CI-GCC-Debug",
"inherits": ["CI-GCC", "Default-Debug"]
},
{
"name": "CI-GCC-RelWithDebInfo",
"inherits": ["CI-GCC", "Default-RelWithDebInfo"]
},
{
"name": "CI-GCC-Sanitized",
"inherits": ["CI-GCC", "Default-Sanitized"]
},
{
"name": "CI-GCC-SanitizedDebug",
"inherits": ["CI-GCC", "Default-SanitizedDebug"]
},
{
"name": "CI-Clang-Release",
"inherits": ["CI-Clang", "Default-Release"]
},
{
"name": "CI-Clang-Debug",
"inherits": ["CI-Clang", "Default-Debug"]
},
{
"name": "CI-Clang-RelWithDebInfo",
"inherits": ["CI-Clang", "Default-RelWithDebInfo"]
},
{
"name": "CI-Clang-Sanitized",
"inherits": ["CI-Clang", "Default-Sanitized"]
},
{
"name": "CI-Clang-SanitizedDebug",
"inherits": ["CI-Clang", "Default-SanitizedDebug"]
}
]
}
6 changes: 4 additions & 2 deletions cmake/CompilerWarnings.cmake
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
function(ct_set_compiler_warnings TARGET TREAT_WARNINGS_AS_ERRORS)
option(CT_TREAT_WARNINGS_AS_ERRORS "Treat warnings as errors" OFF)

function(ct_set_compiler_warnings TARGET)

set(GCC_CLANG_COMMON_WARNINGS
-Wall -Wextra # baseline reasonable and standard warnings
Expand Down Expand Up @@ -30,7 +32,7 @@ function(ct_set_compiler_warnings TARGET TREAT_WARNINGS_AS_ERRORS)

set(MSVC_WARNINGS /W4 /permissive-)

if(TREAT_WARNINGS_AS_ERRORS)
if(CT_TREAT_WARNINGS_AS_ERRORS)
message(STATUS "Warnings are treated as errors")
list(APPEND GCC_WARNINGS -Werror -pedantic-errors)
list(APPEND CLANG_WARNINGS -Werror -pedantic-errors)
Expand Down
84 changes: 43 additions & 41 deletions cmake/ConfigureCompiler.cmake
Original file line number Diff line number Diff line change
@@ -1,65 +1,67 @@
function(ct_set_compiler C_EXE CXX_EXE)
find_program(C_EXE_PATH "${C_EXE}")
find_program(CXX_EXE_PATH "${CXX_EXE}")
option(CT_HARDENED "Should the standard library be hardened" OFF)
option(CT_SANITIZED "Should the build be sanitized" OFF)

if(NOT C_EXE_PATH OR NOT CXX_EXE_PATH)
message(FATAL_ERROR "Could not find a requested compiler (C_EXE=${C_EXE}, CXX_EXE=${CXX_EXE})")
endif()

set(CMAKE_C_COMPILER "${C_EXE_PATH}")
set(CMAKE_CXX_COMPILER "${CXX_EXE_PATH}")
endfunction()
function(ct_configure_compiler)

function(ct_configure_compiler COMPILER_ID HARDENED SANITIZED STABLE_ABI)
set(IS_GCC OFF)
set(IS_CLANG OFF)
set(isGCC OFF)
set(isClang OFF)
set(isMSVC OFF)

if(COMPILER_ID STREQUAL "GNU")
set(IS_GCC ON)
elseif(COMPILER_ID MATCHES "Clang")
set(IS_CLANG ON)
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
set(isGCC ON)
elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
set(isClang ON)
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
set(isMSVC ON)
endif()

set(CT_COMPILER_FLAGS "")
set(CT_LINKER_FLAGS "")
set(compilerOptions "")
set(compilerDefinitions "")
set(linkerOptions "")

if(IS_CLANG AND NOT STABLE_ABI)
set(CT_COMPILER_FLAGS "${CT_COMPILER_FLAGS} -stdlib=libc++")
set(CT_LINKER_FLAGS "${CT_LINKER_FLAGS} -stdlib=libc++")
if(isClang)
list(APPEND compilerOptions -stdlib=libc++)
list(APPEND linkerOptions -stdlib=libc++)
message(STATUS "Using libc++ as a standard library")
endif()

if(HARDENED AND NOT STABLE_ABI)
if(IS_GCC)
set(CT_COMPILER_FLAGS "${CT_COMPILER_FLAGS} -D_GLIBCXX_DEBUG")
if(CT_HARDENED)
if(isGCC)
list(APPEND compilerDefinitions _GLIBCXX_DEBUG)
message(STATUS "Enabled debug mode for libstdc++")
elseif(IS_CLANG)
set(CT_COMPILER_FLAGS "${CT_COMPILER_FLAGS} -D_LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_DEBUG")
elseif(isClang)
list(APPEND compilerDefinitions _LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_DEBUG)
message(STATUS "Enabled hardening mode for libc++")
else()
message(WARNING "Hardening is not supported for CXX compiler: '${COMPILER_ID}'")
# TODO: https://github.com/microsoft/STL/wiki/STL-Hardening
message(STATUS "Hardening is not supported for CXX compiler: '${COMPILER_ID}'")
endif()
endif()

if(SANITIZED)
if(IS_GCC OR IS_CLANG)
set(CT_COMPILER_FLAGS "${CT_COMPILER_FLAGS} -fsanitize=undefined,address")
set(CT_LINKER_FLAGS "${CT_LINKER_FLAGS} -fsanitize=undefined,address")
string(JOIN " " CT_COMPILER_FLAGS
"${CT_COMPILER_FLAGS}"
"-fno-sanitize-recover=all"
"-fno-optimize-sibling-calls"
"-fno-omit-frame-pointer"
if(CT_SANITIZED)
if(isGCC OR isClang)
list(APPEND compilerOptions -fsanitize=undefined,address)
list(APPEND linkerOptions -fsanitize=undefined,address)
list(APPEND compilerOptions
-fno-sanitize-recover=all
-fno-optimize-sibling-calls
-fno-omit-frame-pointer
)
message(STATUS "Enabled UBSan and ASan")
elseif(isMSVC)
list(APPEND compilerOptions /fsanitize=address)
message(STATUS "Enabled ASan")
else()
message(WARNING "Sanitized builds are not supported for CXX compiler: '${COMPILER_ID}'")
endif()
endif()

message(STATUS "New compiler flags: ${CT_COMPILER_FLAGS}")
message(STATUS "New linker flags: ${CT_LINKER_FLAGS}")
message(STATUS "Setting global compiler options: ${compilerOptions}")
message(STATUS "Setting global compiler definitions: ${compilerDefinitions}")
message(STATUS "Setting global linker options: ${linkerOptions}")

add_compile_options(${compilerOptions})
add_compile_definitions(${compilerDefinitions})
add_link_options(${linkerOptions})

set(CT_COMPILER_FLAGS ${CT_COMPILER_FLAGS} PARENT_SCOPE)
set(CT_LINKER_FLAGS ${CT_LINKER_FLAGS} PARENT_SCOPE)
endfunction()
15 changes: 0 additions & 15 deletions cmake/ConfigureTarget.cmake

This file was deleted.

9 changes: 9 additions & 0 deletions cmake/Dependencies.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
include(FetchContent)

message(STATUS "Fetching Catch2...")
FetchContent_Declare(
Catch2
URL https://github.com/catchorg/Catch2/archive/refs/tags/v3.8.0.tar.gz
FIND_PACKAGE_ARGS
)
FetchContent_MakeAvailable(Catch2)
48 changes: 0 additions & 48 deletions cmake/FetchVcpkg.cmake

This file was deleted.

25 changes: 0 additions & 25 deletions cmake/GenerateToolchain.cmake

This file was deleted.

5 changes: 0 additions & 5 deletions cmake/SetupToolchain.cmake

This file was deleted.

12 changes: 0 additions & 12 deletions cmake/toolchain-templates/ci.cmake.in

This file was deleted.

Loading