@@ -77,53 +77,41 @@ function(sourcemeta_clang_tidy_attempt_install)
7777endfunction ()
7878
7979function (sourcemeta_clang_tidy_attempt_enable)
80- cmake_parse_arguments (PARSE_ARGV 0 SOURCEMETA_CLANG_TIDY "" "TARGET_NAME" "" )
81- if (NOT SOURCEMETA_CLANG_TIDY_TARGET_NAME)
82- message (STATUS "ClangTidy runs at target level. TARGET_NAME is required." )
83- 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" )
8483 endif ()
8584
8685 # TODO: Support other platforms too, like Linux
87- if (NOT APPLE )
88- message (STATUS "Ignoring ClangTidy setup on OS other than APPLE for target ${SOURCEMETA_CLANG_TIDY_TARGET_NAME} " )
89- return ()
90- endif ()
91-
92-
93- if (SOURCEMETA_COMPILER_LLVM)
94- message (STATUS "Enabling ClangTidy alongside compilation for target ${SOURCEMETA_CLANG_TIDY_TARGET_NAME} " )
86+ if (APPLE AND SOURCEMETA_COMPILER_LLVM)
87+ message (STATUS "Enabling ClangTidy alongside compilation for target ${SOURCEMETA_TARGET_CLANG_TIDY_ATTEMPT_ENABLE_TARGET} " )
9588 else ()
96- message (STATUS "Ignoring ClangTidy setup on a compiler other than LLVM for target ${SOURCEMETA_CLANG_TIDY_TARGET_NAME} " )
9789 return ()
9890 endif ()
9991
100-
101- sourcemeta_clang_tidy_attempt_install(
102- OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR} /bin" )
103-
104- if (SOURCEMETA_CXX_CLANG_TIDY)
105- set_target_properties ("${SOURCEMETA_CLANG_TIDY_TARGET_NAME} "
106- PROPERTIES CXX_CLANG_TIDY "${SOURCEMETA_CXX_CLANG_TIDY} " )
107- return ()
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" )
102+ execute_process (COMMAND xcrun --show-sdk-path
103+ OUTPUT_VARIABLE MACOSX_SDK_PATH OUTPUT_STRIP_TRAILING_WHITESPACE)
104+ execute_process (COMMAND "${CMAKE_CXX_COMPILER} " -print-resource -dir
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=-std=c++${CMAKE_CXX_STANDARD} "
109+ "--extra-arg=-isysroot"
110+ "--extra-arg=${MACOSX_SDK_PATH} "
111+ "--extra-arg=-resource-dir=${MACOSX_RESOURCE_PATH} "
112+ CACHE STRING "CXX_CLANG_TIDY" )
108113 endif ()
109114
110- find_program (CLANG_TIDY_BIN NAMES clang-tidy
111- NO_DEFAULT_PATH
112- PATHS "${PROJECT_BINARY_DIR} /bin"
113- REQUIRED)
114-
115- set (CLANG_TIDY_CONFIG "${CMAKE_CURRENT_FUNCTION_LIST_DIR} /clang-tidy.config" )
116- execute_process (COMMAND xcrun --show-sdk-path
117- OUTPUT_VARIABLE MACOSX_SDK_PATH OUTPUT_STRIP_TRAILING_WHITESPACE)
118- execute_process (COMMAND "${CMAKE_CXX_COMPILER} " -print-resource -dir
119- OUTPUT_VARIABLE MACOSX_RESOURCE_PATH OUTPUT_STRIP_TRAILING_WHITESPACE)
120- set (SOURCEMETA_CXX_CLANG_TIDY
121- "${CLANG_TIDY_BIN} ;--config-file=${CLANG_TIDY_CONFIG} ;-header-filter=${PROJECT_SOURCE_DIR} /src/*"
122- "--extra-arg=-std=c++${CMAKE_CXX_STANDARD} "
123- "--extra-arg=-isysroot"
124- "--extra-arg=${MACOSX_SDK_PATH} "
125- "--extra-arg=-resource-dir=${MACOSX_RESOURCE_PATH} " )
126-
127- set_target_properties ("${SOURCEMETA_CLANG_TIDY_TARGET_NAME} "
115+ set_target_properties ("${SOURCEMETA_TARGET_CLANG_TIDY_ATTEMPT_ENABLE_TARGET} "
128116 PROPERTIES CXX_CLANG_TIDY "${SOURCEMETA_CXX_CLANG_TIDY} " )
129117endfunction ()
0 commit comments