diff --git a/tools/format/CMakeLists.txt b/tools/format/CMakeLists.txt index 57c3925b58a..08ba8066afb 100644 --- a/tools/format/CMakeLists.txt +++ b/tools/format/CMakeLists.txt @@ -4,76 +4,68 @@ cmake_minimum_required(VERSION 3.29.0) project(msvc_standard_libraries_format NONE) -set(did_search OFF) - -if(NOT DEFINED CLANG_FORMAT) - message(STATUS "Searching for VS clang-format") - set(did_search ON) -endif() - -if(PROJECT_IS_TOP_LEVEL) - set(message_level FATAL_ERROR) -else() - set(message_level WARNING) -endif() - find_program(CLANG_FORMAT NAMES clang-format - PATHS "C:/Program Files/Microsoft Visual Studio/2022/Preview/VC/Tools/Llvm/bin" + HINTS "$ENV{VCINSTALLDIR}/Tools/Llvm/x64/bin" DOC "The clang-format program to use" - NO_DEFAULT_PATH - NO_CMAKE_PATH - NO_CMAKE_ENVIRONMENT_PATH - NO_SYSTEM_ENVIRONMENT_PATH - NO_CMAKE_SYSTEM_PATH + REQUIRED ) -if(CLANG_FORMAT) - if(did_search) - message(STATUS "Searching for VS clang-format - found") - endif() +execute_process( + COMMAND "${CLANG_FORMAT}" --version + OUTPUT_VARIABLE clang_format_version + OUTPUT_STRIP_TRAILING_WHITESPACE +) - file(GLOB_RECURSE maybe_clang_format_files - "../../benchmarks/inc/*" - "../../benchmarks/src/*" - "../../stl/inc/*" - "../../stl/modules/*" - "../../stl/src/*" - "../../tests/*" - "../../tools/*" - ) - set(clang_format_files "") +if(clang_format_version MATCHES "clang-format version ([0-9]+\.[0-9]+\.[0-9]+)") + set(expected_version "17.0.3") + if(CMAKE_MATCH_1 VERSION_LESS expected_version) + message(FATAL_ERROR "Found clang-format ${CMAKE_MATCH_1}, older than expected ${expected_version}.") + elseif(CMAKE_MATCH_1 VERSION_EQUAL expected_version) + message(STATUS "Found clang-format ${CMAKE_MATCH_1}.") + elseif(CMAKE_MATCH_1 VERSION_GREATER expected_version) + message(WARNING "Found clang-format ${CMAKE_MATCH_1}, newer than expected ${expected_version}.") + endif() +else() + message(FATAL_ERROR "Unexpected `clang-format --version` output: '${clang_format_version}'") +endif() - foreach(maybe_file IN LISTS maybe_clang_format_files) - cmake_path(GET maybe_file FILENAME filename) - cmake_path(GET maybe_file EXTENSION LAST_ONLY extension) +file(GLOB_RECURSE maybe_clang_format_files + "../../benchmarks/inc/*" + "../../benchmarks/src/*" + "../../stl/inc/*" + "../../stl/modules/*" + "../../stl/src/*" + "../../tests/*" + "../../tools/*" +) +set(clang_format_files "") - if(extension MATCHES [[^(|\.cpp|\.h|\.hpp|\.ixx)$]] AND NOT filename MATCHES [[^\.]]) - list(APPEND clang_format_files "${maybe_file}") - endif() - endforeach() +foreach(maybe_file IN LISTS maybe_clang_format_files) + cmake_path(GET maybe_file FILENAME filename) + cmake_path(GET maybe_file EXTENSION LAST_ONLY extension) - if(NOT clang_format_files) - message("${message_level}" "Could not find any files to clang-format!") + if(extension MATCHES [[^(|\.cpp|\.h|\.hpp|\.ixx)$]] AND NOT filename MATCHES [[^\.]]) + list(APPEND clang_format_files "${maybe_file}") endif() +endforeach() - add_custom_target(run-format) - - foreach(file IN LISTS clang_format_files) - cmake_path(RELATIVE_PATH file - BASE_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/../.." - OUTPUT_VARIABLE relative-file - ) - string(REPLACE "/" "_" relative-file "${relative-file}") - set(target_name "clang-format.${relative-file}") - add_custom_target("${target_name}" - COMMAND "${CLANG_FORMAT}" -style=file -i "${file}" - WORKING_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/../.." - ) - add_dependencies(run-format "${target_name}") - endforeach() -else() - if(did_search) - message("${message_level}" "Searching for VS clang-format - not found.") - endif() +if(NOT clang_format_files) + message(FATAL_ERROR "Could not find any files to clang-format!") endif() + +add_custom_target(run-format) + +foreach(file IN LISTS clang_format_files) + cmake_path(RELATIVE_PATH file + BASE_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/../.." + OUTPUT_VARIABLE relative-file + ) + string(REPLACE "/" "_" relative-file "${relative-file}") + set(target_name "clang-format.${relative-file}") + add_custom_target("${target_name}" + COMMAND "${CLANG_FORMAT}" -style=file -i "${file}" + WORKING_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/../.." + ) + add_dependencies(run-format "${target_name}") +endforeach()