Skip to content

Commit 2f41805

Browse files
committed
[WIP] Attempt to install ClangFormat binaries using CMake
Signed-off-by: Juan Cruz Viotti <[email protected]>
1 parent 2a658ae commit 2f41805

File tree

2 files changed

+76
-6
lines changed

2 files changed

+76
-6
lines changed

.github/workflows/ci.yml

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -114,10 +114,6 @@ jobs:
114114
HOMEBREW_NO_ANALYTICS: 1
115115
HOMEBREW_NO_AUTO_UPDATE: 1
116116

117-
- name: Install ClangFormat
118-
run: pipx install clang-format==19.1.0 --verbose
119-
if: matrix.platform.format
120-
121117
- run: cmake --version
122118
- name: Configure (static)
123119
if: matrix.platform.type == 'static'

cmake/common/targets/clang-format.cmake

Lines changed: 76 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,84 @@
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+
174
function(sourcemeta_target_clang_format)
275
cmake_parse_arguments(SOURCEMETA_TARGET_CLANG_FORMAT "REQUIRED" "" "SOURCES" ${ARGN})
76+
sourcemeta_target_clang_format_attempt_install(OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/bin")
377

478
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 PATHS "${CMAKE_CURRENT_BINARY_DIR}/bin" REQUIRED)
680
else()
7-
find_program(CLANG_FORMAT_BIN NAMES clang-format)
81+
find_program(CLANG_FORMAT_BIN NAMES clang-format PATHS "${CMAKE_CURRENT_BINARY_DIR}/bin")
882
endif()
983

1084
# This covers the empty list too

0 commit comments

Comments
 (0)