Skip to content

Commit c21675d

Browse files
committed
use llvm
Signed-off-by: Balakrishna Avulapati <ba@bavulapati.com>
1 parent 47e6a2c commit c21675d

File tree

5 files changed

+21
-137
lines changed

5 files changed

+21
-137
lines changed

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

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,6 @@ Checks: '-*,
1313
objc-*,
1414
misc-*,-misc-no-recursion,-misc-unused-parameters,-misc-const-correctness'
1515
WarningsAsErrors: '*'
16-
HeaderFilterRegex: ''
1716
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\/.*'
17+
UseColor: true
18+
SystemHeaders: false

.github/workflows/ci.yml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,9 +164,14 @@ jobs:
164164

165165
clang-tidy:
166166
runs-on: ubuntu-latest
167+
env:
168+
CC: clang
169+
CXX: clang++
167170
steps:
168171
- uses: actions/checkout@v4
169172
- run: cmake --version
173+
- name: Install llvm
174+
run: bash -c "$(wget -O - https://apt.llvm.org/llvm.sh)"
170175
- run: >
171176
cmake -S . -B ./build
172177
-DCMAKE_BUILD_TYPE:STRING=Release
@@ -175,4 +180,5 @@ jobs:
175180
-DSOURCEMETA_CORE_DOCS:BOOL=OFF
176181
-DBUILD_SHARED_LIBS:BOOL=OFF
177182
-DCMAKE_COMPILE_WARNING_AS_ERROR:BOOL=ON
178-
- run: cmake --build ./build --config Release --target clang_tidy
183+
-DSOURCEMETA_CORE_CLANG_TIDY:BOOL=ON
184+
- run: cmake --build ./build --config Release

CMakeLists.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ option(SOURCEMETA_CORE_ADDRESS_SANITIZER "Build Sourcemeta Core with an address
1919
option(SOURCEMETA_CORE_UNDEFINED_SANITIZER "Build Sourcemeta Core with an undefined behavior sanitizer" OFF)
2020
option(SOURCEMETA_CORE_CONTRIB_GOOGLETEST "Build the GoogleTest library for downstream consumers" OFF)
2121
option(SOURCEMETA_CORE_CONTRIB_GOOGLEBENCHMARK "Build the GoogleBenchmark library for downstream consumers" OFF)
22+
option(SOURCEMETA_CORE_CLANG_TIDY "Run clang-tidy checks" OFF)
2223

2324
include(Sourcemeta)
2425

@@ -27,6 +28,10 @@ if(PROJECT_IS_TOP_LEVEL)
2728
sourcemeta_enable_simd()
2829
endif()
2930

31+
if(SOURCEMETA_CORE_CLANG_TIDY)
32+
sourcemeta_enable_clang_tidy()
33+
endif()
34+
3035
# TODO: Turn this into a re-usable utility CMake function
3136
if(SOURCEMETA_CORE_INSTALL)
3237
include(GNUInstallDirs)
@@ -99,6 +104,8 @@ if(PROJECT_IS_TOP_LEVEL)
99104
sourcemeta_target_clang_tidy(SOURCES src/*.cc)
100105
endif()
101106

107+
sourcemeta_disable_clang_tidy()
108+
102109
# Testing
103110

104111
if(SOURCEMETA_CORE_CONTRIB_GOOGLETEST OR SOURCEMETA_CORE_TESTS)

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/common/targets/clang-tidy.cmake

Lines changed: 5 additions & 127 deletions
Original file line numberDiff line numberDiff line change
@@ -1,130 +1,8 @@
1-
function(sourcemeta_target_clang_tidy_attempt_install)
2-
cmake_parse_arguments(SOURCEMETA_TARGET_CLANG_TIDY_ATTEMPT_INSTALL "" "OUTPUT_DIRECTORY" "" ${ARGN})
3-
if(NOT SOURCEMETA_TARGET_CLANG_TIDY_ATTEMPT_INSTALL_OUTPUT_DIRECTORY)
4-
message(FATAL_ERROR "You must pass the output directory in the OUTPUT_DIRECTORY option")
5-
endif()
6-
7-
# See https://pypi.org/project/clang-tidy/
8-
set(CLANG_TIDY_BINARY_VERSION "20.1.0")
9-
set(CLANG_TIDY_BINARY_Windows_AMD64 "clang_tidy-${CLANG_TIDY_BINARY_VERSION}-py2.py3-none-win_amd64.whl")
10-
set(CLANG_TIDY_BINARY_MSYS_x86_64 "clang_tidy-${CLANG_TIDY_BINARY_VERSION}-py2.py3-none-win_amd64.whl")
11-
set(CLANG_TIDY_BINARY_Darwin_arm64 "clang_tidy-${CLANG_TIDY_BINARY_VERSION}-py2.py3-none-macosx_11_0_arm64.whl")
12-
set(CLANG_TIDY_BINARY_Darwin_x86_64 "clang_tidy-${CLANG_TIDY_BINARY_VERSION}-py2.py3-none-macosx_10_9_x86_64.whl")
13-
set(CLANG_TIDY_BINARY_Linux_aarch64 "clang_tidy-${CLANG_TIDY_BINARY_VERSION}-py2.py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl")
14-
set(CLANG_TIDY_BINARY_Linux_x86_64 "clang_tidy-${CLANG_TIDY_BINARY_VERSION}-py2.py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl")
15-
set(CLANG_TIDY_BINARY_CHECKSUM_Windows_AMD64 "02/f0/dd985d9d9b76f8c39f1995aa475d8d5aabbea0d3e0cf498df44dc7bf1cb0")
16-
set(CLANG_TIDY_BINARY_CHECKSUM_MSYS_x86_64 "02/f0/dd985d9d9b76f8c39f1995aa475d8d5aabbea0d3e0cf498df44dc7bf1cb0")
17-
set(CLANG_TIDY_BINARY_CHECKSUM_Darwin_arm64 "95/02/838baf08764b08327322096bda55e8d1e2344e4a13b9308e5642cfaafd8e")
18-
set(CLANG_TIDY_BINARY_CHECKSUM_Darwin_x86_64 "6d/5b/dcfc84b895d8544e00186738ca85132bbd14db4d11dbe39502630ece5391")
19-
set(CLANG_TIDY_BINARY_CHECKSUM_Linux_aarch64 "be/61/9e1a0797639e81c41d38d7b8b2508a9be4b05b9a23baa9d64e7284d07238")
20-
set(CLANG_TIDY_BINARY_CHECKSUM_Linux_x86_64 "52/76/42c61be1c1fdf8bacdbb265f0cd3e11321fee7362f91fa840717a6a41ad6")
21-
set(CLANG_TIDY_BINARY_NAME_Windows_AMD64 "clang-tidy.exe")
22-
set(CLANG_TIDY_BINARY_NAME_MSYS_x86_64 "clang-tidy.exe")
23-
set(CLANG_TIDY_BINARY_NAME_Darwin_arm64 "clang-tidy")
24-
set(CLANG_TIDY_BINARY_NAME_Darwin_x86_64 "clang-tidy")
25-
set(CLANG_TIDY_BINARY_NAME_Linux_aarch64 "clang-tidy")
26-
set(CLANG_TIDY_BINARY_NAME_Linux_x86_64 "clang-tidy")
27-
28-
# Determine the pre-built binary URL
29-
string(REPLACE "." "_" CLANG_TIDY_BINARY_SYSTEM "${CMAKE_SYSTEM_NAME}")
30-
string(REPLACE "." "_" CLANG_TIDY_BINARY_ARCH "${CMAKE_SYSTEM_PROCESSOR}")
31-
set(CLANG_TIDY_BINARY_URL_VAR "CLANG_TIDY_BINARY_${CLANG_TIDY_BINARY_SYSTEM}_${CLANG_TIDY_BINARY_ARCH}")
32-
set(CLANG_TIDY_BINARY_CHECKSUM_VAR "CLANG_TIDY_BINARY_CHECKSUM_${CLANG_TIDY_BINARY_SYSTEM}_${CLANG_TIDY_BINARY_ARCH}")
33-
set(CLANG_TIDY_BINARY_NAME_VAR "CLANG_TIDY_BINARY_NAME_${CLANG_TIDY_BINARY_SYSTEM}_${CLANG_TIDY_BINARY_ARCH}")
34-
if(NOT DEFINED ${CLANG_TIDY_BINARY_URL_VAR} OR "${${CLANG_TIDY_BINARY_URL_VAR}}" STREQUAL "")
35-
message(WARNING "Skipping `clang-tidy` download. No known pre-build binary URL")
36-
return()
37-
elseif(NOT DEFINED ${CLANG_TIDY_BINARY_CHECKSUM_VAR} OR "${${CLANG_TIDY_BINARY_CHECKSUM_VAR}}" STREQUAL "")
38-
message(FATAL_ERROR "No known `clang-tidy` pre-build binary checksum")
39-
elseif(NOT DEFINED ${CLANG_TIDY_BINARY_NAME_VAR} OR "${${CLANG_TIDY_BINARY_NAME_VAR}}" STREQUAL "")
40-
message(FATAL_ERROR "No known `clang-tidy` pre-build binary name")
41-
endif()
42-
set(CLANG_TIDY_BINARY_URL "https://files.pythonhosted.org/packages/${${CLANG_TIDY_BINARY_CHECKSUM_VAR}}/${${CLANG_TIDY_BINARY_URL_VAR}}")
43-
44-
# Download and extract the pre-built binary ZIP if needed
45-
set(CLANG_TIDY_BINARY_NAME "${${CLANG_TIDY_BINARY_NAME_VAR}}")
46-
set(CLANG_TIDY_BINARY_OUTPUT "${SOURCEMETA_TARGET_CLANG_TIDY_ATTEMPT_INSTALL_OUTPUT_DIRECTORY}/${CLANG_TIDY_BINARY_NAME}")
47-
if(EXISTS "${CLANG_TIDY_BINARY_OUTPUT}")
48-
message(STATUS "Found existing `clang-tidy` pre-built binary at ${CLANG_TIDY_BINARY_OUTPUT}")
49-
return()
50-
endif()
51-
set(CLANG_TIDY_BINARY_DOWNLOAD_DIR "${CMAKE_CURRENT_BINARY_DIR}/clang-tidy")
52-
file(REMOVE_RECURSE "${CLANG_TIDY_BINARY_DOWNLOAD_DIR}")
53-
file(MAKE_DIRECTORY "${CLANG_TIDY_BINARY_DOWNLOAD_DIR}")
54-
set(CLANG_TIDY_BINARY_WHEEL "${CLANG_TIDY_BINARY_DOWNLOAD_DIR}/clang-tidy.whl")
55-
message(STATUS "Downloading `clang-tidy` pre-built binary from ${CLANG_TIDY_BINARY_URL}")
56-
file(DOWNLOAD "${CLANG_TIDY_BINARY_URL}" "${CLANG_TIDY_BINARY_WHEEL}"
57-
STATUS CLANG_TIDY_BINARY_DOWNLOAD_STATUS SHOW_PROGRESS TLS_VERIFY ON
58-
LOG CLANG_TIDY_BINARY_DOWNLOAD_LOG)
59-
list(GET CLANG_TIDY_BINARY_DOWNLOAD_STATUS 0 _code)
60-
if(NOT _code EQUAL 0)
61-
message(WARNING "Failed to download the `clang-tidy` pre-built binary")
62-
message(WARNING "${CLANG_TIDY_BINARY_DOWNLOAD_LOG}")
63-
file(REMOVE_RECURSE "${CLANG_TIDY_BINARY_DOWNLOAD_DIR}")
64-
return()
65-
endif()
66-
set(CLANG_TIDY_BINARY_EXTRACT_DIR "${CLANG_TIDY_BINARY_DOWNLOAD_DIR}/extracted")
67-
file(MAKE_DIRECTORY "${CLANG_TIDY_BINARY_EXTRACT_DIR}")
68-
file(ARCHIVE_EXTRACT INPUT "${CLANG_TIDY_BINARY_WHEEL}" DESTINATION "${CLANG_TIDY_BINARY_EXTRACT_DIR}")
69-
70-
# Install the binary
71-
file(MAKE_DIRECTORY "${SOURCEMETA_TARGET_CLANG_TIDY_ATTEMPT_INSTALL_OUTPUT_DIRECTORY}")
72-
file(COPY "${CLANG_TIDY_BINARY_EXTRACT_DIR}/clang_tidy/data/bin/${CLANG_TIDY_BINARY_NAME}"
73-
DESTINATION "${SOURCEMETA_TARGET_CLANG_TIDY_ATTEMPT_INSTALL_OUTPUT_DIRECTORY}")
74-
file(CHMOD "${CLANG_TIDY_BINARY_OUTPUT}" PERMISSIONS
75-
OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)
76-
message(STATUS "Installed `clang-tidy` pre-built binary to ${CLANG_TIDY_BINARY_OUTPUT}")
1+
function(sourcemeta_enable_clang_tidy)
2+
find_program(CLANG_TIDY_BIN NAMES clang-tidy)
3+
set(CMAKE_CXX_CLANG_TIDY "${CLANG_TIDY_BIN};--config-file=${CMAKE_CURRENT_SOURCE_DIR}/.clang-tidy;-header-filter=${CMAKE_CURRENT_SOURCE_DIR}/src/*" PARENT_SCOPE)
774
endfunction()
785

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")
82-
83-
if(SOURCEMETA_TARGET_CLANG_TIDY_REQUIRED)
84-
find_program(CLANG_TIDY_BIN NAMES clang-tidy NO_DEFAULT_PATH
85-
PATHS "${CMAKE_CURRENT_BINARY_DIR}/bin")
86-
if(NOT CLANG_TIDY_BIN)
87-
find_program(CLANG_TIDY_BIN NAMES clang-tidy REQUIRED)
88-
endif()
89-
else()
90-
find_program(CLANG_TIDY_BIN NAMES clang-tidy NO_DEFAULT_PATH
91-
PATHS "${CMAKE_CURRENT_BINARY_DIR}/bin")
92-
if(NOT CLANG_TIDY_BIN)
93-
find_program(CLANG_TIDY_BIN NAMES clang-tidy)
94-
endif()
95-
endif()
96-
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-
105-
set(CLANG_TIDY_CONFIG "${CMAKE_CURRENT_FUNCTION_LIST_DIR}/clang-tidy.config")
106-
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")
6+
function(sourcemeta_disable_clang_tidy)
7+
unset(CMAKE_CXX_CLANG_TIDY PARENT_SCOPE)
1308
endfunction()

0 commit comments

Comments
 (0)