1
- function (sourcemeta_target_clang_tidy )
2
- cmake_parse_arguments (SOURCEMETA_TARGET_CLANG_TIDY "REQUIRED" "" "SOURCES" ${ARGN} )
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 ()
3
6
4
- set (CLANG_TIDY_FIND_PATHS "" )
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" )
5
27
6
- # Locate ClangTidy on default Homebrew installations,
7
- # given that the LLVM formula won't symlink `clang-tidy`
8
- # to any available path by default.
9
- if (APPLE )
10
- if (IS_DIRECTORY "/opt/homebrew/Cellar" )
11
- set (HOMEBREW_CELLAR "/opt/homebrew/Cellar" )
12
- elseif (IS_DIRECTORY "/usr/local/Cellar" )
13
- set (HOMEBREW_CELLAR "/opt/local/Cellar" )
14
- endif ()
15
- if (HOMEBREW_CELLAR )
16
- file (GLOB llvm_version_paths LIST_DIRECTORIES true "${HOMEBREW_CELLAR} /llvm*/*" )
17
- foreach (llvm_version_path ${llvm_version_paths} )
18
- list (APPEND CLANG_TIDY_FIND_PATHS "${llvm_version_path} /bin" )
19
- endforeach ()
20
- endif ()
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" )
21
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} " )
77
+ endfunction ()
78
+
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" )
22
82
23
83
if (SOURCEMETA_TARGET_CLANG_TIDY_REQUIRED )
24
- find_program (CLANG_TIDY_BIN NAMES clang-tidy REQUIRED
25
- PATHS ${CLANG_TIDY_FIND_PATHS} )
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 ()
26
89
else ()
27
- find_program (CLANG_TIDY_BIN NAMES clang-tidy
28
- PATHS ${CLANG_TIDY_FIND_PATHS} )
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 ()
29
95
endif ()
30
96
97
+
31
98
# This covers the empty list too
32
99
if (NOT SOURCEMETA_TARGET_CLANG_TIDY_SOURCES )
33
100
message (FATAL_ERROR "You must pass file globs to analyze in the SOURCES option" )
@@ -36,6 +103,13 @@ function(sourcemeta_target_clang_tidy)
36
103
${SOURCEMETA_TARGET_CLANG_TIDY_SOURCES} )
37
104
38
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
+
39
113
if (CLANG_TIDY_BIN )
40
114
add_custom_target (clang_tidy
41
115
WORKING_DIRECTORY "${PROJECT_SOURCE_DIR} "
0 commit comments