使用 clang-tidy 时忽略某些文件

问题描述 投票:0回答:3

我正在尝试将

clang-tidy
cmake
集成,但是有些文件属于我想忽略的特定目标。

有没有办法让 clang-tidy 忽略特定目录下的文件或名称与特定模式匹配的文件?

cmake static-analysis clang-tidy clang-static-analyzer
3个回答
0
投票

据我所知,最好的答案是使用 clang-tidy 会理解的注释。

https://clang.llvm.org/extra/clang-tidy/#suppressing-undesired-diagnostics

// NOLINTBEGIN
...
// NOLINTEND

0
投票

在您要忽略的目录中,创建一个

.clang-tidy
配置文件,禁用所有检查:

Checks: '-*'

如果没有办法将这样的文件保存在存储库中,可以在使用

echo "Checks: '-*'" > $folder2ignore/.clang-tidy
运行 clang-tidy 之前轻松生成该文件。 (这甚至会覆盖现有的
.clang-tidy
,有效地禁用文件夹的clang-tidy)


0
投票

不幸的是,

CXX_CLANG_TIDY
是一个per-target属性, 所以我们无法使用
set_source_files_properties
.

来实现这一点

但是如果我们想为特定目标禁用 clang-tidy, 就这么简单:

set_property(TARGET your_target_here PROPERTY CXX_CLANG_TIDY "cmake;-E;true")

cmake -E true
是一个 noop 命令,因此不会调用 clang tidy。 我们不能只使用
clang-tidy --checks=-*
,因为这会引发所有检查都被禁用的错误。

如果我们需要控制每个文件,它会变得更加复杂。 我们必须添加一个单独的OBJECT库目标 仅针对我们不想整理的文件,然后将其链接 一个到主要目标。因为对象库实际上只是一堆 .o 文件的句柄(没有创建捆绑存档/库),所以这不会导致任何构建时间开销。

这是一个完整的例子:

cmake_minimum_required(VERSION 3.12)
project(demo)

# default clang-tidy options, alternatively, you can specify this manually 
# using set_property for each target, then you don't need the noop trick below
set(CMAKE_CXX_CLANG_TIDY clang-tidy;-format-style='file') 

set(SOURCES main.cpp) # sources we want tidy'd
set(NO_CLANG_TIDY_SOURCES foo.cpp) # sources we don't want tidy'd

# add dummy target for no clang tidy sources
add_library(demo_no_clang_tidy OBJECT ${NO_CLANG_TIDY_SOURCES})
# disable clang tidy for this target (`cmake -E true` is a portable noop command)
set_property(TARGET demo_no_clang_tidy PROPERTY CXX_CLANG_TIDY "cmake;-E;true")

# add our real target
add_executable(demo ${SOURCES})
# link in the sources from our object library
target_link_libraries(demo demo_no_clang_tidy)
  • 如果你不想手动指定源(你提到你想要每个目录)你可以使用 glob(虽然不是真正的最佳实践):
set(SOURCES main.cpp foo.cpp) # all sources
# specify glob expressions for files NOT to clang-tidy 
file(GLOB NO_CLANG_TIDY_SOURCES 
     LIST_DIRECTORIES false 
     RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" 
     "f*.cpp" "foo/*.cpp"
)

# remove these files from the main SOURCES list
list(REMOVE_ITEM SOURCES ${NO_CLANG_TIDY_SOURCES})
  • 如果您有自定义目标选项(包括路径、pp 指令等),您显然需要为两个目标设置它们。
© www.soinside.com 2019 - 2024. All rights reserved.