Skip to content

Commit 881c921

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

File tree

6 files changed

+47
-61
lines changed

6 files changed

+47
-61
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: 24 additions & 33 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,16 @@ 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")
82+
83+
if(SOURCEMETA_COMPILER_LLVM)
84+
message(STATUS "Enabling ClangTidy alongside compilation")
85+
else()
86+
message(STATUS "Ignoring ClangTidy setup on a compiler other than LLVM")
87+
return()
88+
endif()
8289

8390
if(SOURCEMETA_TARGET_CLANG_TIDY_REQUIRED)
8491
find_program(CLANG_TIDY_BIN NAMES clang-tidy NO_DEFAULT_PATH
@@ -94,37 +101,21 @@ function(sourcemeta_target_clang_tidy)
94101
endif()
95102
endif()
96103

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-
105104
set(CLANG_TIDY_CONFIG "${CMAKE_CURRENT_FUNCTION_LIST_DIR}/clang-tidy.config")
106105

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")
106+
# TODO: Get the -std automatically
107+
if(APPLE)
108+
set(CMAKE_CXX_CLANG_TIDY
109+
"${CLANG_TIDY_BIN};--config-file=${CLANG_TIDY_CONFIG}"
110+
"--extra-arg=-std=c++20"
111+
"--extra-arg=-isysroot"
112+
"--extra-arg=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk"
113+
"--extra-arg=-resource-dir=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/17"
114+
PARENT_SCOPE)
121115
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)
116+
set(CMAKE_CXX_CLANG_TIDY
117+
"${CLANG_TIDY_BIN};--config-file=${CLANG_TIDY_CONFIG}"
118+
"--extra-arg=-std=c++20"
119+
PARENT_SCOPE)
127120
endif()
128-
129-
set_target_properties(clang_tidy PROPERTIES FOLDER "Linting")
130121
endfunction()

cmake/common/clang-tidy.config

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
---
2+
# See https://clang.llvm.org/extra/clang-tidy/index.html
3+
# First disable all default checks (with -*)
4+
Checks: '-*,
5+
modernize-*'
6+
# TODO(bavulapati): iterate through the rules and enable them incrementally inorder to send smaller PRs
7+
# bugprone-*,-bugprone-branch-clone,-bugprone-easily-swappable-parameters,-bugprone-empty-catch,
8+
# clang-analyzer-*,
9+
# clang-diagnostic-*,
10+
# modernize-*,
11+
# concurrency-*,
12+
# cppcoreguidelines-*,-cppcoreguidelines-rvalue-reference-param-not-moved,
13+
# performance-*,-performance-enum-size,
14+
# portability-*,
15+
# objc-*,
16+
# misc-*,-misc-no-recursion,-misc-unused-parameters,-misc-const-correctness'
17+
WarningsAsErrors: '*'
18+
HeaderFilterRegex: ''
19+
FormatStyle: none
20+
UseColor: true

cmake/common/targets/clang-tidy.config

Lines changed: 0 additions & 22 deletions
This file was deleted.

0 commit comments

Comments
 (0)