Skip to content

Commit b191409

Browse files
Overhaul how we search for clang-format (#4888)
Co-authored-by: Casey Carter <[email protected]>
1 parent 0e98f35 commit b191409

File tree

1 file changed

+53
-61
lines changed

1 file changed

+53
-61
lines changed

tools/format/CMakeLists.txt

Lines changed: 53 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -4,76 +4,68 @@
44
cmake_minimum_required(VERSION 3.29.0)
55
project(msvc_standard_libraries_format NONE)
66

7-
set(did_search OFF)
8-
9-
if(NOT DEFINED CLANG_FORMAT)
10-
message(STATUS "Searching for VS clang-format")
11-
set(did_search ON)
12-
endif()
13-
14-
if(PROJECT_IS_TOP_LEVEL)
15-
set(message_level FATAL_ERROR)
16-
else()
17-
set(message_level WARNING)
18-
endif()
19-
207
find_program(CLANG_FORMAT
218
NAMES clang-format
22-
PATHS "C:/Program Files/Microsoft Visual Studio/2022/Preview/VC/Tools/Llvm/bin"
9+
HINTS "$ENV{VCINSTALLDIR}/Tools/Llvm/x64/bin"
2310
DOC "The clang-format program to use"
24-
NO_DEFAULT_PATH
25-
NO_CMAKE_PATH
26-
NO_CMAKE_ENVIRONMENT_PATH
27-
NO_SYSTEM_ENVIRONMENT_PATH
28-
NO_CMAKE_SYSTEM_PATH
11+
REQUIRED
2912
)
3013

31-
if(CLANG_FORMAT)
32-
if(did_search)
33-
message(STATUS "Searching for VS clang-format - found")
34-
endif()
14+
execute_process(
15+
COMMAND "${CLANG_FORMAT}" --version
16+
OUTPUT_VARIABLE clang_format_version
17+
OUTPUT_STRIP_TRAILING_WHITESPACE
18+
)
3519

36-
file(GLOB_RECURSE maybe_clang_format_files
37-
"../../benchmarks/inc/*"
38-
"../../benchmarks/src/*"
39-
"../../stl/inc/*"
40-
"../../stl/modules/*"
41-
"../../stl/src/*"
42-
"../../tests/*"
43-
"../../tools/*"
44-
)
45-
set(clang_format_files "")
20+
if(clang_format_version MATCHES "clang-format version ([0-9]+\.[0-9]+\.[0-9]+)")
21+
set(expected_version "17.0.3")
22+
if(CMAKE_MATCH_1 VERSION_LESS expected_version)
23+
message(FATAL_ERROR "Found clang-format ${CMAKE_MATCH_1}, older than expected ${expected_version}.")
24+
elseif(CMAKE_MATCH_1 VERSION_EQUAL expected_version)
25+
message(STATUS "Found clang-format ${CMAKE_MATCH_1}.")
26+
elseif(CMAKE_MATCH_1 VERSION_GREATER expected_version)
27+
message(WARNING "Found clang-format ${CMAKE_MATCH_1}, newer than expected ${expected_version}.")
28+
endif()
29+
else()
30+
message(FATAL_ERROR "Unexpected `clang-format --version` output: '${clang_format_version}'")
31+
endif()
4632

47-
foreach(maybe_file IN LISTS maybe_clang_format_files)
48-
cmake_path(GET maybe_file FILENAME filename)
49-
cmake_path(GET maybe_file EXTENSION LAST_ONLY extension)
33+
file(GLOB_RECURSE maybe_clang_format_files
34+
"../../benchmarks/inc/*"
35+
"../../benchmarks/src/*"
36+
"../../stl/inc/*"
37+
"../../stl/modules/*"
38+
"../../stl/src/*"
39+
"../../tests/*"
40+
"../../tools/*"
41+
)
42+
set(clang_format_files "")
5043

51-
if(extension MATCHES [[^(|\.cpp|\.h|\.hpp|\.ixx)$]] AND NOT filename MATCHES [[^\.]])
52-
list(APPEND clang_format_files "${maybe_file}")
53-
endif()
54-
endforeach()
44+
foreach(maybe_file IN LISTS maybe_clang_format_files)
45+
cmake_path(GET maybe_file FILENAME filename)
46+
cmake_path(GET maybe_file EXTENSION LAST_ONLY extension)
5547

56-
if(NOT clang_format_files)
57-
message("${message_level}" "Could not find any files to clang-format!")
48+
if(extension MATCHES [[^(|\.cpp|\.h|\.hpp|\.ixx)$]] AND NOT filename MATCHES [[^\.]])
49+
list(APPEND clang_format_files "${maybe_file}")
5850
endif()
51+
endforeach()
5952

60-
add_custom_target(run-format)
61-
62-
foreach(file IN LISTS clang_format_files)
63-
cmake_path(RELATIVE_PATH file
64-
BASE_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/../.."
65-
OUTPUT_VARIABLE relative-file
66-
)
67-
string(REPLACE "/" "_" relative-file "${relative-file}")
68-
set(target_name "clang-format.${relative-file}")
69-
add_custom_target("${target_name}"
70-
COMMAND "${CLANG_FORMAT}" -style=file -i "${file}"
71-
WORKING_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/../.."
72-
)
73-
add_dependencies(run-format "${target_name}")
74-
endforeach()
75-
else()
76-
if(did_search)
77-
message("${message_level}" "Searching for VS clang-format - not found.")
78-
endif()
53+
if(NOT clang_format_files)
54+
message(FATAL_ERROR "Could not find any files to clang-format!")
7955
endif()
56+
57+
add_custom_target(run-format)
58+
59+
foreach(file IN LISTS clang_format_files)
60+
cmake_path(RELATIVE_PATH file
61+
BASE_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/../.."
62+
OUTPUT_VARIABLE relative-file
63+
)
64+
string(REPLACE "/" "_" relative-file "${relative-file}")
65+
set(target_name "clang-format.${relative-file}")
66+
add_custom_target("${target_name}"
67+
COMMAND "${CLANG_FORMAT}" -style=file -i "${file}"
68+
WORKING_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/../.."
69+
)
70+
add_dependencies(run-format "${target_name}")
71+
endforeach()

0 commit comments

Comments
 (0)