1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
if (NOT CMAKE_EXPORT_COMPILE_COMMANDS)
message(WARNING "Unable to run clang-tidy without the compile commands database.")
return()
endif()
set(STATIC_ANALYSIS_OUTPUT_DIR "StaticAnalysis")
find_program(RUN_CLANG_TIDY_COMMAND NAMES run-clang-tidy)
if (NOT RUN_CLANG_TIDY_COMMAND)
message(WARNING "run-clang-tidy can not be found.")
return()
endif()
string(TIMESTAMP CURRENT_TIME)
set(CLANG_TIDY_OUTPUL_FILE "clang-tidy_${CURRENT_TIME}")
add_custom_target(clang-tidy
COMMAND ${CMAKE_COMMAND} -E make_directory ${STATIC_ANALYSIS_OUTPUT_DIR}
COMMAND ${RUN_CLANG_TIDY_COMMAND} -header-filter='.*' -p ${CMAKE_BINARY_DIR} > "${STATIC_ANALYSIS_OUTPUT_DIR}/${CLANG_TIDY_OUTPUL_FILE}")
find_program(GIT_COMMAND NAMES git)
if (NOT GIT_COMMAND)
message(WARNING "git can not be found.")
return()
endif()
find_program(CLANG_TIDY_DIFF_COMMAND NAMES clang-tidy-diff)
if (NOT CLANG_TIDY_DIFF_COMMAND)
message(WARNING "clang-tidy-diff can not be found.")
return()
endif()
if (CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux")
set(CLANG_TIDY_DIFF_OUTPUT_FILE "clang-tidy-diff_${CURRENT_TIME}")
add_custom_target(clang-tidy-diff-head
COMMAND ${CMAKE_COMMAND} -E make_directory ${STATIC_ANALYSIS_OUTPUT_DIR}
COMMAND bash -c "cd ${CMAKE_SOURCE_DIR} && ${GIT_COMMAND} diff -U0 HEAD | ${CLANG_TIDY_DIFF_COMMAND} -p 1 -path ${CMAKE_BINARY_DIR} > \"${CMAKE_BINARY_DIR}/${STATIC_ANALYSIS_OUTPUT_DIR}/${CLANG_TIDY_DIFF_OUTPUT_FILE}\""
VERBATIM)
else()
message(WARNING "clang-tidy-diff target is implemented only for Unix build platform.")
endif()