我正在尝试将
clang-tidy
与 cmake
集成,但是有些文件属于我想忽略的特定目标。
有没有办法让 clang-tidy 忽略特定目录下的文件或名称与特定模式匹配的文件?
据我所知,最好的答案是使用 clang-tidy 会理解的注释。
https://clang.llvm.org/extra/clang-tidy/#suppressing-undesired-diagnostics
// NOLINTBEGIN
...
// NOLINTEND
在您要忽略的目录中,创建一个
.clang-tidy
配置文件,禁用所有检查:
Checks: '-*'
如果没有办法将这样的文件保存在存储库中,可以在使用
echo "Checks: '-*'" > $folder2ignore/.clang-tidy
运行 clang-tidy 之前轻松生成该文件。 (这甚至会覆盖现有的.clang-tidy
,有效地禁用文件夹的clang-tidy)
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)
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})