You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 03:22:13