|
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) |
77 | 4 | endfunction()
|
78 | 5 |
|
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) |
130 | 8 | endfunction()
|
0 commit comments