如何通过CMake排除外部目录的clang-tidy检查?
解决JUCE源码模块被clang-tidy扫描的问题
方案1:针对JUCE目标禁用clang-tidy
由于JUCE是以源码形式被引入为CMake目标,你可以直接遍历所有JUCE前缀的目标,清空它们的CXX_CLANG_TIDY属性,跳过检查:
首先添加一个辅助函数来获取所有CMake目标(CMake无内置该函数):
function(get_all_targets var) set(targets) get_all_targets_recursive(targets ${CMAKE_CURRENT_SOURCE_DIR}) set(${var} ${targets} PARENT_SCOPE) endfunction() function(get_all_targets_recursive targets dir) get_property(subdirectories DIRECTORY ${dir} PROPERTY SUBDIRECTORIES) foreach(subdir IN LISTS subdirectories) get_all_targets_recursive(targets ${subdir}) endforeach() get_property(current_targets DIRECTORY ${dir} PROPERTY BUILDSYSTEM_TARGETS) list(APPEND targets ${current_targets}) set(targets ${targets} PARENT_SCOPE) endfunction()
然后遍历并禁用JUCE目标的clang-tidy:
get_all_targets(all_targets) foreach(target IN LISTS all_targets) if(target MATCHES "^JUCE::") set_target_properties(${target} PROPERTIES CXX_CLANG_TIDY "") endif() endforeach()
如果知道具体的JUCE目标(如JUCE::juce_core、JUCE::juce_gui_basics),也可以直接指定:
set_target_properties(JUCE::juce_core JUCE::juce_gui_basics PROPERTIES CXX_CLANG_TIDY "")
方案2:精确配置.clang-tidy的过滤规则
如果不想修改CMake目标属性,可以调整.clang-tidy文件的过滤规则:
使用
HeaderFilterRegex仅匹配你的项目源码路径,比如你的源码都在src/目录下:HeaderFilterRegex: '^/path/to/your/project/src/'若要通过CMake动态替换路径,可创建
.clang-tidy.in模板文件,用configure_file生成最终的.clang-tidy:# .clang-tidy.in HeaderFilterRegex: '^@CMAKE_SOURCE_DIR@/src/'然后在CMakeLists.txt中添加:
configure_file(.clang-tidy.in .clang-tidy @ONLY)或者用
IgnoreRegex直接排除JUCE的路径:IgnoreRegex: '^/path/to/JUCE/'
方案3:只为自己的项目目标启用clang-tidy
避免全局设置CMAKE_CXX_CLANG_TIDY,而是仅在你自己的项目目标上配置clang-tidy:
add_executable(MyJUCEProject src/Main.cpp src/MyComponent.cpp) # 仅为当前项目目标启用clang-tidy,并设置过滤规则 set_target_properties(MyJUCEProject PROPERTIES CXX_CLANG_TIDY "clang-tidy;--header-filter=^${CMAKE_SOURCE_DIR}/src/" ) # 链接JUCE目标 target_link_libraries(MyJUCEProject PRIVATE JUCE::juce_core JUCE::juce_gui_basics)
为什么--header-filter无效?
当JUCE作为源码目标被编译时,clang-tidy是针对每个CMake目标独立运行的。全局设置的--header-filter可能无法覆盖JUCE目标的扫描上下文,或者你使用的路径匹配规则与JUCE文件的绝对路径不匹配(比如用了相对路径而clang-tidy接收的是绝对路径)。
内容的提问来源于stack exchange,提问作者EwanMe
相关产品推荐
相关产品推荐

