Skip to content

Commit 76cecdb

Browse files
committed
[WIP] Experiment with ClangTidy alongside compilation
Signed-off-by: Juan Cruz Viotti <jv@jviotti.com>
1 parent 3a031c0 commit 76cecdb

File tree

5 files changed

+14
-46
lines changed

5 files changed

+14
-46
lines changed

CMakeLists.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,10 @@ option(SOURCEMETA_CORE_CONTRIB_GOOGLEBENCHMARK "Build the GoogleBenchmark librar
2828

2929
include(Sourcemeta)
3030

31-
# Don't force downstream consumers on it
31+
# Don't force downstream consumers on this
3232
if(PROJECT_IS_TOP_LEVEL)
3333
sourcemeta_enable_simd()
34+
sourcemeta_clang_tidy()
3435
endif()
3536

3637
# TODO: Turn this into a re-usable utility CMake function
@@ -120,7 +121,6 @@ if(PROJECT_IS_TOP_LEVEL)
120121
src/*.h src/*.cc
121122
benchmark/*.h benchmark/*.cc
122123
test/*.h test/*.cc)
123-
sourcemeta_target_clang_tidy(SOURCES src/*.cc)
124124
endif()
125125

126126
# Testing

Makefile

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,6 @@ compile: .always
2525
$(CMAKE) --install ./build --prefix ./build/dist --config $(PRESET) --verbose \
2626
--component sourcemeta_core_dev
2727

28-
lint: .always
29-
$(CMAKE) --build ./build --config $(PRESET) --target clang_tidy
30-
3128
test: .always
3229
$(CMAKE) -E env UBSAN_OPTIONS=print_stacktrace=1 \
3330
$(CTEST) --test-dir ./build --build-config $(PRESET) \

cmake/Sourcemeta.cmake

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,11 @@ include("${SOURCEMETA_UTILITIES_DIRECTORY}/commands/copy-file.cmake")
1010
include("${SOURCEMETA_UTILITIES_DIRECTORY}/targets/library.cmake")
1111
include("${SOURCEMETA_UTILITIES_DIRECTORY}/targets/executable.cmake")
1212
include("${SOURCEMETA_UTILITIES_DIRECTORY}/targets/clang-format.cmake")
13-
include("${SOURCEMETA_UTILITIES_DIRECTORY}/targets/clang-tidy.cmake")
1413
include("${SOURCEMETA_UTILITIES_DIRECTORY}/targets/shellcheck.cmake")
1514
include("${SOURCEMETA_UTILITIES_DIRECTORY}/targets/doxygen.cmake")
1615
include("${SOURCEMETA_UTILITIES_DIRECTORY}/targets/googletest.cmake")
1716
include("${SOURCEMETA_UTILITIES_DIRECTORY}/targets/googlebenchmark.cmake")
17+
include("${SOURCEMETA_UTILITIES_DIRECTORY}/clang-tidy.cmake")
1818

1919
# To let downstream projects directly include this file
2020
if(NOT PROJECT_IS_TOP_LEVEL)

cmake/common/targets/clang-tidy.cmake renamed to cmake/common/clang-tidy.cmake

Lines changed: 11 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
function(sourcemeta_target_clang_tidy_attempt_install)
1+
function(sourcemeta_clang_tidy_attempt_install)
22
cmake_parse_arguments(SOURCEMETA_TARGET_CLANG_TIDY_ATTEMPT_INSTALL "" "OUTPUT_DIRECTORY" "" ${ARGN})
33
if(NOT SOURCEMETA_TARGET_CLANG_TIDY_ATTEMPT_INSTALL_OUTPUT_DIRECTORY)
44
message(FATAL_ERROR "You must pass the output directory in the OUTPUT_DIRECTORY option")
@@ -76,9 +76,9 @@ function(sourcemeta_target_clang_tidy_attempt_install)
7676
message(STATUS "Installed `clang-tidy` pre-built binary to ${CLANG_TIDY_BINARY_OUTPUT}")
7777
endfunction()
7878

79-
function(sourcemeta_target_clang_tidy)
80-
cmake_parse_arguments(SOURCEMETA_TARGET_CLANG_TIDY "REQUIRED" "" "SOURCES" ${ARGN})
81-
sourcemeta_target_clang_tidy_attempt_install(OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/bin")
79+
function(sourcemeta_clang_tidy)
80+
cmake_parse_arguments(SOURCEMETA_TARGET_CLANG_TIDY "REQUIRED" "" "" ${ARGN})
81+
sourcemeta_clang_tidy_attempt_install(OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/bin")
8282

8383
if(SOURCEMETA_TARGET_CLANG_TIDY_REQUIRED)
8484
find_program(CLANG_TIDY_BIN NAMES clang-tidy NO_DEFAULT_PATH
@@ -94,37 +94,13 @@ function(sourcemeta_target_clang_tidy)
9494
endif()
9595
endif()
9696

97-
98-
# This covers the empty list too
99-
if(NOT SOURCEMETA_TARGET_CLANG_TIDY_SOURCES)
100-
message(FATAL_ERROR "You must pass file globs to analyze in the SOURCES option")
101-
endif()
102-
file(GLOB_RECURSE SOURCEMETA_TARGET_CLANG_TIDY_FILES
103-
${SOURCEMETA_TARGET_CLANG_TIDY_SOURCES})
104-
10597
set(CLANG_TIDY_CONFIG "${CMAKE_CURRENT_FUNCTION_LIST_DIR}/clang-tidy.config")
10698

107-
if(CMAKE_SYSTEM_NAME STREQUAL "MSYS")
108-
# Because `clang-tidy` is typically a Windows `.exe`, transform the path accordingly
109-
execute_process(COMMAND cygpath -w "${CLANG_TIDY_CONFIG}"
110-
OUTPUT_VARIABLE CLANG_TIDY_CONFIG OUTPUT_STRIP_TRAILING_WHITESPACE)
111-
endif()
112-
113-
if(CLANG_TIDY_BIN)
114-
add_custom_target(clang_tidy
115-
WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}"
116-
VERBATIM
117-
COMMAND "${CLANG_TIDY_BIN}" -p "${PROJECT_BINARY_DIR}"
118-
--config-file "${CLANG_TIDY_CONFIG}"
119-
${SOURCEMETA_TARGET_CLANG_TIDY_FILES}
120-
COMMENT "Analyzing sources using ClangTidy")
121-
else()
122-
add_custom_target(clang_tidy
123-
WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}"
124-
VERBATIM
125-
COMMAND "${CMAKE_COMMAND}" -E echo "Could not locate ClangTidy"
126-
COMMAND "${CMAKE_COMMAND}" -E false)
127-
endif()
128-
129-
set_target_properties(clang_tidy PROPERTIES FOLDER "Linting")
99+
set(CMAKE_CXX_CLANG_TIDY
100+
"${CLANG_TIDY_BIN};--config-file=${CLANG_TIDY_CONFIG}"
101+
"--extra-arg=-std=c++20"
102+
"--extra-arg=-isysroot"
103+
"--extra-arg=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk"
104+
"--extra-arg=-resource-dir=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/17"
105+
PARENT_SCOPE)
130106
endfunction()

cmake/common/targets/clang-tidy.config renamed to cmake/common/clang-tidy.config

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,3 @@ Checks: '-*,
1515
WarningsAsErrors: '*'
1616
HeaderFilterRegex: ''
1717
FormatStyle: none
18-
CheckOptions:
19-
# See https://clang.llvm.org/extra/clang-tidy/checks/misc/include-cleaner.html
20-
# Otherwise ClangTidy wants us to directly include private headers from our modules
21-
- key: misc-include-cleaner.IgnoreHeaders
22-
value: 'src\/core\/.*;uriparser\/.*'

0 commit comments

Comments
 (0)