Skip to content

Commit

Permalink
Overhaul how we search for clang-format (#4888)
Browse files Browse the repository at this point in the history
Co-authored-by: Casey Carter <[email protected]>
  • Loading branch information
StephanTLavavej and CaseyCarter committed Aug 15, 2024
1 parent 0e98f35 commit b191409
Showing 1 changed file with 53 additions and 61 deletions.
114 changes: 53 additions & 61 deletions tools/format/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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()

0 comments on commit b191409

Please sign in to comment.