如何禁用CPMAddPackage导入包的clang-tidy代码分析?
禁用CPM导入的mosquitto目标的clang-tidy检查
问题场景
全局通过CMAKE_CXX_CLANG_TIDY启用clang-tidy后,CPM导入的eclipse/mosquitto(2.0.11版本)因代码不符合检查规则导致构建失败,尝试设置目标的CMAKE_CXX_CLANG_TIDY属性或标记为SYSTEM目标均无效,使用CMake 3.27.7。
可行解决方案
1. 修正目标属性名(修复之前方法一的错误)
你之前误用了全局变量名CMAKE_CXX_CLANG_TIDY作为目标属性,但目标级别的clang-tidy属性是CXX_CLANG_TIDY(针对C++)和C_CLANG_TIDY(针对C),没有CMAKE_前缀。如果mosquitto包含C代码,需要同时设置C属性:
# 禁用C++目标的clang-tidy set_target_properties(mosquitto PROPERTIES CXX_CLANG_TIDY "") set_target_properties(libmosquitto PROPERTIES CXX_CLANG_TIDY "") set_target_properties(mosquitto_pub PROPERTIES CXX_CLANG_TIDY "") set_target_properties(mosquitto_sub PROPERTIES CXX_CLANG_TIDY "") set_target_properties(mosquitto_rr PROPERTIES CXX_CLANG_TIDY "") # 若mosquitto包含C代码,补充禁用C目标的clang-tidy set_target_properties(mosquitto PROPERTIES C_CLANG_TIDY "") set_target_properties(libmosquitto PROPERTIES C_CLANG_TIDY "")
2. 在CPM导入时直接传递参数禁用clang-tidy
利用CPM的CMAKE_ARGS,在导入mosquitto时直接覆盖其子项目的clang-tidy全局设置,从根源避免检查:
CPMAddPackage( NAME mosquitto GITHUB_REPOSITORY eclipse/mosquitto VERSION 2.0.11 CMAKE_ARGS CMAKE_CXX_CLANG_TIDY="" CMAKE_C_CLANG_TIDY="" # 针对C代码的检查,按需添加 )
3. 使用CMake钩子在子项目配置前禁用
通过CMAKE_PROJECT_INCLUDE_BEFORE钩子,在mosquitto子项目启动配置时自动禁用clang-tidy,适用于批量处理子项目的场景:
# 生成临时脚本,当子项目是mosquitto时禁用clang-tidy file(WRITE "${CMAKE_BINARY_DIR}/DisableClangTidyForMosquitto.cmake" " if(PROJECT_NAME STREQUAL mosquitto) set(CMAKE_CXX_CLANG_TIDY \"\") set(CMAKE_C_CLANG_TIDY \"\") endif() ") # 设置钩子,所有子项目配置前执行该脚本 set(CMAKE_PROJECT_INCLUDE_BEFORE "${CMAKE_BINARY_DIR}/DisableClangTidyForMosquitto.cmake") # 执行CPM导入 CPMAddPackage( NAME mosquitto GITHUB_REPOSITORY eclipse/mosquitto VERSION 2.0.11 )
4. 确认目标名称是否正确
部分情况下CPM导入的目标会带有命名空间前缀(如mosquitto::libmosquitto),可以通过以下代码打印所有目标,确认真实名称:
get_property(all_targets DIRECTORY PROPERTY BUILDSYSTEM_TARGETS) message(STATUS "All available targets: ${all_targets}")
根据输出的目标名称,调整set_target_properties中的目标参数即可。
内容的提问来源于stack exchange,提问作者Gaetano Mendola
相关产品推荐
相关产品推荐

