CMAKE 有条件地运行 cppcheck

Posted

技术标签:

【中文标题】CMAKE 有条件地运行 cppcheck【英文标题】:CMAKE conditionally run cppcheck 【发布时间】:2019-07-09 16:42:16 【问题描述】:

我有一个定义 cppcheck 的 CMakefile,如 Cppcheck support in CMake 效果很好,但我希望能够一遍又一遍地编译我的代码,并且在我认为我快完成之前不运行 cppcheck,然后在提交之前运行 cppcheck。

cppcheck 太慢,无法作为我的编辑/编译/测试/调试周期的一部分。

这方面的最佳做法是什么?我正在考虑定义一个变量并生成文件,然后构建和构建。 例如

在 CMakeLists.txt 中

if(CPPCHECK STREQUAL "yes")
  set(CMAKE_CXX_CPPCHECK "cppcheck")
endif()

在编写代码时

cmake3 -G "Unix Makefiles" ..
cmake3  --build . 
cmake3  --build .

然后在提交代码之前

cmake3 -G "Unix Makefiles" -DCPPCHECK=yes ..
cmake3  --build . 

有没有更好的办法?

【问题讨论】:

使用add_custom_target 创建一个自定义目标,并随时使用make yourtarget 运行它。 【参考方案1】:

我主要按照所描述的问题进行操作 - 仅在设置了特定变量时才运行代码分析。我通常在我的***CMakeLists.txt 中遵循这样的模式:

option(ENABLE_CODE_ANALYSIS "Run code analysis" OFF)
message(STATUS "ENABLE_CODE_ANALYSIS       $ENABLE_CODE_ANALYSIS")

if(ENABLE_CODE_ANALYSIS)
    find_program(cppcheck cppcheck)
    message(STATUS "cppcheck                   $cppcheck")
    if(NOT (cppcheck MATCHES "NOTFOUND"))
        # Notes:
        # - unmatchedSuppression needed since not all source files are
        #   analyzed simultaneously
        # - unusedFunction needed since not all source files are
        #   analyzed simultaneously
        # - template needed to force "warning" into output string, and
        #   to make the 'id' available for suppression
        set(CMAKE_CXX_CPPCHECK "$cppcheck"
            "--enable=all"
            "--inconclusive"
            "--inline-suppr"
            "--quiet"
            "--suppress=unmatchedSuppression"
            "--suppress=unusedFunction"
            "--template='file:line: warning: id (severity): message'")
    endif()
endif(ENABLE_CODE_ANALYSIS)

通常我会对clang-tidy 执行相同的操作,并让ENABLE_CODE_ANALYSIS 同时启用cppcheckclang-tidy

我默认不进行代码分析,因为代码分析往往很慢。但是可以在生成构建系统的时候通过cmake -G "my generator" -DENABLE_CODE_ANALYSIS=ON ..开启。

【讨论】:

以上是关于CMAKE 有条件地运行 cppcheck的主要内容,如果未能解决你的问题,请参考以下文章

CMake条件库链接取决于平台

CMake中if的使用

有条件地运行 npm 脚本

CMake IF 条件返回错误结果

在不使用 CTest 的情况下使用 CMake 构建测试

我们如何有条件地运行 CircleCI 工作流程?