|
4 | 4 | cmake_minimum_required(VERSION 3.29.0) |
5 | 5 | project(msvc_standard_libraries_format NONE) |
6 | 6 |
|
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 | | - |
20 | 7 | find_program(CLANG_FORMAT |
21 | 8 | 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" |
23 | 10 | 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 |
29 | 12 | ) |
30 | 13 |
|
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 | +) |
35 | 19 |
|
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() |
46 | 32 |
|
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 "") |
50 | 43 |
|
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) |
55 | 47 |
|
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}") |
58 | 50 | endif() |
| 51 | +endforeach() |
59 | 52 |
|
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!") |
79 | 55 | 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