build: modernize repo-lens skeleton and cross-platform configuration
CI / build (debug, map[compiler:appleclang os:macos-latest]) (push) Canceled after 0s
CI / build (debug, map[compiler:clang os:ubuntu-latest]) (push) Canceled after 0s
CI / build (debug, map[compiler:gcc os:ubuntu-latest]) (push) Canceled after 0s
CI / build (debug, map[compiler:msvc os:windows-latest]) (push) Canceled after 0s
CI / build (release, map[compiler:appleclang os:macos-latest]) (push) Canceled after 0s
CI / build (release, map[compiler:clang os:ubuntu-latest]) (push) Canceled after 0s
CI / build (release, map[compiler:gcc os:ubuntu-latest]) (push) Canceled after 0s
CI / build (release, map[compiler:msvc os:windows-latest]) (push) Canceled after 0s
CI / build (sanitizers, map[compiler:appleclang os:macos-latest]) (push) Canceled after 0s
CI / build (sanitizers, map[compiler:clang os:ubuntu-latest]) (push) Canceled after 0s
CI / build (sanitizers, map[compiler:gcc os:ubuntu-latest]) (push) Canceled after 0s
CI / build (sanitizers, map[compiler:msvc os:windows-latest]) (push) Canceled after 0s

Replace CPM with FetchContent and update GoogleTest to v1.18.0.
Add compiler toolchains and Debug, Release, and sanitizer presets.
Require CMake 4.0, use target properties for compiler settings,
and enable compilation database export.

Fix skeleton compilation errors and adopt trailing return types,
nodiscard execute methods, and noexcept signatures. Update CI
and project documentation without implementing any TODOs.

Validated Windows builds and tests in all three configurations.
This commit is contained in:
wilmc committed 2026-10-09 12:36:31 +02:00
1 parent dd9f0a4c3a
commit 70c43b6a68
25 files changed
+510 -176

No files matched your search

+18 -54
View File
@@ -4,7 +4,7 @@ function( target_enable_warnings _target )
if(MSVC)
target_compile_options(
${_target}
PUBLIC
PRIVATE
/W4 # Baseline reasonable warnings
/w14242 # 'identifier': conversion from 'type1' to 'type1', possible loss of data
/w14254 # 'operator': conversion from 'type1:field_bits' to 'type2:field_bits', possible loss of data
@@ -12,7 +12,7 @@ function( target_enable_warnings _target )
/w14265 # 'classname': class has virtual functions, but destructor is not virtual instances of this class may not
# be destructed correctly
/w14287 # 'operator': unsigned/negative constant mismatch
/we4289 # nonstandard extension used: 'variable': loop control variable declared in the for-loop is used outside
/w14289 # nonstandard extension used: 'variable': loop control variable declared in the for-loop is used outside
# the for-loop scope
/w14296 # 'operator': expression is always 'boolean_value'
/w14311 # 'variable': pointer truncation from 'type1' to 'type2'
@@ -29,10 +29,8 @@ function( target_enable_warnings _target )
/w14928 # illegal copy-initialization; more than one user-defined conversion has been implicitly applied
/permissive- # standards conformance mode for MSVC compiler.
)
elseif(CMAKE_CXX_COMPILER_ID MATCHES ".*Clang")
target_compile_options(
${_target}
INTERFACE
elseif(CMAKE_CXX_COMPILER_ID MATCHES "^(GNU|Clang|AppleClang)$")
set(_warnings
-Wall
-Wextra # reasonable and standard
-Wextra-semi # Warn about semicolon after in-class function definition.
@@ -52,55 +50,21 @@ function( target_enable_warnings _target )
-Wformat=2 # warn on security issues around functions that format output (ie printf)
-Wimplicit-fallthrough # warn on statements that fallthrough without an explicit annotation
)
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
target_compile_options(
${_target}
INTERFACE
-Wall
-Wextra # reasonable and standard
-Wextra-semi # Warn about semicolon after in-class function definition.
-Wshadow # warn the user if a variable declaration shadows one from a parent context
-Wnon-virtual-dtor # warn the user if a class with virtual functions has a non-virtual destructor. This helps
# catch hard to track down memory errors
-Wold-style-cast # warn for c-style casts
-Wcast-align # warn for potential performance problem casts
-Wunused # warn on anything being unused
-Woverloaded-virtual # warn if you overload (not override) a virtual function
-Wpedantic # warn if non-standard C++ is used
-Wconversion # warn on type conversions that may lose data
-Wsign-conversion # warn on sign conversions
-Wnull-dereference # warn if a null dereference is detected
-Wdouble-promotion # warn if float is implicit promoted to double
-Wformat=2 # warn on security issues around functions that format output (ie printf)
-Wimplicit-fallthrough # warn on statements that fallthrough without an explicit annotation
-Wmisleading-indentation # warn if indentation implies blocks where blocks do not exist
-Wduplicated-cond # warn if if / else chain has duplicated conditions
-Wduplicated-branches # warn if if / else branches have duplicated code
-Wlogical-op # warn about logical operations being used where bitwise were probably wanted
-Wuseless-cast # warn if you perform a cast to the same type
)
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
list(APPEND _warnings
-Wmisleading-indentation # warn if indentation implies blocks where blocks do not exist
-Wduplicated-cond # warn if if / else chain has duplicated conditions
-Wduplicated-branches # warn if if / else branches have duplicated code
-Wlogical-op # warn about logical operations being used where bitwise were probably wanted
-Wuseless-cast # warn if you perform a cast to the same type
)
endif()
target_compile_options(${_target} PRIVATE ${_warnings})
else()
message(AUTHOR_WARNING "No warning profile for ${CMAKE_CXX_COMPILER_ID}")
endif()
endfunction()
function(target_warnings_as_errors _target)
if(MSVC)
target_compile_options(
${_target}
PUBLIC
/WX
)
elseif(CMAKE_CXX_COMPILER_ID MATCHES ".*Clang")
target_compile_options(
${_target}
PUBLIC
-Werror
)
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
target_compile_options(
${_target}
PUBLIC
-Werror
)
endif()
endfunction()
set_property(TARGET ${_target} PROPERTY COMPILE_WARNING_AS_ERROR ON)
endfunction()
-33
View File
@@ -1,33 +0,0 @@
set(CPM_DOWNLOAD_VERSION 0.38.1)
if(CPM_SOURCE_CACHE)
set(CPM_DOWNLOAD_LOCATION "${CPM_SOURCE_CACHE}/cpm/CPM_${CPM_DOWNLOAD_VERSION}.cmake")
elseif(DEFINED ENV{CPM_SOURCE_CACHE})
set(CPM_DOWNLOAD_LOCATION "$ENV{CPM_SOURCE_CACHE}/cpm/CPM_${CPM_DOWNLOAD_VERSION}.cmake")
else()
set(CPM_DOWNLOAD_LOCATION "${CMAKE_BINARY_DIR}/cmake/CPM_${CPM_DOWNLOAD_VERSION}.cmake")
endif()
# Expand relative path. This is important if the provided path contains a tilde (~)
get_filename_component(CPM_DOWNLOAD_LOCATION ${CPM_DOWNLOAD_LOCATION} ABSOLUTE)
function(download_cpm)
message(STATUS "Downloading CPM.cmake to ${CPM_DOWNLOAD_LOCATION}")
file(DOWNLOAD
https://github.com/cpm-cmake/CPM.cmake/releases/download/v${CPM_DOWNLOAD_VERSION}/CPM.cmake
${CPM_DOWNLOAD_LOCATION}
)
endfunction()
if(NOT (EXISTS ${CPM_DOWNLOAD_LOCATION}))
download_cpm()
else()
# resume download if it previously failed
file(READ ${CPM_DOWNLOAD_LOCATION} check)
if("${check}" STREQUAL "")
download_cpm()
endif()
unset(check)
endif()
include(${CPM_DOWNLOAD_LOCATION})
+12 -9
View File
@@ -1,17 +1,20 @@
include_guard()
CPMAddPackage(
NAME googletest
GITHUB_REPOSITORY google/googletest
GIT_TAG v1.13.0
VERSION 1.13.0
OPTIONS
"INSTALL_GTEST OFF"
"gtest_force_shared_crt ON"
include(FetchContent)
set(INSTALL_GTEST OFF CACHE BOOL "Install GoogleTest" FORCE)
set(gtest_force_shared_crt ON CACHE BOOL "Use the shared MSVC runtime for GoogleTest" FORCE)
FetchContent_Declare(
googletest
GIT_REPOSITORY https://github.com/google/googletest.git
GIT_TAG v1.18.0
GIT_SHALLOW TRUE
)
FetchContent_MakeAvailable(googletest)
set_property(TARGET
gtest
gtest_main
gmock
gmock_main
PROPERTY FOLDER third_party/GoogleTest)
PROPERTY FOLDER third_party/GoogleTest)
+29 -15
View File
@@ -1,20 +1,34 @@
include_guard()
function( target_enable_sanitizers _target )
if( MSVC )
string(FIND "$ENV{PATH}" "$ENV{VSINSTALLDIR}" index_of_vs_install_dir)
include(CheckCXXSourceCompiles)
include(CMakePushCheckState)
if("${index_of_vs_install_dir}" STREQUAL "-1")
message(
SEND_ERROR
"Using MSVC sanitizers requires setting the MSVC environment before building the project. Please manually open the MSVC command prompt and rebuild the project."
)
endif()
target_compile_options(${_target} PUBLIC /fsanitize=address /Zi /INCREMENTAL:NO)
target_link_options(${_target} PUBLIC /INCREMENTAL:NO)
function(target_enable_sanitizers _target)
if(MSVC)
set(_compile_options /fsanitize=address)
set(_link_options /INCREMENTAL:NO)
# Use the same settings for this target and the capability check.
set_property(TARGET ${_target} PROPERTY MSVC_RUNTIME_CHECKS "")
set_property(TARGET ${_target} PROPERTY MSVC_DEBUG_INFORMATION_FORMAT ProgramDatabase)
set(CMAKE_MSVC_RUNTIME_CHECKS "")
set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT ProgramDatabase)
elseif(CMAKE_CXX_COMPILER_ID MATCHES "^(GNU|Clang|AppleClang)$")
set(_compile_options -fsanitize=address,undefined -fno-sanitize-recover=undefined -fno-omit-frame-pointer)
set(_link_options -fsanitize=address,undefined)
else()
target_compile_options(${_target} INTERFACE -fsanitize=address,leak,undefined)
target_link_options(${_target} INTERFACE -fsanitize=address,leak,undefined)
message(FATAL_ERROR "Sanitizers are not configured for ${CMAKE_CXX_COMPILER_ID}")
endif()
endfunction()
cmake_push_check_state(RESET)
string(JOIN " " CMAKE_REQUIRED_FLAGS ${_compile_options})
set(CMAKE_REQUIRED_LINK_OPTIONS ${_link_options})
set(CMAKE_TRY_COMPILE_TARGET_TYPE EXECUTABLE)
check_cxx_source_compiles("int main() { return 0; }" REPO_LENS_SANITIZERS_SUPPORTED)
cmake_pop_check_state()
if(NOT REPO_LENS_SANITIZERS_SUPPORTED)
message(FATAL_ERROR "The requested sanitizer configuration cannot compile and link. Check compiler/runtime installation or configure with ENABLE_SANITIZERS=OFF.")
endif()
target_compile_options(${_target} PRIVATE ${_compile_options})
target_link_options(${_target} PRIVATE ${_link_options})
endfunction()
+4
View File
@@ -0,0 +1,4 @@
# Apple's compiler wrappers use the active Xcode/Command Line Tools installation.
include_guard(GLOBAL)
set(CMAKE_C_COMPILER /usr/bin/clang CACHE FILEPATH "C compiler")
set(CMAKE_CXX_COMPILER /usr/bin/clang++ CACHE FILEPATH "C++ compiler")
+4
View File
@@ -0,0 +1,4 @@
# Native LLVM Clang builds; compiler executables must be on PATH.
include_guard(GLOBAL)
set(CMAKE_C_COMPILER clang CACHE FILEPATH "C compiler")
set(CMAKE_CXX_COMPILER clang++ CACHE FILEPATH "C++ compiler")
+4
View File
@@ -0,0 +1,4 @@
# Native GCC builds; compiler executables must be on PATH.
include_guard(GLOBAL)
set(CMAKE_C_COMPILER gcc CACHE FILEPATH "C compiler")
set(CMAKE_CXX_COMPILER g++ CACHE FILEPATH "C++ compiler")
+4
View File
@@ -0,0 +1,4 @@
# Run Ninja builds in a Visual Studio developer environment.
include_guard(GLOBAL)
set(CMAKE_C_COMPILER cl CACHE FILEPATH "C compiler")
set(CMAKE_CXX_COMPILER cl CACHE FILEPATH "C++ compiler")