From e05567c702a4d3c2e47d7f0d1c13b5e8ecd62317 Mon Sep 17 00:00:00 2001 From: Balakrishna Avulapati Date: Thu, 17 Jul 2025 12:44:08 +0530 Subject: [PATCH 1/5] Enable clang-tidy at target level Signed-off-by: Balakrishna Avulapati --- CMakeLists.txt | 2 -- cmake/common/clang-tidy.cmake | 54 ++++++++++++++++++----------------- src/core/time/CMakeLists.txt | 1 + 3 files changed, 29 insertions(+), 28 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 515621160..ea9da006a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,7 +31,6 @@ include(Sourcemeta) # Don't force downstream consumers on this if(PROJECT_IS_TOP_LEVEL) sourcemeta_enable_simd() - sourcemeta_clang_tidy_attempt_enable() endif() # TODO: Turn this into a re-usable utility CMake function @@ -119,7 +118,6 @@ endif() if(PROJECT_IS_TOP_LEVEL) # TODO: Try once more to enable this per target, # so, we don't need to manually disable it here - sourcemeta_clang_tidy_attempt_disable() sourcemeta_target_clang_format(SOURCES src/*.h src/*.cc benchmark/*.h benchmark/*.cc diff --git a/cmake/common/clang-tidy.cmake b/cmake/common/clang-tidy.cmake index f4b3d657f..30fea7538 100644 --- a/cmake/common/clang-tidy.cmake +++ b/cmake/common/clang-tidy.cmake @@ -77,7 +77,11 @@ function(sourcemeta_clang_tidy_attempt_install) endfunction() function(sourcemeta_clang_tidy_attempt_enable) - cmake_parse_arguments(SOURCEMETA_TARGET_CLANG_TIDY "REQUIRED" "" "" ${ARGN}) + # TODO: Support other platforms too, like Linux + if(NOT APPLE) + message(STATUS "Ignoring ClangTidy setup on OS other than APPLE") + return() + endif() if(SOURCEMETA_COMPILER_LLVM) message(STATUS "Enabling ClangTidy alongside compilation") @@ -86,40 +90,38 @@ function(sourcemeta_clang_tidy_attempt_enable) return() endif() - sourcemeta_clang_tidy_attempt_install(OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/bin") + cmake_parse_arguments(PARSE_ARGV 0 SOURCEMETA_CLANG_TIDY "" "TARGET_NAME" "") + if(NOT SOURCEMETA_CLANG_TIDY_TARGET_NAME) + message(STATUS "ClangTidy runs at target level. TARGET_NAME is required.") + return() + endif() - if(SOURCEMETA_TARGET_CLANG_TIDY_REQUIRED) - find_program(CLANG_TIDY_BIN NAMES clang-tidy NO_DEFAULT_PATH - PATHS "${CMAKE_CURRENT_BINARY_DIR}/bin") - if(NOT CLANG_TIDY_BIN) - find_program(CLANG_TIDY_BIN NAMES clang-tidy REQUIRED) - endif() - else() - find_program(CLANG_TIDY_BIN NAMES clang-tidy NO_DEFAULT_PATH - PATHS "${CMAKE_CURRENT_BINARY_DIR}/bin") - if(NOT CLANG_TIDY_BIN) - find_program(CLANG_TIDY_BIN NAMES clang-tidy) - endif() + sourcemeta_clang_tidy_attempt_install( + OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin") + + if(SOURCEMETA_CXX_CLANG_TIDY) + set_target_properties("${SOURCEMETA_CLANG_TIDY_TARGET_NAME}" + PROPERTIES CXX_CLANG_TIDY "${SOURCEMETA_CXX_CLANG_TIDY}") + return() endif() - set(CLANG_TIDY_CONFIG "${CMAKE_CURRENT_FUNCTION_LIST_DIR}/clang-tidy.config") + find_program(CLANG_TIDY_BIN NAMES clang-tidy + NO_DEFAULT_PATH + PATHS "${PROJECT_BINARY_DIR}/bin" + REQUIRED) - # TODO: Support other platforms too, like Linux - if(APPLE) - execute_process(COMMAND xcrun --show-sdk-path + set(CLANG_TIDY_CONFIG "${CMAKE_CURRENT_FUNCTION_LIST_DIR}/clang-tidy.config") + execute_process(COMMAND xcrun --show-sdk-path OUTPUT_VARIABLE MACOSX_SDK_PATH OUTPUT_STRIP_TRAILING_WHITESPACE) - execute_process(COMMAND "${CMAKE_CXX_COMPILER}" -print-resource-dir + execute_process(COMMAND "${CMAKE_CXX_COMPILER}" -print-resource-dir OUTPUT_VARIABLE MACOSX_RESOURCE_PATH OUTPUT_STRIP_TRAILING_WHITESPACE) - set(CMAKE_CXX_CLANG_TIDY + set(SOURCEMETA_CXX_CLANG_TIDY "${CLANG_TIDY_BIN};--config-file=${CLANG_TIDY_CONFIG};-header-filter=${PROJECT_SOURCE_DIR}/src/*" "--extra-arg=-std=c++${CMAKE_CXX_STANDARD}" "--extra-arg=-isysroot" "--extra-arg=${MACOSX_SDK_PATH}" - "--extra-arg=-resource-dir=${MACOSX_RESOURCE_PATH}" - PARENT_SCOPE) - endif() -endfunction() + "--extra-arg=-resource-dir=${MACOSX_RESOURCE_PATH}") -function(sourcemeta_clang_tidy_attempt_disable) - unset(CMAKE_CXX_CLANG_TIDY PARENT_SCOPE) + set_target_properties("${SOURCEMETA_CLANG_TIDY_TARGET_NAME}" + PROPERTIES CXX_CLANG_TIDY "${SOURCEMETA_CXX_CLANG_TIDY}") endfunction() diff --git a/src/core/time/CMakeLists.txt b/src/core/time/CMakeLists.txt index 0b001806b..2909b373f 100644 --- a/src/core/time/CMakeLists.txt +++ b/src/core/time/CMakeLists.txt @@ -1,4 +1,5 @@ sourcemeta_library(NAMESPACE sourcemeta PROJECT core NAME time SOURCES gmt.cc) +sourcemeta_clang_tidy_attempt_enable(TARGET_NAME "sourcemeta_core_time") if(SOURCEMETA_CORE_INSTALL) sourcemeta_library_install(NAMESPACE sourcemeta PROJECT core NAME time) From 8dfb57d899194ffb486d5726fb93b53ff61b5690 Mon Sep 17 00:00:00 2001 From: Balakrishna Avulapati Date: Thu, 17 Jul 2025 17:28:43 +0530 Subject: [PATCH 2/5] enable clang-tidy on all sourcemeta direct targets Signed-off-by: Balakrishna Avulapati --- src/core/gzip/CMakeLists.txt | 1 + src/core/json/CMakeLists.txt | 1 + src/core/jsonl/CMakeLists.txt | 1 + src/core/jsonpointer/CMakeLists.txt | 1 + src/core/jsonschema/CMakeLists.txt | 1 + src/core/md5/CMakeLists.txt | 1 + src/core/regex/CMakeLists.txt | 1 + src/core/uri/CMakeLists.txt | 1 + src/core/uuid/CMakeLists.txt | 1 + src/core/yaml/CMakeLists.txt | 1 + src/extension/alterschema/CMakeLists.txt | 1 + 11 files changed, 11 insertions(+) diff --git a/src/core/gzip/CMakeLists.txt b/src/core/gzip/CMakeLists.txt index 1613eca1e..a3b93299a 100644 --- a/src/core/gzip/CMakeLists.txt +++ b/src/core/gzip/CMakeLists.txt @@ -1,4 +1,5 @@ sourcemeta_library(NAMESPACE sourcemeta PROJECT core NAME gzip SOURCES gzip.cc) +sourcemeta_clang_tidy_attempt_enable(TARGET_NAME "sourcemeta_core_gzip") if(SOURCEMETA_CORE_INSTALL) sourcemeta_library_install(NAMESPACE sourcemeta PROJECT core NAME gzip) diff --git a/src/core/json/CMakeLists.txt b/src/core/json/CMakeLists.txt index 7f1ad992d..dc73f9334 100644 --- a/src/core/json/CMakeLists.txt +++ b/src/core/json/CMakeLists.txt @@ -1,6 +1,7 @@ sourcemeta_library(NAMESPACE sourcemeta PROJECT core NAME json PRIVATE_HEADERS array.h error.h object.h value.h hash.h auto.h SOURCES grammar.h parser.h stringify.h json.cc json_value.cc) +sourcemeta_clang_tidy_attempt_enable(TARGET_NAME "sourcemeta_core_json") if(SOURCEMETA_CORE_INSTALL) sourcemeta_library_install(NAMESPACE sourcemeta PROJECT core NAME json) diff --git a/src/core/jsonl/CMakeLists.txt b/src/core/jsonl/CMakeLists.txt index 8ffb53c50..69470cdbd 100644 --- a/src/core/jsonl/CMakeLists.txt +++ b/src/core/jsonl/CMakeLists.txt @@ -1,6 +1,7 @@ sourcemeta_library(NAMESPACE sourcemeta PROJECT core NAME jsonl PRIVATE_HEADERS iterator.h SOURCES jsonl.cc iterator.cc grammar.h) +sourcemeta_clang_tidy_attempt_enable(TARGET_NAME "sourcemeta_core_jsonl") if(SOURCEMETA_CORE_INSTALL) sourcemeta_library_install(NAMESPACE sourcemeta PROJECT core NAME jsonl) diff --git a/src/core/jsonpointer/CMakeLists.txt b/src/core/jsonpointer/CMakeLists.txt index 2e1edae9e..d2d48c424 100644 --- a/src/core/jsonpointer/CMakeLists.txt +++ b/src/core/jsonpointer/CMakeLists.txt @@ -2,6 +2,7 @@ sourcemeta_library(NAMESPACE sourcemeta PROJECT core NAME jsonpointer PRIVATE_HEADERS pointer.h position.h error.h token.h walker.h subpointer_walker.h template.h SOURCES jsonpointer.cc stringify.h parser.h grammar.h position.cc) +sourcemeta_clang_tidy_attempt_enable(TARGET_NAME "sourcemeta_core_jsonpointer") if(SOURCEMETA_CORE_INSTALL) sourcemeta_library_install(NAMESPACE sourcemeta PROJECT core NAME jsonpointer) diff --git a/src/core/jsonschema/CMakeLists.txt b/src/core/jsonschema/CMakeLists.txt index a9161376b..028fa7b0d 100644 --- a/src/core/jsonschema/CMakeLists.txt +++ b/src/core/jsonschema/CMakeLists.txt @@ -7,6 +7,7 @@ sourcemeta_library(NAMESPACE sourcemeta PROJECT core NAME jsonschema SOURCES jsonschema.cc official_walker.cc frame.cc resolver.cc walker.cc bundle.cc transformer.cc "${CMAKE_CURRENT_BINARY_DIR}/official_resolver.cc") +sourcemeta_clang_tidy_attempt_enable(TARGET_NAME "sourcemeta_core_jsonschema") if(SOURCEMETA_CORE_INSTALL) sourcemeta_library_install(NAMESPACE sourcemeta PROJECT core NAME jsonschema) diff --git a/src/core/md5/CMakeLists.txt b/src/core/md5/CMakeLists.txt index 87882cbe4..5a9d47610 100644 --- a/src/core/md5/CMakeLists.txt +++ b/src/core/md5/CMakeLists.txt @@ -1,4 +1,5 @@ sourcemeta_library(NAMESPACE sourcemeta PROJECT core NAME md5 SOURCES md5.cc) +sourcemeta_clang_tidy_attempt_enable(TARGET_NAME "sourcemeta_core_md5") if(SOURCEMETA_CORE_INSTALL) sourcemeta_library_install(NAMESPACE sourcemeta PROJECT core NAME md5) diff --git a/src/core/regex/CMakeLists.txt b/src/core/regex/CMakeLists.txt index ef0e01f2d..896980f98 100644 --- a/src/core/regex/CMakeLists.txt +++ b/src/core/regex/CMakeLists.txt @@ -1,4 +1,5 @@ sourcemeta_library(NAMESPACE sourcemeta PROJECT core NAME regex) +sourcemeta_clang_tidy_attempt_enable(TARGET_NAME "sourcemeta_core_regex") if(SOURCEMETA_CORE_INSTALL) sourcemeta_library_install(NAMESPACE sourcemeta PROJECT core NAME regex) diff --git a/src/core/uri/CMakeLists.txt b/src/core/uri/CMakeLists.txt index 75f4d82d3..b99698523 100644 --- a/src/core/uri/CMakeLists.txt +++ b/src/core/uri/CMakeLists.txt @@ -1,6 +1,7 @@ sourcemeta_library(NAMESPACE sourcemeta PROJECT core NAME uri PRIVATE_HEADERS escape.h error.h SOURCES uri.cc escaping.cc) +sourcemeta_clang_tidy_attempt_enable(TARGET_NAME "sourcemeta_core_uri") if(SOURCEMETA_CORE_INSTALL) sourcemeta_library_install(NAMESPACE sourcemeta PROJECT core NAME uri) diff --git a/src/core/uuid/CMakeLists.txt b/src/core/uuid/CMakeLists.txt index 324b05a72..d4c0a0564 100644 --- a/src/core/uuid/CMakeLists.txt +++ b/src/core/uuid/CMakeLists.txt @@ -1,4 +1,5 @@ sourcemeta_library(NAMESPACE sourcemeta PROJECT core NAME uuid SOURCES uuid.cc) +sourcemeta_clang_tidy_attempt_enable(TARGET_NAME "sourcemeta_core_uuid") if(SOURCEMETA_CORE_INSTALL) sourcemeta_library_install(NAMESPACE sourcemeta PROJECT core NAME uuid) diff --git a/src/core/yaml/CMakeLists.txt b/src/core/yaml/CMakeLists.txt index 7b6bd8028..b59d4ddfd 100644 --- a/src/core/yaml/CMakeLists.txt +++ b/src/core/yaml/CMakeLists.txt @@ -1,6 +1,7 @@ sourcemeta_library(NAMESPACE sourcemeta PROJECT core NAME yaml PRIVATE_HEADERS error.h SOURCES yaml.cc) +sourcemeta_clang_tidy_attempt_enable(TARGET_NAME "sourcemeta_core_yaml") if(SOURCEMETA_CORE_INSTALL) sourcemeta_library_install(NAMESPACE sourcemeta PROJECT core NAME yaml) diff --git a/src/extension/alterschema/CMakeLists.txt b/src/extension/alterschema/CMakeLists.txt index 995e528cd..8f0dfae23 100644 --- a/src/extension/alterschema/CMakeLists.txt +++ b/src/extension/alterschema/CMakeLists.txt @@ -61,6 +61,7 @@ sourcemeta_library(NAMESPACE sourcemeta PROJECT core NAME alterschema linter/min_contains_without_contains.h linter/modern_official_dialect_with_empty_fragment.h linter/then_without_if.h) +sourcemeta_clang_tidy_attempt_enable(TARGET_NAME "sourcemeta_core_alterschema") if(SOURCEMETA_CORE_INSTALL) sourcemeta_library_install(NAMESPACE sourcemeta PROJECT core NAME alterschema) From 42c2e97240cb3f6bbcc17e2deb9e5fb59fcd0ebb Mon Sep 17 00:00:00 2001 From: Balakrishna Avulapati Date: Thu, 17 Jul 2025 18:17:34 +0530 Subject: [PATCH 3/5] add target name to the log message Signed-off-by: Balakrishna Avulapati --- cmake/common/clang-tidy.cmake | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/cmake/common/clang-tidy.cmake b/cmake/common/clang-tidy.cmake index 30fea7538..1bf2abbe9 100644 --- a/cmake/common/clang-tidy.cmake +++ b/cmake/common/clang-tidy.cmake @@ -77,24 +77,26 @@ function(sourcemeta_clang_tidy_attempt_install) endfunction() function(sourcemeta_clang_tidy_attempt_enable) + cmake_parse_arguments(PARSE_ARGV 0 SOURCEMETA_CLANG_TIDY "" "TARGET_NAME" "") + if(NOT SOURCEMETA_CLANG_TIDY_TARGET_NAME) + message(STATUS "ClangTidy runs at target level. TARGET_NAME is required.") + return() + endif() + # TODO: Support other platforms too, like Linux if(NOT APPLE) - message(STATUS "Ignoring ClangTidy setup on OS other than APPLE") + message(STATUS "Ignoring ClangTidy setup on OS other than APPLE for target ${SOURCEMETA_CLANG_TIDY_TARGET_NAME}") return() endif() + if(SOURCEMETA_COMPILER_LLVM) - message(STATUS "Enabling ClangTidy alongside compilation") + message(STATUS "Enabling ClangTidy alongside compilation for target ${SOURCEMETA_CLANG_TIDY_TARGET_NAME}") else() - message(STATUS "Ignoring ClangTidy setup on a compiler other than LLVM") + message(STATUS "Ignoring ClangTidy setup on a compiler other than LLVM for target ${SOURCEMETA_CLANG_TIDY_TARGET_NAME}") return() endif() - cmake_parse_arguments(PARSE_ARGV 0 SOURCEMETA_CLANG_TIDY "" "TARGET_NAME" "") - if(NOT SOURCEMETA_CLANG_TIDY_TARGET_NAME) - message(STATUS "ClangTidy runs at target level. TARGET_NAME is required.") - return() - endif() sourcemeta_clang_tidy_attempt_install( OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin") From 734416442f77c708485d77a74fb4bef621d86f16 Mon Sep 17 00:00:00 2001 From: Balakrishna Avulapati Date: Fri, 18 Jul 2025 16:21:01 +0530 Subject: [PATCH 4/5] enable clang-tidy from sourcemeta_library() definition Signed-off-by: Balakrishna Avulapati --- cmake/common/targets/library.cmake | 3 +++ src/core/gzip/CMakeLists.txt | 1 - src/core/json/CMakeLists.txt | 1 - src/core/jsonl/CMakeLists.txt | 1 - src/core/jsonpointer/CMakeLists.txt | 1 - src/core/jsonschema/CMakeLists.txt | 1 - src/core/md5/CMakeLists.txt | 1 - src/core/regex/CMakeLists.txt | 1 - src/core/time/CMakeLists.txt | 1 - src/core/uri/CMakeLists.txt | 1 - src/core/uuid/CMakeLists.txt | 1 - src/core/yaml/CMakeLists.txt | 1 - src/extension/alterschema/CMakeLists.txt | 1 - 13 files changed, 3 insertions(+), 12 deletions(-) diff --git a/cmake/common/targets/library.cmake b/cmake/common/targets/library.cmake index e2f2ebe60..18e89aa26 100644 --- a/cmake/common/targets/library.cmake +++ b/cmake/common/targets/library.cmake @@ -115,6 +115,9 @@ function(sourcemeta_library) target_include_directories(${TARGET_NAME} PUBLIC "$") endif() + + sourcemeta_clang_tidy_attempt_enable(TARGET_NAME "${TARGET_NAME}") + endfunction() function(sourcemeta_library_install) diff --git a/src/core/gzip/CMakeLists.txt b/src/core/gzip/CMakeLists.txt index a3b93299a..1613eca1e 100644 --- a/src/core/gzip/CMakeLists.txt +++ b/src/core/gzip/CMakeLists.txt @@ -1,5 +1,4 @@ sourcemeta_library(NAMESPACE sourcemeta PROJECT core NAME gzip SOURCES gzip.cc) -sourcemeta_clang_tidy_attempt_enable(TARGET_NAME "sourcemeta_core_gzip") if(SOURCEMETA_CORE_INSTALL) sourcemeta_library_install(NAMESPACE sourcemeta PROJECT core NAME gzip) diff --git a/src/core/json/CMakeLists.txt b/src/core/json/CMakeLists.txt index dc73f9334..7f1ad992d 100644 --- a/src/core/json/CMakeLists.txt +++ b/src/core/json/CMakeLists.txt @@ -1,7 +1,6 @@ sourcemeta_library(NAMESPACE sourcemeta PROJECT core NAME json PRIVATE_HEADERS array.h error.h object.h value.h hash.h auto.h SOURCES grammar.h parser.h stringify.h json.cc json_value.cc) -sourcemeta_clang_tidy_attempt_enable(TARGET_NAME "sourcemeta_core_json") if(SOURCEMETA_CORE_INSTALL) sourcemeta_library_install(NAMESPACE sourcemeta PROJECT core NAME json) diff --git a/src/core/jsonl/CMakeLists.txt b/src/core/jsonl/CMakeLists.txt index 69470cdbd..8ffb53c50 100644 --- a/src/core/jsonl/CMakeLists.txt +++ b/src/core/jsonl/CMakeLists.txt @@ -1,7 +1,6 @@ sourcemeta_library(NAMESPACE sourcemeta PROJECT core NAME jsonl PRIVATE_HEADERS iterator.h SOURCES jsonl.cc iterator.cc grammar.h) -sourcemeta_clang_tidy_attempt_enable(TARGET_NAME "sourcemeta_core_jsonl") if(SOURCEMETA_CORE_INSTALL) sourcemeta_library_install(NAMESPACE sourcemeta PROJECT core NAME jsonl) diff --git a/src/core/jsonpointer/CMakeLists.txt b/src/core/jsonpointer/CMakeLists.txt index d2d48c424..2e1edae9e 100644 --- a/src/core/jsonpointer/CMakeLists.txt +++ b/src/core/jsonpointer/CMakeLists.txt @@ -2,7 +2,6 @@ sourcemeta_library(NAMESPACE sourcemeta PROJECT core NAME jsonpointer PRIVATE_HEADERS pointer.h position.h error.h token.h walker.h subpointer_walker.h template.h SOURCES jsonpointer.cc stringify.h parser.h grammar.h position.cc) -sourcemeta_clang_tidy_attempt_enable(TARGET_NAME "sourcemeta_core_jsonpointer") if(SOURCEMETA_CORE_INSTALL) sourcemeta_library_install(NAMESPACE sourcemeta PROJECT core NAME jsonpointer) diff --git a/src/core/jsonschema/CMakeLists.txt b/src/core/jsonschema/CMakeLists.txt index 028fa7b0d..a9161376b 100644 --- a/src/core/jsonschema/CMakeLists.txt +++ b/src/core/jsonschema/CMakeLists.txt @@ -7,7 +7,6 @@ sourcemeta_library(NAMESPACE sourcemeta PROJECT core NAME jsonschema SOURCES jsonschema.cc official_walker.cc frame.cc resolver.cc walker.cc bundle.cc transformer.cc "${CMAKE_CURRENT_BINARY_DIR}/official_resolver.cc") -sourcemeta_clang_tidy_attempt_enable(TARGET_NAME "sourcemeta_core_jsonschema") if(SOURCEMETA_CORE_INSTALL) sourcemeta_library_install(NAMESPACE sourcemeta PROJECT core NAME jsonschema) diff --git a/src/core/md5/CMakeLists.txt b/src/core/md5/CMakeLists.txt index 5a9d47610..87882cbe4 100644 --- a/src/core/md5/CMakeLists.txt +++ b/src/core/md5/CMakeLists.txt @@ -1,5 +1,4 @@ sourcemeta_library(NAMESPACE sourcemeta PROJECT core NAME md5 SOURCES md5.cc) -sourcemeta_clang_tidy_attempt_enable(TARGET_NAME "sourcemeta_core_md5") if(SOURCEMETA_CORE_INSTALL) sourcemeta_library_install(NAMESPACE sourcemeta PROJECT core NAME md5) diff --git a/src/core/regex/CMakeLists.txt b/src/core/regex/CMakeLists.txt index 896980f98..ef0e01f2d 100644 --- a/src/core/regex/CMakeLists.txt +++ b/src/core/regex/CMakeLists.txt @@ -1,5 +1,4 @@ sourcemeta_library(NAMESPACE sourcemeta PROJECT core NAME regex) -sourcemeta_clang_tidy_attempt_enable(TARGET_NAME "sourcemeta_core_regex") if(SOURCEMETA_CORE_INSTALL) sourcemeta_library_install(NAMESPACE sourcemeta PROJECT core NAME regex) diff --git a/src/core/time/CMakeLists.txt b/src/core/time/CMakeLists.txt index 2909b373f..0b001806b 100644 --- a/src/core/time/CMakeLists.txt +++ b/src/core/time/CMakeLists.txt @@ -1,5 +1,4 @@ sourcemeta_library(NAMESPACE sourcemeta PROJECT core NAME time SOURCES gmt.cc) -sourcemeta_clang_tidy_attempt_enable(TARGET_NAME "sourcemeta_core_time") if(SOURCEMETA_CORE_INSTALL) sourcemeta_library_install(NAMESPACE sourcemeta PROJECT core NAME time) diff --git a/src/core/uri/CMakeLists.txt b/src/core/uri/CMakeLists.txt index b99698523..75f4d82d3 100644 --- a/src/core/uri/CMakeLists.txt +++ b/src/core/uri/CMakeLists.txt @@ -1,7 +1,6 @@ sourcemeta_library(NAMESPACE sourcemeta PROJECT core NAME uri PRIVATE_HEADERS escape.h error.h SOURCES uri.cc escaping.cc) -sourcemeta_clang_tidy_attempt_enable(TARGET_NAME "sourcemeta_core_uri") if(SOURCEMETA_CORE_INSTALL) sourcemeta_library_install(NAMESPACE sourcemeta PROJECT core NAME uri) diff --git a/src/core/uuid/CMakeLists.txt b/src/core/uuid/CMakeLists.txt index d4c0a0564..324b05a72 100644 --- a/src/core/uuid/CMakeLists.txt +++ b/src/core/uuid/CMakeLists.txt @@ -1,5 +1,4 @@ sourcemeta_library(NAMESPACE sourcemeta PROJECT core NAME uuid SOURCES uuid.cc) -sourcemeta_clang_tidy_attempt_enable(TARGET_NAME "sourcemeta_core_uuid") if(SOURCEMETA_CORE_INSTALL) sourcemeta_library_install(NAMESPACE sourcemeta PROJECT core NAME uuid) diff --git a/src/core/yaml/CMakeLists.txt b/src/core/yaml/CMakeLists.txt index b59d4ddfd..7b6bd8028 100644 --- a/src/core/yaml/CMakeLists.txt +++ b/src/core/yaml/CMakeLists.txt @@ -1,7 +1,6 @@ sourcemeta_library(NAMESPACE sourcemeta PROJECT core NAME yaml PRIVATE_HEADERS error.h SOURCES yaml.cc) -sourcemeta_clang_tidy_attempt_enable(TARGET_NAME "sourcemeta_core_yaml") if(SOURCEMETA_CORE_INSTALL) sourcemeta_library_install(NAMESPACE sourcemeta PROJECT core NAME yaml) diff --git a/src/extension/alterschema/CMakeLists.txt b/src/extension/alterschema/CMakeLists.txt index 8f0dfae23..995e528cd 100644 --- a/src/extension/alterschema/CMakeLists.txt +++ b/src/extension/alterschema/CMakeLists.txt @@ -61,7 +61,6 @@ sourcemeta_library(NAMESPACE sourcemeta PROJECT core NAME alterschema linter/min_contains_without_contains.h linter/modern_official_dialect_with_empty_fragment.h linter/then_without_if.h) -sourcemeta_clang_tidy_attempt_enable(TARGET_NAME "sourcemeta_core_alterschema") if(SOURCEMETA_CORE_INSTALL) sourcemeta_library_install(NAMESPACE sourcemeta PROJECT core NAME alterschema) From de512049e7a4ed0a9c16d35e76d238c344d904ea Mon Sep 17 00:00:00 2001 From: Juan Cruz Viotti Date: Fri, 18 Jul 2025 18:19:01 -0400 Subject: [PATCH 5/5] Misc minor improvements Signed-off-by: Juan Cruz Viotti --- cmake/common/clang-tidy.cmake | 66 ++++++++++++------------------ cmake/common/targets/library.cmake | 3 +- 2 files changed, 28 insertions(+), 41 deletions(-) diff --git a/cmake/common/clang-tidy.cmake b/cmake/common/clang-tidy.cmake index 1bf2abbe9..30d0e7ebd 100644 --- a/cmake/common/clang-tidy.cmake +++ b/cmake/common/clang-tidy.cmake @@ -77,53 +77,41 @@ function(sourcemeta_clang_tidy_attempt_install) endfunction() function(sourcemeta_clang_tidy_attempt_enable) - cmake_parse_arguments(PARSE_ARGV 0 SOURCEMETA_CLANG_TIDY "" "TARGET_NAME" "") - if(NOT SOURCEMETA_CLANG_TIDY_TARGET_NAME) - message(STATUS "ClangTidy runs at target level. TARGET_NAME is required.") - return() + cmake_parse_arguments(SOURCEMETA_TARGET_CLANG_TIDY_ATTEMPT_ENABLE "" "TARGET" "" ${ARGN}) + if(NOT SOURCEMETA_TARGET_CLANG_TIDY_ATTEMPT_ENABLE_TARGET) + message(FATAL_ERROR "You must pass the target name using the TARGET option") endif() # TODO: Support other platforms too, like Linux - if(NOT APPLE) - message(STATUS "Ignoring ClangTidy setup on OS other than APPLE for target ${SOURCEMETA_CLANG_TIDY_TARGET_NAME}") - return() - endif() - - - if(SOURCEMETA_COMPILER_LLVM) - message(STATUS "Enabling ClangTidy alongside compilation for target ${SOURCEMETA_CLANG_TIDY_TARGET_NAME}") + if(APPLE AND SOURCEMETA_COMPILER_LLVM) + message(STATUS "Enabling ClangTidy alongside compilation for target ${SOURCEMETA_TARGET_CLANG_TIDY_ATTEMPT_ENABLE_TARGET}") else() - message(STATUS "Ignoring ClangTidy setup on a compiler other than LLVM for target ${SOURCEMETA_CLANG_TIDY_TARGET_NAME}") return() endif() - - sourcemeta_clang_tidy_attempt_install( - OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin") - - if(SOURCEMETA_CXX_CLANG_TIDY) - set_target_properties("${SOURCEMETA_CLANG_TIDY_TARGET_NAME}" - PROPERTIES CXX_CLANG_TIDY "${SOURCEMETA_CXX_CLANG_TIDY}") - return() + # We rely on this cache variable to not pre-compute the ClangTidy + # setup over and over again for every single target + if(NOT SOURCEMETA_CXX_CLANG_TIDY) + sourcemeta_clang_tidy_attempt_install( + OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin") + find_program(CLANG_TIDY_BIN NAMES clang-tidy + NO_DEFAULT_PATH + PATHS "${PROJECT_BINARY_DIR}/bin" + REQUIRED) + set(CLANG_TIDY_CONFIG "${CMAKE_CURRENT_FUNCTION_LIST_DIR}/clang-tidy.config") + execute_process(COMMAND xcrun --show-sdk-path + OUTPUT_VARIABLE MACOSX_SDK_PATH OUTPUT_STRIP_TRAILING_WHITESPACE) + execute_process(COMMAND "${CMAKE_CXX_COMPILER}" -print-resource-dir + OUTPUT_VARIABLE MACOSX_RESOURCE_PATH OUTPUT_STRIP_TRAILING_WHITESPACE) + set(SOURCEMETA_CXX_CLANG_TIDY + "${CLANG_TIDY_BIN};--config-file=${CLANG_TIDY_CONFIG};-header-filter=${PROJECT_SOURCE_DIR}/src/*" + "--extra-arg=-std=c++${CMAKE_CXX_STANDARD}" + "--extra-arg=-isysroot" + "--extra-arg=${MACOSX_SDK_PATH}" + "--extra-arg=-resource-dir=${MACOSX_RESOURCE_PATH}" + CACHE STRING "CXX_CLANG_TIDY") endif() - find_program(CLANG_TIDY_BIN NAMES clang-tidy - NO_DEFAULT_PATH - PATHS "${PROJECT_BINARY_DIR}/bin" - REQUIRED) - - set(CLANG_TIDY_CONFIG "${CMAKE_CURRENT_FUNCTION_LIST_DIR}/clang-tidy.config") - execute_process(COMMAND xcrun --show-sdk-path - OUTPUT_VARIABLE MACOSX_SDK_PATH OUTPUT_STRIP_TRAILING_WHITESPACE) - execute_process(COMMAND "${CMAKE_CXX_COMPILER}" -print-resource-dir - OUTPUT_VARIABLE MACOSX_RESOURCE_PATH OUTPUT_STRIP_TRAILING_WHITESPACE) - set(SOURCEMETA_CXX_CLANG_TIDY - "${CLANG_TIDY_BIN};--config-file=${CLANG_TIDY_CONFIG};-header-filter=${PROJECT_SOURCE_DIR}/src/*" - "--extra-arg=-std=c++${CMAKE_CXX_STANDARD}" - "--extra-arg=-isysroot" - "--extra-arg=${MACOSX_SDK_PATH}" - "--extra-arg=-resource-dir=${MACOSX_RESOURCE_PATH}") - - set_target_properties("${SOURCEMETA_CLANG_TIDY_TARGET_NAME}" + set_target_properties("${SOURCEMETA_TARGET_CLANG_TIDY_ATTEMPT_ENABLE_TARGET}" PROPERTIES CXX_CLANG_TIDY "${SOURCEMETA_CXX_CLANG_TIDY}") endfunction() diff --git a/cmake/common/targets/library.cmake b/cmake/common/targets/library.cmake index 18e89aa26..c13a25185 100644 --- a/cmake/common/targets/library.cmake +++ b/cmake/common/targets/library.cmake @@ -116,8 +116,7 @@ function(sourcemeta_library) PUBLIC "$") endif() - sourcemeta_clang_tidy_attempt_enable(TARGET_NAME "${TARGET_NAME}") - + sourcemeta_clang_tidy_attempt_enable(TARGET "${TARGET_NAME}") endfunction() function(sourcemeta_library_install)