@@ -77,48 +77,40 @@ function(sourcemeta_clang_tidy_attempt_install)
7777endfunction ()
7878
7979function (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} " )
124116endfunction ()
0 commit comments