如何在 CMake 中使用 cpplint 代码风格检查?
How to use cpplint code style checking with CMake?
我找到的唯一在线资源是关于 CMAKE_<LANG>_CPPLINT
(link here) and this example (link here) 的 CMake 文档,但我不知道如何在 [=20] 中实际使用它=] 文件。
我尝试了提供的示例,但无法正常工作。仅供参考,我按照 here.
的说明安装了 cpplint
截至目前,我可以使用此 CMake 命令 运行 CMakeLists.txt 中的 cpplint python 脚本:
execute_process(COMMAND cpplint path/To/File/To/Analyse.cpp)
但是,我很确定这不是正确的方法。
我没有使用 CMAKE_<LANG>_CPPLINT
检查代码风格。
我用add_custom_target
.
做的
然后下载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}")
注:
你应该传递整个列表,所以使用 "${src}"
instead of ${src}
。
默认情况下不依赖于自定义目标,请参阅add_custom_target。
如果还有问题,debug your CMakeLists.txt。
在 Daniel Pffeifer 的 "Effective Cmake" (https://www.youtube.com/watch?v=rLopVhns4Zs&=&t=77m13s).
中介绍了在 CMake 中使用静态分析工具的推荐方法
您可以在调用cmake
时定义它,例如:
cmake "-DCMAKE_CXX_CPPLINT=cpplint" ..
或放入CMakeLists.txt
:
set(CMAKE_CXX_CPPLINT "cpplint")
推荐的选项是第一个(我们不应该在项目中定义不是项目要求的东西)。
CMake 会为它编译的每个文件调用 cpplint
。您可以在分号后传递额外的参数(例如 -DCMAKE_CXX_CPPLINT=cpplint;--linelength=100
)。
此方法的缺点:
- 错误计数不会累积(因为
cpplint
是分别为每个文件调用的)。
- 它不会检查头文件(与 D. Pffeifer 在他的演示文稿中所说的相反,
cpplint
不会扫描包含文件)。
注意你可以用同样的方法使用其他静态分析工具:
- 氏族整洁
"-DCMAKE_CXX_CLANG_TIDY=/usr/bin/clang-tidy-3.9;-checks=*"
- CppCheck
"-DCMAKE_CXX_CPPCHECK=/usr/bin/cppcheck;--std=c++11"
- 武汉大学
"-DCMAKE_CXX_INCLUDE_WHAT_YOU_USE=/usr/bin/iwyu;--transitive_includes_only"
- 刘宇宇
cmake -DCMAKE_LINK_WHAT_YOU_USE=TRUE
- 疯狂
其中一些需要 "compilation database" (set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
)。
我一直在为同样的问题而苦苦挣扎。
我用 CMake 3.10.2 试过了,user2449761 的评论仍然正确。使用 set(CMAKE_CXX_CPPLINT "cpplint") 仍然不检查任何 header 文件。
kgbook 的回答不再有效,因为 aux_source_directory 没有列出 header 文件。但是,您可以使用
get_target_property(src staticcodecheck SOURCES)
这将为您提供所有 non-system header。其余的可以保持不变。至于运行 cpplint 在特定时间,你可以试试
add_custom_command(TARGET ${TARGET}
PRE_BUILD
...
这将取代 add_custom_target(${TARGET_NAME}... 在他的 cpplint.cmake.
希望对您有所帮助。
我找到的唯一在线资源是关于 CMAKE_<LANG>_CPPLINT
(link here) and this example (link here) 的 CMake 文档,但我不知道如何在 [=20] 中实际使用它=] 文件。
我尝试了提供的示例,但无法正常工作。仅供参考,我按照 here.
截至目前,我可以使用此 CMake 命令 运行 CMakeLists.txt 中的 cpplint python 脚本:
execute_process(COMMAND cpplint path/To/File/To/Analyse.cpp)
但是,我很确定这不是正确的方法。
我没有使用 CMAKE_<LANG>_CPPLINT
检查代码风格。
我用add_custom_target
.
然后下载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}")
注:
你应该传递整个列表,所以使用
"${src}"
instead of${src}
。默认情况下不依赖于自定义目标,请参阅add_custom_target。
如果还有问题,debug your CMakeLists.txt。
在 Daniel Pffeifer 的 "Effective Cmake" (https://www.youtube.com/watch?v=rLopVhns4Zs&=&t=77m13s).
中介绍了在 CMake 中使用静态分析工具的推荐方法您可以在调用cmake
时定义它,例如:
cmake "-DCMAKE_CXX_CPPLINT=cpplint" ..
或放入CMakeLists.txt
:
set(CMAKE_CXX_CPPLINT "cpplint")
推荐的选项是第一个(我们不应该在项目中定义不是项目要求的东西)。
CMake 会为它编译的每个文件调用 cpplint
。您可以在分号后传递额外的参数(例如 -DCMAKE_CXX_CPPLINT=cpplint;--linelength=100
)。
此方法的缺点:
- 错误计数不会累积(因为
cpplint
是分别为每个文件调用的)。 - 它不会检查头文件(与 D. Pffeifer 在他的演示文稿中所说的相反,
cpplint
不会扫描包含文件)。
注意你可以用同样的方法使用其他静态分析工具:
- 氏族整洁
"-DCMAKE_CXX_CLANG_TIDY=/usr/bin/clang-tidy-3.9;-checks=*"
- CppCheck
"-DCMAKE_CXX_CPPCHECK=/usr/bin/cppcheck;--std=c++11"
- 武汉大学
"-DCMAKE_CXX_INCLUDE_WHAT_YOU_USE=/usr/bin/iwyu;--transitive_includes_only"
- 刘宇宇
cmake -DCMAKE_LINK_WHAT_YOU_USE=TRUE
- 疯狂
其中一些需要 "compilation database" (set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
)。
我一直在为同样的问题而苦苦挣扎。
我用 CMake 3.10.2 试过了,user2449761 的评论仍然正确。使用 set(CMAKE_CXX_CPPLINT "cpplint") 仍然不检查任何 header 文件。
kgbook 的回答不再有效,因为 aux_source_directory 没有列出 header 文件。但是,您可以使用
get_target_property(src staticcodecheck SOURCES)
这将为您提供所有 non-system header。其余的可以保持不变。至于运行 cpplint 在特定时间,你可以试试
add_custom_command(TARGET ${TARGET}
PRE_BUILD
...
这将取代 add_custom_target(${TARGET_NAME}... 在他的 cpplint.cmake.
希望对您有所帮助。