@@ -3,9 +3,8 @@ project(chesslib LANGUAGES CXX)
33
44set (CMAKE_CXX_STANDARD 17)
55set (CMAKE_CXX_STANDARD_REQUIRED ON )
6-
6+ option ( ENABLE_COVERAGE "Enable coverage reporting" OFF )
77# --- Compiler tuning ---
8- set (SAN_ENABLED OFF CACHE BOOL "Whether to enable ASan or not" )
98if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang" )
109 if (CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC" )
1110 # clang-cl: forward GCC/Clang style constexpr flags via /clang:
@@ -22,16 +21,21 @@ if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
2221 -fconstexpr-steps=2000000000
2322 -fconstexpr-depth=1024
2423 -march=native -mtune=native
25- -ftemplate-backtrace-limit=0
24+ -ftemplate-backtrace-limit=0 -static
2625 )
2726 endif ()
2827elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" )
29- add_compile_options (-fconstexpr-ops-limit=2000000000 -fconstexpr-depth=1024 -march=native -mtune=native -ftemplate-backtrace-limit=0 )
28+ add_compile_options (-fconstexpr-ops-limit=2000000000 -fconstexpr-depth=1024 -march=native -mtune=native -ftemplate-backtrace-limit=0 -static )
29+
3030elseif (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC" )
3131 set (ARCH_FLAG "/arch:AVX2" CACHE STRING "MSVC architecture flag (/arch:SSE2, /arch:AVX, /arch:AVX2, /arch:AVX512)" )
3232 add_compile_options (/constexpr:steps2000000000 /constexpr:depth1024 ${ARCH_FLAG} )
3333endif ()
3434
35+ if (ENABLE_COVERAGE)
36+ set (CMAKE_BUILD_TYPE Debug CACHE STRING "" FORCE )
37+ set (CMAKE_INTERPROCEDURAL_OPTIMIZATION OFF )
38+ endif ()
3539add_compile_definitions (GENERATE_AT_RUNTIME )
3640if (CMAKE_BUILD_TYPE MATCHES "Debug" )
3741 add_compile_definitions (_DEBUG )
@@ -64,4 +68,106 @@ target_include_directories(test_chess PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${doct
6468target_link_libraries (NonImportantTests PRIVATE chesslib )
6569target_include_directories (NonImportantTests PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${doctest_SOURCE_DIR} )
6670add_test (NAME test_core COMMAND test_chess )
67- add_test (NAME api_tests COMMAND NonImportantTests )
71+ add_test (NAME api_tests COMMAND NonImportantTests )
72+ if (ENABLE_COVERAGE)
73+
74+ if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" )
75+ foreach (t chesslib test_chess NonImportantTests)
76+ target_compile_options (${t} PRIVATE
77+ --coverage
78+ -O0
79+ )
80+ target_link_options (${t} PRIVATE
81+ --coverage
82+ )
83+ endforeach ()
84+
85+ find_program (GCOVR gcovr REQUIRED )
86+
87+ add_custom_target (coverage
88+ COMMAND ${CMAKE_COMMAND} -E make_directory coverage
89+ COMMAND ${CMAKE_CTEST_COMMAND}
90+ COMMAND ${GCOVR}
91+ -r ${CMAKE_SOURCE_DIR}
92+ --html
93+ --html-details
94+ -o coverage/index.html
95+ --exclude-directories tests
96+ WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
97+ COMMENT "Generating GCC coverage report"
98+ )
99+ elseif (CMAKE_CXX_COMPILER_ID MATCHES "Clang" )
100+ foreach (t chesslib test_chess NonImportantTests)
101+ target_compile_options (${t} PRIVATE
102+ -fprofile-instr-generate
103+ -fcoverage-mapping
104+ -O0
105+ )
106+ target_link_options (${t} PRIVATE
107+ -fprofile-instr-generate
108+ )
109+ endforeach ()
110+
111+ if (WIN32 )
112+
113+ find_program (LLVM_PROFDATA llvm-profdata REQUIRED )
114+ find_program (LLVM_COV llvm-cov REQUIRED )
115+
116+ add_custom_target (coverage
117+ COMMAND ${CMAKE_COMMAND} -E make_directory coverage
118+
119+ COMMAND ${CMAKE_COMMAND} -E env
120+ LLVM_PROFILE_FILE=coverage/coverage.profraw
121+ CTEST_PARALLEL_LEVEL=1
122+ ${CMAKE_CTEST_COMMAND}
123+
124+ COMMAND ${LLVM_PROFDATA} merge
125+ -sparse
126+ coverage/coverage.profraw
127+ -o coverage/coverage.profdata
128+
129+ COMMAND ${LLVM_COV} show
130+ $<TARGET_FILE :test_chess >
131+ $<TARGET_FILE :NonImportantTests >
132+ -instr-profile=coverage/coverage.profdata
133+ -format=html
134+ -output-dir=coverage
135+ -ignore-filename-regex= "tests|doctest"
136+ -Xdemangler=llvm-cxxfilt
137+
138+ WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
139+ COMMENT "Generating Clang coverage report (Windows)"
140+ )
141+ else ()
142+
143+ find_program (LLVM_PROFDATA llvm-profdata REQUIRED )
144+ find_program (LLVM_COV llvm-cov REQUIRED )
145+
146+ add_custom_target (coverage
147+ COMMAND ${CMAKE_COMMAND} -E make_directory coverage
148+
149+ COMMAND ${CMAKE_COMMAND} -E env
150+ LLVM_PROFILE_FILE=coverage/%m.profraw
151+ ${CMAKE_CTEST_COMMAND}
152+
153+ COMMAND ${LLVM_PROFDATA} merge
154+ -sparse
155+ coverage
156+ -o coverage/coverage.profdata
157+
158+ COMMAND ${LLVM_COV} show
159+ $<TARGET_FILE :test_chess >
160+ $<TARGET_FILE :NonImportantTests >
161+ -instr-profile=coverage/coverage.profdata
162+ -format=html
163+ -output-dir=coverage
164+ -ignore-filename-regex= "tests|doctest"
165+ -Xdemangler=c++filt
166+
167+ WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
168+ COMMENT "Generating Clang coverage report"
169+ )
170+ endif ()
171+ endif ()
172+
173+ endif ()
0 commit comments