如何避免clang-tidy检查自动生成的代码文件?
问题:禁用Protobuf生成代码的clang-tidy检查
项目中Protobuf生成的C++文件会被clang-tidy扫描,产生大量无意义警告。当前采用在生成目录放置.clang-tidy文件禁用规则的方案,仍存在clang-tidy解析文件的时间损耗。现有CMake配置如下:
顶层CMakeLists.txt
# 全局启用clang-tidy set(CMAKE_CXX_CLANG_TIDY ${CLANG_TIDY_EXECUTABLE}; --header-filter=.) # 导入Protobuf生成文件的系统头目录 include_directories(SYSTEM ${CMAKE_BINARY_DIR}/grpc_interface) target_link_libraries(${PROJECT_NAME} # ... grpc_services )
grpc_interface/CMakeLists.txt
project(grpc_services) set(PROTO_IMPORT_DIRS ${CMAKE_SOURCE_DIR}/protocols/protobuf/ ) set(PROTOS ${CMAKE_SOURCE_DIR}/protocols/protobuf/test_message.proto ) add_library(${PROJECT_NAME} STATIC ${PROTOS}) target_link_libraries(${PROJECT_NAME} PUBLIC protobuf::libprotobuf gRPC::grpc++ ) get_target_property(GRPC_CPP_PLUGIN gRPC::grpc_cpp_plugin LOCATION) protobuf_generate( TARGET ${PROJECT_NAME} IMPORT_DIRS ${PROTO_IMPORT_DIRS} LANGUAGE cpp ) protobuf_generate( TARGET ${PROJECT_NAME} IMPORT_DIRS ${PROTO_IMPORT_DIRS} LANGUAGE grpc GENERATE_EXTENSIONS .grpc.pb.h .grpc.pb.cc PLUGIN "protoc-gen-grpc=${GRPC_CPP_PLUGIN}" )
需要更高效的方式,仅禁用grpc_services目标的clang-tidy检查,避免不必要的解析开销。
解决方案
方法1:针对目标直接禁用clang-tidy
在grpc_interface/CMakeLists.txt的add_library语句之后,添加以下配置,直接覆盖全局clang-tidy设置:
# 禁用当前目标的clang-tidy检查 set_target_properties(${PROJECT_NAME} PROPERTIES CXX_CLANG_TIDY "" )
此方法会让clang-tidy完全跳过grpc_services目标下的所有文件,彻底消除解析时间损耗,是最直接高效的方案。
方法2:调整全局header-filter排除生成目录
如果仅想跳过生成的头文件(仍检查.cc文件),可修改顶层的CMAKE_CXX_CLANG_TIDY参数,限制仅扫描源码目录下的头文件:
set(CMAKE_CXX_CLANG_TIDY ${CLANG_TIDY_EXECUTABLE}; --header-filter="^${CMAKE_SOURCE_DIR}/")
这种方式会让clang-tidy忽略CMAKE_BINARY_DIR下生成的头文件,但仍会处理生成的.cc文件,效率略低于方法1。
方法3:临时关闭全局clang-tidy后恢复
在生成Protobuf代码前临时清空全局clang-tidy配置,生成完成后恢复:
# 保存当前全局clang-tidy配置 set(OLD_CLANG_TIDY ${CMAKE_CXX_CLANG_TIDY}) # 临时禁用全局clang-tidy set(CMAKE_CXX_CLANG_TIDY "") protobuf_generate( TARGET ${PROJECT_NAME} IMPORT_DIRS ${PROTO_IMPORT_DIRS} LANGUAGE cpp ) protobuf_generate( TARGET ${PROJECT_NAME} IMPORT_DIRS ${PROTO_IMPORT_DIRS} LANGUAGE grpc GENERATE_EXTENSIONS .grpc.pb.h .grpc.pb.cc PLUGIN "protoc-gen-grpc=${GRPC_CPP_PLUGIN}" ) # 恢复全局clang-tidy配置 set(CMAKE_CXX_CLANG_TIDY ${OLD_CLANG_TIDY})
此方式适用于需要临时调整全局配置的场景,但不如方法1直接,因为grpc_services本身仅包含生成文件,针对目标禁用更合理。
内容的提问来源于stack exchange,提问作者Alex O
相关产品推荐
相关产品推荐

