@@ -5,11 +5,11 @@ option(
5
5
6
6
set (CMAKE_COLOR_DIAGNOSTICS ON )
7
7
8
- if (" ${ CMAKE_CXX_COMPILER_ID} " MATCHES "Clang" )
8
+ if (CMAKE_CXX_COMPILER_ID MATCHES "Clang" )
9
9
add_compile_options (-fdiagnostics-show-template-tree )
10
10
endif ()
11
11
12
- if (" ${ CMAKE_CXX_COMPILER_ID} " MATCHES "MSVC" )
12
+ if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC" )
13
13
add_compile_options (/utf-8 /diagnostics:caret )
14
14
endif ()
15
15
@@ -37,9 +37,7 @@ function(target_include_as_system target_name)
37
37
${included} )
38
38
endfunction ()
39
39
40
- #
41
40
# Create static or shared library, setup header and source files
42
- #
43
41
function (config_lib lib_name lib_type )
44
42
message ("Configuring target library ${lib_name} " )
45
43
@@ -85,7 +83,7 @@ function(config_lib lib_name lib_type)
85
83
86
84
if (ARG_STD )
87
85
target_compile_features (${lib_name} ${inc_tag} cxx_std_${ARG_STD} )
88
- message (STATUS "Using c++ ${ARG_STD} . \n " )
86
+ message (STATUS "Using c++ ${ARG_STD} " )
89
87
endif ()
90
88
91
89
target_include_directories (
@@ -99,9 +97,7 @@ function(config_lib lib_name lib_type)
99
97
set_target_properties (${lib_name} PROPERTIES VERSION "${ARG_VER} " )
100
98
endfunction ()
101
99
102
- #
103
100
# Create executable, setup header and source files
104
- #
105
101
function (config_exe exe_name )
106
102
cmake_parse_arguments (ARG "" "STD;VER" "EXE_SRC" ${ARGN} )
107
103
@@ -119,13 +115,11 @@ function(config_exe exe_name)
119
115
120
116
if (ARG_STD )
121
117
target_compile_features (${exe_name} PUBLIC cxx_std_${ARG_STD} )
122
- message (STATUS "Using c++ ${ARG_STD} .\n " )
118
+ message (STATUS "Using c++ ${ARG_STD} ." )
123
119
endif ()
124
120
endfunction ()
125
121
126
- #
127
- # Create executable, setup header and source files
128
- #
122
+ # install library
129
123
function (target_install target )
130
124
include (CMakePackageConfigHelpers )
131
125
include (GNUInstallDirs )
@@ -235,33 +229,44 @@ include($\{CMAKE_CURRENT_LIST_DIR}/${target}Targets.cmake)"
235
229
COMPONENT "${target} _Development" )
236
230
endfunction ()
237
231
238
- function (target_enable_clang_tidy target )
232
+ function (target_clang_tidy target )
239
233
find_program (CLANG_TIDY clang-tidy )
240
- if (CLANG_TIDY )
241
- message (STATUS "found clang-tidy: ${CLANG_TIDY} " )
242
234
243
- get_target_property (bin_dir ${target} BINARY_DIR )
244
- set (report_folder "${bin_dir} /clang-tidy-report" )
235
+ if (NOT EXISTS "${CLANG_TIDY} " )
236
+ message (STATUS "clang-tidy not found" )
237
+ return ()
238
+ endif ()
245
239
246
- set_target_properties (
247
- ${target}
248
- PROPERTIES
249
- CXX_CLANG_TIDY
250
- "${CLANG_TIDY} ;--enable-check-profile;--store-check-profile=${report_folder} "
251
- )
240
+ message (STATUS "found clang-tidy: ${CLANG_TIDY} " )
252
241
253
- add_custom_target (
254
- ${target} ClangTidyClean ALL
255
- COMMAND ${CMAKE_COMMAND} -E rm -rf ${report_folder} /
256
- USES_TERMINAL )
242
+ get_target_property (bin_dir ${target} BINARY_DIR )
243
+ set (report_folder "${bin_dir} /clang-tidy-report" )
257
244
258
- add_dependencies (${target} ${target} ClangTidyClean )
259
- else ()
260
- message (STATUS "clang-tidy not found" )
245
+ if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC" )
246
+ message (STATUS "Add extra MSVC arg for clang-tidy" )
247
+ set (MSVC_TIDY
248
+ ";--extra-arg=/EHsc;--extra-arg=/std:c++latest;--extra-arg=-Wno-unknown-warning-option"
249
+ )
261
250
endif ()
251
+
252
+ set_target_properties (
253
+ ${target}
254
+ PROPERTIES
255
+ CXX_CLANG_TIDY
256
+ "${CLANG_TIDY} ;
257
+ --enable-check-profile;
258
+ --store-check-profile=${report_folder}
259
+ ${MSVC_TIDY} " )
260
+
261
+ add_custom_target (
262
+ ${target} ClangTidyClean ALL
263
+ COMMAND ${CMAKE_COMMAND} -E rm -rf ${report_folder} /
264
+ USES_TERMINAL )
265
+
266
+ add_dependencies (${target} ${target} ClangTidyClean )
262
267
endfunction ()
263
268
264
- function (target_enable_clang_sanitizer target type )
269
+ function (target_clang_sanitizer target type )
265
270
cmake_parse_arguments (ARG "" "" "SANITIZER" ${ARGN} )
266
271
267
272
foreach (sanitizer ${ARG_SANITIZER} )
@@ -279,28 +284,37 @@ function(target_enable_clang_sanitizer target type)
279
284
"SHELL: $<${clang_debug_only} :${sanitizer_options} >" )
280
285
endfunction ()
281
286
282
- function (target_coverage target_name )
287
+ function (target_llvm_coverage target_name )
283
288
message (STATUS "enable code coverage for ${target_name} " )
284
289
find_program (llvm_profdata "llvm-profdata" )
285
290
find_program (llvm_cov "llvm-cov" )
286
291
287
- if (NOT ( ${ CMAKE_CXX_COMPILER_ID} MATCHES "(Apple)?[Cc]lang" ) )
292
+ if (NOT CMAKE_CXX_COMPILER_ID MATCHES "(Apple)?[Cc]lang" )
288
293
message (
289
294
STATUS
290
- "C++ Compiler should be Clang, ${CMAKE_CXX_COMPILER_ID} is not supported.\n "
295
+ "C++ Compiler should be Clang, ${CMAKE_CXX_COMPILER_ID} is not supported."
291
296
)
292
297
return ()
293
298
endif ()
294
299
295
300
if (NOT EXISTS "${llvm_profdata} " OR NOT EXISTS "${llvm_cov} " )
296
- message (STATUS "llvm-profdata or llvm-cov not found.\n " )
301
+ message (STATUS "llvm-profdata or llvm-cov not found." )
297
302
return ()
298
303
endif ()
299
304
300
305
message (STATUS "found llvm-profdata at: ${llvm_profdata} " )
301
306
message (STATUS "found llvm-cov at: ${llvm_cov} " )
302
307
303
- cmake_parse_arguments (ARG "" "FORMAT;PROFILE_FILE" "DEPENDS" ${ARGN} )
308
+ cmake_parse_arguments (ARG "" "FORMAT" "DEPENDS" ${ARGN} )
309
+
310
+ set (profile_file "${target_name} .profraw" )
311
+
312
+ # Run first to generate profraw file
313
+ add_custom_command (
314
+ OUTPUT ${profile_file}
315
+ DEPENDS ${target_name}
316
+ COMMAND ${CMAKE_COMMAND} -E env LLVM_PROFILE_FILE=${profile_file}
317
+ $< TARGET_FILE:${target_name} > || exit 0 )
304
318
305
319
set (options -fprofile-instr-generate -fcoverage-mapping )
306
320
@@ -310,28 +324,23 @@ function(target_coverage target_name)
310
324
set (profdata_file_name "${target_name} .profdata" )
311
325
312
326
if (${ARG_FORMAT} STREQUAL text )
313
- set (coverage_file json )
327
+ set (coverage_file_ext json )
314
328
elseif (${ARG_FORMAT} STREQUAL lcov )
315
- set (coverage_file lcov )
329
+ set (coverage_file_ext lcov )
316
330
else ()
317
331
message (FATAL_ERROR "unknown format ${ARG_FORMAT} " )
318
332
endif ()
319
333
320
- if (NOT DEFINED ARG_PROFILE_FILE )
321
- set (ARG_PROFILE_FILE "$ENV{LLVM_PROFILE_FILE} " )
322
- endif ()
323
-
324
- set (coverage_file "${target_name} Coverage.${coverage_file} " )
334
+ set (coverage_file_ext "${target_name} Coverage.${coverage_file_ext} " )
325
335
326
336
add_custom_target (
327
337
${target_name} CoverageReport ALL
328
- DEPENDS ${target_name} ${ARG_DEPENDS}
329
- COMMAND ${CMAKE_COMMAND} -E rm -f "${profdata_file_name} " "${coverage_file} "
338
+ DEPENDS ${profile_file}
330
339
COMMAND "${llvm_profdata} " merge --sparse -o= "${profdata_file_name} "
331
- "${ARG_PROFILE_FILE } "
340
+ "${profile_file } "
332
341
COMMAND
333
342
"${llvm_cov} " export -format=${ARG_FORMAT}
334
343
-object= "$<TARGET_FILE:${target_name} >"
335
- -instr-profile= "${profdata_file_name} " > "${coverage_file } "
344
+ -instr-profile= "${profdata_file_name} " > "${coverage_file_ext } "
336
345
USES_TERMINAL )
337
346
endfunction ()
0 commit comments