From c6ec5d732be68b91bb0de6c0722b75313f6853f2 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Tue, 13 Aug 2024 09:47:45 -0700 Subject: [PATCH 1/3] Overhaul the search for clang-format. --- tools/format/CMakeLists.txt | 113 +++++++++++++++++------------------- 1 file changed, 52 insertions(+), 61 deletions(-) diff --git a/tools/format/CMakeLists.txt b/tools/format/CMakeLists.txt index 57c3925b58a..5808bc653f4 100644 --- a/tools/format/CMakeLists.txt +++ b/tools/format/CMakeLists.txt @@ -4,76 +4,67 @@ 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" 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() From ac2d2f8e35403e9ed3347ba80a5db3cc620482ff Mon Sep 17 00:00:00 2001 From: Casey Carter Date: Wed, 14 Aug 2024 14:48:07 -0700 Subject: [PATCH 2/3] Prefer the clang-format installed with VS if present --- tools/format/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/format/CMakeLists.txt b/tools/format/CMakeLists.txt index 5808bc653f4..885c94ee24a 100644 --- a/tools/format/CMakeLists.txt +++ b/tools/format/CMakeLists.txt @@ -6,6 +6,7 @@ project(msvc_standard_libraries_format NONE) find_program(CLANG_FORMAT NAMES clang-format + HINTS "$ENV{VCINSTALLDIR}/Tools/Llvm/$ENV{VSCMD_ARG_HOST_ARCH}/bin" DOC "The clang-format program to use" REQUIRED ) From 9ab8eaee62f87962b60abe4a70391f49098bf648 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Thu, 15 Aug 2024 05:00:43 -0700 Subject: [PATCH 3/3] Always use x64 instead of VSCMD_ARG_HOST_ARCH. --- tools/format/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/format/CMakeLists.txt b/tools/format/CMakeLists.txt index 885c94ee24a..08ba8066afb 100644 --- a/tools/format/CMakeLists.txt +++ b/tools/format/CMakeLists.txt @@ -6,7 +6,7 @@ project(msvc_standard_libraries_format NONE) find_program(CLANG_FORMAT NAMES clang-format - HINTS "$ENV{VCINSTALLDIR}/Tools/Llvm/$ENV{VSCMD_ARG_HOST_ARCH}/bin" + HINTS "$ENV{VCINSTALLDIR}/Tools/Llvm/x64/bin" DOC "The clang-format program to use" REQUIRED )