From 0a8f9fe7d2f423a6f0ecf7502c9cfd7b1a60291a Mon Sep 17 00:00:00 2001 From: Chuck Walbourn Date: Tue, 8 Oct 2024 14:12:52 -0700 Subject: [PATCH] Add Code Coverage support using CMake --- CMakeLists.txt | 6 ++++++ CMakePresets.json | 26 +++++++++++++++++++++++--- build/CompilerAndLinker.cmake | 19 +++++++++++++++++-- 3 files changed, 46 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 25bc0df8..ee544b55 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -32,6 +32,8 @@ option(DISABLE_MSVC_ITERATOR_DEBUGGING "Disable iterator debugging in Debug conf option(ENABLE_CODE_ANALYSIS "Use Static Code Analysis on build" OFF) +option(ENABLE_CODE_COVERAGE "Build with code-coverage" OFF) + option(USE_PREBUILT_SHADERS "Use externally built HLSL shaders" OFF) option(NO_WCHAR_T "Use legacy wide-character as unsigned short" OFF) @@ -519,6 +521,10 @@ if(WIN32 AND (NOT WINDOWS_STORE) AND (NOT (DEFINED XBOX_CONSOLE_TARGET))) if(BUILD_TESTING AND (EXISTS "${CMAKE_CURRENT_LIST_DIR}/Tests/CMakeLists.txt")) enable_testing() add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/Tests) + + if(ENABLE_CODE_COVERAGE AND (DEFINED COV_COMPILER_SWITCHES)) + target_compile_options(${PROJECT_NAME} PRIVATE ${COV_COMPILER_SWITCHES}) + endif() elseif(BUILD_FUZZING AND (EXISTS "${CMAKE_CURRENT_LIST_DIR}/Tests/fuzzloaders/CMakeLists.txt")) message(STATUS "Building for fuzzing") add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/Tests/fuzzloaders) diff --git a/CMakePresets.json b/CMakePresets.json index 9eeca501..43e459f9 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -198,6 +198,24 @@ "strategy": "external" } }, + + { + "name": "Analyze", + "cacheVariables": + { + "ENABLE_CODE_ANALYSIS": true + }, + "hidden": true + }, + { + "name": "Coverage", + "cacheVariables": + { + "BUILD_TOOLS": false, + "ENABLE_CODE_COVERAGE": true + }, + "hidden": true + }, { "name": "Fuzzing", "cacheVariables": { @@ -294,9 +312,11 @@ { "name": "x64-Debug-ICX" , "description": "Intel oneAPI Compiler (Debug) for Windows 8", "inherits": [ "base", "x64", "Debug", "IntelLLVM" ] }, { "name": "x64-Release-ICX" , "description": "Intel oneAPI Compiler (Release) for Windows 8", "inherits": [ "base", "x64", "Release", "IntelLLVM" ] }, - { "name": "x64-Fuzzing" , "description": "MSVC for x64 (Release) with ASan", "inherits": [ "base", "x64", "Release", "MSVC", "Win10", "Fuzzing" ] }, - { "name": "x64-Analyze" , "description": "MSVC for x64 (Debug) for Windows 8 using /analyze", "inherits": [ "base", "x64", "Debug", "MSVC" ], "cacheVariables": { "ENABLE_CODE_ANALYSIS": true } }, - { "name": "x64-Analyze-Win10" , "description": "MSVC for x64 (Debug) for Windows 10 using /analyze", "inherits": [ "base", "x64", "Debug", "MSVC", "Win10" ], "cacheVariables": { "ENABLE_CODE_ANALYSIS": true } } + { "name": "x64-Analyze" , "description": "MSVC for x64 (Debug) for Windows 8 using /analyze", "inherits": [ "base", "x64", "Debug", "MSVC", "Analyze" ] }, + { "name": "x64-Analyze-Win10" , "description": "MSVC for x64 (Debug) for Windows 10 using /analyze", "inherits": [ "base", "x64", "Debug", "MSVC", "Win10", "Analyze" ] }, + { "name": "x64-Coverage" , "description": "MSVC for x64 (Debug) w/ Code Coverage", "inherits": [ "base", "x64", "Debug", "MSVC", "Coverage" ] }, + { "name": "x64-Coverage-Clang", "description": "Clang/LLVM for x64 (Debug) w/ Code Coverage", "inherits": [ "base", "x64", "Debug", "Clang", "Coverage" ] }, + { "name": "x64-Fuzzing" , "description": "MSVC for x64 (Release) with ASan", "inherits": [ "base", "x64", "Release", "MSVC", "Win10", "Fuzzing" ] } ], "testPresets": [ { "name": "x64-Debug" , "configurePreset": "x64-Debug" }, diff --git a/build/CompilerAndLinker.cmake b/build/CompilerAndLinker.cmake index 6fb54475..2c0ac78d 100644 --- a/build/CompilerAndLinker.cmake +++ b/build/CompilerAndLinker.cmake @@ -49,7 +49,7 @@ if(MSVC) list(APPEND COMPILER_SWITCHES "$<$>:/guard:cf>") list(APPEND LINKER_SWITCHES /DYNAMICBASE /NXCOMPAT /INCREMENTAL:NO) - if((${DIRECTX_ARCH} MATCHES "x86") + if((${DIRECTX_ARCH} STREQUAL "x86") OR ((CMAKE_SIZEOF_VOID_P EQUAL 4) AND (NOT (${DIRECTX_ARCH} MATCHES "^arm")))) list(APPEND LINKER_SWITCHES /SAFESEH) endif() @@ -71,7 +71,7 @@ if(XBOX_CONSOLE_TARGET STREQUAL "scarlett") elseif(XBOX_CONSOLE_TARGET MATCHES "xboxone|durango") list(APPEND COMPILER_SWITCHES $,/favor:AMD64 /arch:AVX,-march=btver2>) elseif(NOT (${DIRECTX_ARCH} MATCHES "^arm")) - if((${DIRECTX_ARCH} MATCHES "x86") OR (CMAKE_SIZEOF_VOID_P EQUAL 4)) + if((${DIRECTX_ARCH} STREQUAL "x86") OR (CMAKE_SIZEOF_VOID_P EQUAL 4)) set(ARCH_SSE2 $<$:/arch:SSE2> $<$>:-msse2>) else() set(ARCH_SSE2 $<$>:-msse2>) @@ -207,3 +207,18 @@ if(CMAKE_CXX_COMPILER_ID MATCHES "MSVC") set(ASAN_SWITCHES /fsanitize=address /fsanitize-coverage=inline-8bit-counters /fsanitize-coverage=edge /fsanitize-coverage=trace-cmp /fsanitize-coverage=trace-div) set(ASAN_LIBS sancov.lib) endif() + +#--- Code coverage +if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") + set(COV_COMPILER_SWITCHES --coverage -g) + + if(${DIRECTX_ARCH} STREQUAL "x64") + set(COV_LIBS clang_rt.profile-x86_64.lib) + elseif(${DIRECTX_ARCH} STREQUAL "x86") + set(COV_LIBS clang_rt.profile-i386.lib) + elseif(${DIRECTX_ARCH} STREQUAL "arm64") + set(COV_LIBS clang_rt.profile-aarch64.lib) + endif() +elseif((CMAKE_CXX_COMPILER_ID MATCHES "MSVC") AND (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.33)) + set(COV_LINKER_SWITCHES /PROFILE) +endif()