我使用
ADD_CUSTOM_TARGET
让我的 Visual Studio 解决方案在编译时运行 cppcheck
:
ADD_CUSTOM_TARGET( STATIC_CODE_ANALYSIS_QUIET ALL COMMAND cppcheck ${PATH_TO_SOURCES}/src )
(这是一个MCVE,其实我还有更多争论)
问题是,每当我构建解决方案时,即使我没有修改 src 文件夹中的任何文件,该工具也会运行。这是没有意义的,它应该只在文件被修改时运行。
所以我尝试添加一个
DEPENDS
参数:
set( STATIC_CODE_ANALYSIS_DEPENDENCIES )
list( APPEND STATIC_CODE_ANALYSIS_DEPENDENCIES "${PATH_TO_SOURCES}/src/main.cpp" )
ADD_CUSTOM_TARGET( STATIC_CODE_ANALYSIS_QUIET ALL COMMAND cppcheck ${PATH_TO_SOURCES}/src DEPENDS ${STATIC_CODE_ANALYSIS_DEPENDENCIES} )
但这没有什么区别。我看到 doc 说“目标没有输出文件,并且总是被认为是过时的”,所以这可能是有意的。看起来
add_custom_command
应该用于正确处理“最新”/“过时”目标,但是,cppcheck
没有生成任何“输出文件”,我无法创建“自定义命令”(这需要OUTPUT
参数)。
如何在构建解决方案时自动从
cppcheck
运行 Visual Studio
,但前提是自上次运行以来修改了文件?
注意:使用 cppcheck 的
--output-file
参数将其用作 OUTPUT
是不可接受的,因为这样工具的输出不会转到 Visual Studio
控制台,而用户需要使用该控制台来查看是否一切正常或不是。
正如 Tsyvarev 建议的那样,让我们在自定义命令中执行两个命令并手动创建时间戳文件。
# Static code analysis project:
ADD_CUSTOM_COMMAND(
OUTPUT cppcheck.timestamp
COMMAND cppcheck
ARGS ${PATH_TO_SOURCES}/src
COMMAND date /t > cppcheck.timestamp
COMMENT "Running static code analysis..."
VERBATIM
DEPENDS ${STATIC_CODE_ANALYSIS_DEPENDENCIES} )
# Add module:
ADD_CUSTOM_TARGET( STATIC_CODE_ANALYSIS
ALL
SOURCES cppcheck.timestamp )