【问题标题】:How to use cpplint code style checking with CMake?如何在 CMake 中使用 cpplint 代码样式检查?
【发布时间】:2018-07-29 17:04:12
【问题描述】:

我找到的唯一在线资源是CMAKE_<LANG>_CPPLINT 上的 CMake 文档(链接 here)和这个示例(链接 here),但我无法弄清楚如何在 CMakeLists.txt 文件中实际使用它. 我尝试了提供的示例,但无法使其工作。仅供参考,我按照here 的说明安装了 cpplint。

到目前为止,我可以使用这个 CMake 命令在 CMakeLists.txt 中运行 cpplint python 脚本:

execute_process(COMMAND cpplint path/To/File/To/Analyse.cpp)

但是,我很确定这不是正确的做法。

【问题讨论】:

    标签: cmake cpplint


    【解决方案1】:

    Daniel Pffeifer 的“Effective Cmake”(https://www.youtube.com/watch?v=rLopVhns4Zs&amp=&t=77m13s) 中介绍了在 CMake 中使用静态分析工具的推荐方法。

    您可以在调用cmake时定义它,例如:

    cmake "-DCMAKE_CXX_CPPLINT=cpplint" ..
    

    或放入CMakeLists.txt:

    set(CMAKE_CXX_CPPLINT "cpplint")
    

    推荐的选项是第一个(我们不应该在项目中定义什么不是项目要求)。

    CMake 将为它编译的每个文件调用cpplint。您可以在分号后传递额外的参数(例如-DCMAKE_CXX_CPPLINT=cpplint;--linelength=100)。


    这种方法的缺点:

    1. 错误计数不会累积(因为cpplint 是为每个文件单独调用的)。
    2. 它不会检查头文件(与 D. Pffeifer 在他的演示文稿中所说的相反,cpplint 不会扫描包含文件)。

    请注意,您可以以同样的方式使用其他静态分析工具:

    • 部落整洁"-DCMAKE_CXX_CLANG_TIDY=/usr/bin/clang-tidy-3.9;-checks=*"
    • CppCheck "-DCMAKE_CXX_CPPCHECK=/usr/bin/cppcheck;--std=c++11"
    • IWYU"-DCMAKE_CXX_INCLUDE_WHAT_YOU_USE=/usr/bin/iwyu;--transitive_includes_only"
    • LWYUcmake -DCMAKE_LINK_WHAT_YOU_USE=TRUE
    • 疯狂

    其中一些需要“编译数据库”(set(CMAKE_EXPORT_COMPILE_COMMANDS ON))。

    【讨论】:

      【解决方案2】:

      我没有使用CMAKE_<LANG>_CPPLINT检查代码样式。

      我通过使用add_custom_target 来实现。

      1. 下载cpplint.py

      2. 然后下载cpplint.cmake或自己写。

      假设您的项目中有一个名为src的源代码目录,将这些语句编码到您的CMakeLists.txt中。

      aux_source_directory(${CMAKE_SOURCE_DIR}/src src)
      
      set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}) #I put cpplint.cmake in $CMAKE_SOURCE_DIR
      include(cpplint)
      
      add_style_check_target(phoenix-cpplint "${src}") 
      

      注意:

      1. 你应该传递整个列表,所以使用"${src}" instead of ${src}

      2. 默认情况下,没有任何东西依赖于自定义目标,请参阅add_custom_target

      如果还有问题,debug your CMakeLists.txt

      【讨论】:

      • 感谢您的回答。如何确保此自定义目标在所有其他应用程序目标之后运行?
      【解决方案3】:

      我一直在努力解决同样的问题。

      我用 CMake 3.10.2 尝试过,user2449761 的评论仍然正确。使用 set(CMAKE_CXX_CPPLINT "cpplint") 仍然不会检查任何头文件。

      kgbook 的答案不再起作用,因为 aux_source_directory 没有列出头文件。但是,您可以使用

      get_target_property(src staticcodecheck SOURCES)
      

      这将为您提供所有非系统标头。其余的可以保持不变。至于在特定时间运行cpplint,你可以试试

      add_custom_command(TARGET ${TARGET}
          PRE_BUILD
      ...
      

      这将替换他的 cpplint.cmake 中的 add_custom_target(${TARGET_NAME}...。

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-25
        • 1970-01-01
        • 2015-08-07
        • 2012-10-08
        • 1970-01-01
        相关资源
        最近更新 更多