1
+ function (sourcemeta_target_clang_format_attempt_install )
2
+ cmake_parse_arguments (SOURCEMETA_TARGET_CLANG_FORMAT_ATTEMPT_INSTALL "" "OUTPUT_DIRECTORY" "" ${ARGN} )
3
+ if (NOT SOURCEMETA_TARGET_CLANG_FORMAT_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-format/
8
+ set (CLANG_FORMAT_BINARY_VERSION "20.1.6" )
9
+ set (CLANG_FORMAT_BINARY_Windows_AMD64 "clang_format-${CLANG_FORMAT_BINARY_VERSION} -py2.py3-none-win_amd64.whl" )
10
+ set (CLANG_FORMAT_BINARY_Darwin_arm64 "clang_format-${CLANG_FORMAT_BINARY_VERSION} -py2.py3-none-macosx_11_0_arm64.whl" )
11
+ set (CLANG_FORMAT_BINARY_Darwin_x86_64 "clang_format-${CLANG_FORMAT_BINARY_VERSION} -py2.py3-none-macosx_10_9_x86_64.whl" )
12
+ set (CLANG_FORMAT_BINARY_Linux_aarch64 "clang_format-${CLANG_FORMAT_BINARY_VERSION} -py2.py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" )
13
+ set (CLANG_FORMAT_BINARY_Linux_x86_64 "clang_format-${CLANG_FORMAT_BINARY_VERSION} -py2.py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" )
14
+ set (CLANG_FORMAT_BINARY_CHECKSUM_Windows_AMD64 "76/d0/2781f7699ce9ff1f5f9035d30cdb4c46f40b6acf191e0100543c289f46be" )
15
+ set (CLANG_FORMAT_BINARY_CHECKSUM_Darwin_arm64 "fd/27/171dcef3288369bc0f7034307cebc6ea5d9a2b03d44e5cfa5a218f0e4f53" )
16
+ set (CLANG_FORMAT_BINARY_CHECKSUM_Darwin_x86_64 "ac/f7/01502ff0869985df8b47ae62cdace425f02dfcd61b463a046f873ad5d2e2" )
17
+ set (CLANG_FORMAT_BINARY_CHECKSUM_Linux_aarch64 "b1/51/2a0f401f5a5e27f97b8ebfed6ca9c4ccc2809cabafa2f97c7ac8e5b0d882" )
18
+ set (CLANG_FORMAT_BINARY_CHECKSUM_Linux_x86_64 "b9/5e/7713e11945fa8018589e37a60052a1b1a2485be2292fcf382d154231eab6" )
19
+ set (CLANG_FORMAT_BINARY_NAME_Windows_AMD64 "clang-format.exe" )
20
+ set (CLANG_FORMAT_BINARY_NAME_Darwin_arm64 "clang-format" )
21
+ set (CLANG_FORMAT_BINARY_NAME_Darwin_x86_64 "clang-format" )
22
+ set (CLANG_FORMAT_BINARY_NAME_Linux_aarch64 "clang-format" )
23
+ set (CLANG_FORMAT_BINARY_NAME_Linux_x86_64 "clang-format" )
24
+
25
+ # Determine the pre-built binary URL
26
+ string (REPLACE "." "_" CLANG_FORMAT_BINARY_SYSTEM "${CMAKE_SYSTEM_NAME} " )
27
+ string (REPLACE "." "_" CLANG_FORMAT_BINARY_ARCH "${CMAKE_SYSTEM_PROCESSOR} " )
28
+ set (CLANG_FORMAT_BINARY_URL_VAR "CLANG_FORMAT_BINARY_${CLANG_FORMAT_BINARY_SYSTEM} _${CLANG_FORMAT_BINARY_ARCH} " )
29
+ set (CLANG_FORMAT_BINARY_CHECKSUM_VAR "CLANG_FORMAT_BINARY_CHECKSUM_${CLANG_FORMAT_BINARY_SYSTEM} _${CLANG_FORMAT_BINARY_ARCH} " )
30
+ set (CLANG_FORMAT_BINARY_NAME_VAR "CLANG_FORMAT_BINARY_NAME_${CLANG_FORMAT_BINARY_SYSTEM} _${CLANG_FORMAT_BINARY_ARCH} " )
31
+ if (NOT DEFINED ${CLANG_FORMAT_BINARY_URL_VAR} OR "${${CLANG_FORMAT_BINARY_URL_VAR} }" STREQUAL "" )
32
+ message (WARNING "Skipping `clang-format` download. No known pre-build binary URL" )
33
+ return ()
34
+ elseif (NOT DEFINED ${CLANG_FORMAT_BINARY_CHECKSUM_VAR} OR "${${CLANG_FORMAT_BINARY_CHECKSUM_VAR} }" STREQUAL "" )
35
+ message (FATAL_ERROR "No known `clang-format` pre-build binary checksum" )
36
+ elseif (NOT DEFINED ${CLANG_FORMAT_BINARY_NAME_VAR} OR "${${CLANG_FORMAT_BINARY_NAME_VAR} }" STREQUAL "" )
37
+ message (FATAL_ERROR "No known `clang-format` pre-build binary name" )
38
+ endif ()
39
+ set (CLANG_FORMAT_BINARY_URL "https://files.pythonhosted.org/packages/${${CLANG_FORMAT_BINARY_CHECKSUM_VAR} }/${${CLANG_FORMAT_BINARY_URL_VAR} }" )
40
+
41
+ # Download and extract the pre-built binary ZIP if needed
42
+ set (CLANG_FORMAT_BINARY_NAME "${${CLANG_FORMAT_BINARY_NAME_VAR} }" )
43
+ set (CLANG_FORMAT_BINARY_OUTPUT "${SOURCEMETA_TARGET_CLANG_FORMAT_ATTEMPT_INSTALL_OUTPUT_DIRECTORY} /${CLANG_FORMAT_BINARY_NAME} " )
44
+ if (EXISTS "${CLANG_FORMAT_BINARY_OUTPUT} " )
45
+ message (STATUS "Found existing `clang-format` pre-built binary at ${CLANG_FORMAT_BINARY_OUTPUT} " )
46
+ return ()
47
+ endif ()
48
+ set (CLANG_FORMAT_BINARY_DOWNLOAD_DIR "${CMAKE_CURRENT_BINARY_DIR} /clang-format" )
49
+ file (REMOVE_RECURSE "${CLANG_FORMAT_BINARY_DOWNLOAD_DIR} " )
50
+ file (MAKE_DIRECTORY "${CLANG_FORMAT_BINARY_DOWNLOAD_DIR} " )
51
+ set (CLANG_FORMAT_BINARY_WHEEL "${CLANG_FORMAT_BINARY_DOWNLOAD_DIR} /clang-format.whl" )
52
+ message (STATUS "Downloading `clang-format` pre-built binary from ${CLANG_FORMAT_BINARY_URL} " )
53
+ file (DOWNLOAD "${CLANG_FORMAT_BINARY_URL} " "${CLANG_FORMAT_BINARY_WHEEL} "
54
+ STATUS CLANG_FORMAT_BINARY_DOWNLOAD_STATUS SHOW_PROGRESS TLS_VERIFY ON )
55
+ list (GET CLANG_FORMAT_BINARY_DOWNLOAD_STATUS 0 _code )
56
+ if (NOT _code EQUAL 0 )
57
+ message (WARNING "Failed to download the `clang-format` pre-built binary" )
58
+ file (REMOVE_RECURSE "${CLANG_FORMAT_BINARY_DOWNLOAD_DIR} " )
59
+ return ()
60
+ endif ()
61
+ set (CLANG_FORMAT_BINARY_EXTRACT_DIR "${CLANG_FORMAT_BINARY_DOWNLOAD_DIR} /extracted" )
62
+ file (MAKE_DIRECTORY "${CLANG_FORMAT_BINARY_EXTRACT_DIR} " )
63
+ file (ARCHIVE_EXTRACT INPUT "${CLANG_FORMAT_BINARY_WHEEL} " DESTINATION "${CLANG_FORMAT_BINARY_EXTRACT_DIR} " )
64
+
65
+ # Install the binary
66
+ file (MAKE_DIRECTORY "${SOURCEMETA_TARGET_CLANG_FORMAT_ATTEMPT_INSTALL_OUTPUT_DIRECTORY} " )
67
+ file (COPY "${CLANG_FORMAT_BINARY_EXTRACT_DIR} /clang_format/data/bin/${CLANG_FORMAT_BINARY_NAME} "
68
+ DESTINATION "${SOURCEMETA_TARGET_CLANG_FORMAT_ATTEMPT_INSTALL_OUTPUT_DIRECTORY} " )
69
+ file (CHMOD "${CLANG_FORMAT_BINARY_OUTPUT} " PERMISSIONS
70
+ OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE )
71
+ message (STATUS "Installed `clang-format` pre-built binary to ${CLANG_FORMAT_BINARY_OUTPUT} " )
72
+ endfunction ()
73
+
1
74
function (sourcemeta_target_clang_format )
2
75
cmake_parse_arguments (SOURCEMETA_TARGET_CLANG_FORMAT "REQUIRED" "" "SOURCES" ${ARGN} )
76
+ sourcemeta_target_clang_format_attempt_install (OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR} /bin" )
3
77
4
78
if (SOURCEMETA_TARGET_CLANG_FORMAT_REQUIRED )
5
- find_program (CLANG_FORMAT_BIN NAMES clang-format REQUIRED )
79
+ find_program (CLANG_FORMAT_BIN NAMES clang-format NO_DEFAULT_PATH
80
+ PATHS "${CMAKE_CURRENT_BINARY_DIR} /bin" )
81
+ if (NOT CLANG_FORMAT_BIN )
82
+ find_program (CLANG_FORMAT_BIN NAMES clang-format REQUIRED )
83
+ endif ()
6
84
else ()
7
- find_program (CLANG_FORMAT_BIN NAMES clang-format )
85
+ find_program (CLANG_FORMAT_BIN NAMES clang-format NO_DEFAULT_PATH
86
+ PATHS "${CMAKE_CURRENT_BINARY_DIR} /bin" )
87
+ if (NOT CLANG_FORMAT_BIN )
88
+ find_program (CLANG_FORMAT_BIN NAMES clang-format )
89
+ endif ()
8
90
endif ()
9
91
10
92
# This covers the empty list too
@@ -16,6 +98,7 @@ function(sourcemeta_target_clang_format)
16
98
17
99
set (CLANG_FORMAT_CONFIG "${CMAKE_CURRENT_FUNCTION_LIST_DIR} /clang-format.config" )
18
100
if (CLANG_FORMAT_BIN )
101
+ message (STATUS "Using `clang-format` from ${CLANG_FORMAT_BIN} " )
19
102
add_custom_target (clang_format
20
103
WORKING_DIRECTORY "${PROJECT_SOURCE_DIR} "
21
104
VERBATIM
0 commit comments