|
| 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}") |
| 77 | +endfunction() |
| 78 | + |
| 79 | +function(sourcemeta_enable_clang_tidy) |
| 80 | + sourcemeta_target_clang_tidy_attempt_install(OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/bin") |
| 81 | + find_program(CLANG_TIDY_BIN NAMES clang-tidy NO_DEFAULT_PATH |
| 82 | + PATHS "${CMAKE_CURRENT_BINARY_DIR}/bin") |
| 83 | +endfunction() |
0 commit comments