Skip to content

Commit 5ddb95c

Browse files
bavulapatijviotti
andauthored
Enable clang-tidy at target level (#1844)
Follow up #1824 (comment) Signed-off-by: Balakrishna Avulapati <[email protected]> Signed-off-by: Juan Cruz Viotti <[email protected]> Co-authored-by: Juan Cruz Viotti <[email protected]>
1 parent bee38cd commit 5ddb95c

File tree

3 files changed

+29
-37
lines changed

3 files changed

+29
-37
lines changed

CMakeLists.txt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ include(Sourcemeta)
3232
# Don't force downstream consumers on this
3333
if(PROJECT_IS_TOP_LEVEL)
3434
sourcemeta_enable_simd()
35-
sourcemeta_clang_tidy_attempt_enable()
3635
endif()
3736

3837
# TODO: Turn this into a re-usable utility CMake function
@@ -124,7 +123,6 @@ endif()
124123
if(PROJECT_IS_TOP_LEVEL)
125124
# TODO: Try once more to enable this per target,
126125
# so, we don't need to manually disable it here
127-
sourcemeta_clang_tidy_attempt_disable()
128126
sourcemeta_target_clang_format(SOURCES
129127
src/*.h src/*.cc
130128
benchmark/*.h benchmark/*.cc

cmake/common/clang-tidy.cmake

Lines changed: 27 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -77,48 +77,40 @@ function(sourcemeta_clang_tidy_attempt_install)
7777
endfunction()
7878

7979
function(sourcemeta_clang_tidy_attempt_enable)
80-
cmake_parse_arguments(SOURCEMETA_TARGET_CLANG_TIDY "REQUIRED" "" "" ${ARGN})
81-
82-
if(SOURCEMETA_COMPILER_LLVM)
83-
message(STATUS "Enabling ClangTidy alongside compilation")
84-
else()
85-
message(STATUS "Ignoring ClangTidy setup on a compiler other than LLVM")
86-
return()
80+
cmake_parse_arguments(SOURCEMETA_TARGET_CLANG_TIDY_ATTEMPT_ENABLE "" "TARGET" "" ${ARGN})
81+
if(NOT SOURCEMETA_TARGET_CLANG_TIDY_ATTEMPT_ENABLE_TARGET)
82+
message(FATAL_ERROR "You must pass the target name using the TARGET option")
8783
endif()
8884

89-
sourcemeta_clang_tidy_attempt_install(OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/bin")
90-
91-
if(SOURCEMETA_TARGET_CLANG_TIDY_REQUIRED)
92-
find_program(CLANG_TIDY_BIN NAMES clang-tidy NO_DEFAULT_PATH
93-
PATHS "${CMAKE_CURRENT_BINARY_DIR}/bin")
94-
if(NOT CLANG_TIDY_BIN)
95-
find_program(CLANG_TIDY_BIN NAMES clang-tidy REQUIRED)
96-
endif()
85+
# TODO: Support other platforms too, like Linux
86+
if(APPLE AND SOURCEMETA_COMPILER_LLVM)
87+
message(STATUS "Enabling ClangTidy alongside compilation for target ${SOURCEMETA_TARGET_CLANG_TIDY_ATTEMPT_ENABLE_TARGET}")
9788
else()
98-
find_program(CLANG_TIDY_BIN NAMES clang-tidy NO_DEFAULT_PATH
99-
PATHS "${CMAKE_CURRENT_BINARY_DIR}/bin")
100-
if(NOT CLANG_TIDY_BIN)
101-
find_program(CLANG_TIDY_BIN NAMES clang-tidy)
102-
endif()
89+
return()
10390
endif()
10491

105-
set(CLANG_TIDY_CONFIG "${CMAKE_CURRENT_FUNCTION_LIST_DIR}/clang-tidy.config")
106-
107-
# TODO: Support other platforms too, like Linux
108-
if(APPLE)
92+
# We rely on this cache variable to not pre-compute the ClangTidy
93+
# setup over and over again for every single target
94+
if(NOT SOURCEMETA_CXX_CLANG_TIDY)
95+
sourcemeta_clang_tidy_attempt_install(
96+
OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin")
97+
find_program(CLANG_TIDY_BIN NAMES clang-tidy
98+
NO_DEFAULT_PATH
99+
PATHS "${PROJECT_BINARY_DIR}/bin"
100+
REQUIRED)
101+
set(CLANG_TIDY_CONFIG "${CMAKE_CURRENT_FUNCTION_LIST_DIR}/clang-tidy.config")
109102
execute_process(COMMAND xcrun --show-sdk-path
110-
OUTPUT_VARIABLE MACOSX_SDK_PATH OUTPUT_STRIP_TRAILING_WHITESPACE)
103+
OUTPUT_VARIABLE MACOSX_SDK_PATH OUTPUT_STRIP_TRAILING_WHITESPACE)
111104
execute_process(COMMAND "${CMAKE_CXX_COMPILER}" -print-resource-dir
112-
OUTPUT_VARIABLE MACOSX_RESOURCE_PATH OUTPUT_STRIP_TRAILING_WHITESPACE)
113-
set(CMAKE_CXX_CLANG_TIDY
114-
"${CLANG_TIDY_BIN};--config-file=${CLANG_TIDY_CONFIG};-header-filter=${PROJECT_SOURCE_DIR}/src/*"
115-
"--extra-arg=-isysroot"
116-
"--extra-arg=${MACOSX_SDK_PATH}"
117-
"--extra-arg=-resource-dir=${MACOSX_RESOURCE_PATH}"
118-
PARENT_SCOPE)
105+
OUTPUT_VARIABLE MACOSX_RESOURCE_PATH OUTPUT_STRIP_TRAILING_WHITESPACE)
106+
set(SOURCEMETA_CXX_CLANG_TIDY
107+
"${CLANG_TIDY_BIN};--config-file=${CLANG_TIDY_CONFIG};-header-filter=${PROJECT_SOURCE_DIR}/src/*"
108+
"--extra-arg=-isysroot"
109+
"--extra-arg=${MACOSX_SDK_PATH}"
110+
"--extra-arg=-resource-dir=${MACOSX_RESOURCE_PATH}"
111+
CACHE STRING "CXX_CLANG_TIDY")
119112
endif()
120-
endfunction()
121113

122-
function(sourcemeta_clang_tidy_attempt_disable)
123-
unset(CMAKE_CXX_CLANG_TIDY PARENT_SCOPE)
114+
set_target_properties("${SOURCEMETA_TARGET_CLANG_TIDY_ATTEMPT_ENABLE_TARGET}"
115+
PROPERTIES CXX_CLANG_TIDY "${SOURCEMETA_CXX_CLANG_TIDY}")
124116
endfunction()

cmake/common/targets/library.cmake

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,8 @@ function(sourcemeta_library)
115115
target_include_directories(${TARGET_NAME}
116116
PUBLIC "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>")
117117
endif()
118+
119+
sourcemeta_clang_tidy_attempt_enable(TARGET "${TARGET_NAME}")
118120
endfunction()
119121

120122
function(sourcemeta_library_install)

0 commit comments

Comments
 (0)