我们使用CMake和普通的Unix makefile进行构建。有一些静态分析检查,例如Cppcheck,我们在项目中的每个C / C ++文件上运行,以在编译时捕获错误。
我已经为cppcheck创建了一个自定义目标,并将其附加到“所有”目标中。这将检查项目中的所有* .c和* .cpp文件。
我们希望每次更改和重新编译文件时都进行检查,并且仅对该文件进行检查。该检查应自动运行,而用户不必在CMake中添加其他命令。本质上,检查应“附加/钩住”到常规CMake命令add_library()
和add_executable()
中。在CMake中有什么方法可以做到这一点?
答案 0 :(得分:3)
虽然add_executable
(和add_library
)由CMake本身提供,但是您可以定义一个具有相同名称的函数或宏,以“隐藏”原始CMake函数。在您的函数/宏内部,您可以使用带下划线前缀的名称来调用原始CMake函数:
function(add_executable target_name)
# Call the original function
_add_executable(${target_name} ${ARGN})
... perform additional steps...
endfunction(add_executable target_name)
答案 1 :(得分:1)
假设您有一个源文件列表(应该这样做)。
使用for_each循环遍历源文件。对于每个源文件,使用add_custom_command将在文件上运行cppcheck工具。在当前循环中的文件上使该custom_command DEPEND。现在,您应该对所有单独的源文件都有自定义命令,这些命令将在且仅当文件由于DEPENDS指令而发生更改时才会触发。
不是这些命令必须创建某种输出文件。我建议将cppcheck的输出传递到名为$ source $ _test的文件中。
文档:https://cmake.org/cmake/help/latest/command/add_custom_command.html
答案 2 :(得分:0)
您可以尝试从雄鹿库中获取连接功能: https://sf.net/p/tacklelib/tacklelib/HEAD/tree/trunk/cmake/tacklelib/Handlers.cmake
我不保证它将对系统功能有效,但是您可以按照以下测试示例进行尝试: https://sourceforge.net/p/tacklelib/tacklelib/HEAD/tree/trunk/cmake_tests/01_unit/01_script_mode/11_Handlers/
测试中的一些示例:
include(tacklelib/Handlers)
include(tacklelib/Props)
macro(custom_pre_handler)
tkl_test_assert_true("a STREQUAL \"111\"" "1 call context variables is not visible: a=${a}")
tkl_append_global_prop(. call_sequence -1)
endmacro()
macro(custom_macro)
tkl_test_assert_true("a STREQUAL \"111\"" "2 call context variables is not visible: a=${a}")
tkl_append_global_prop(. call_sequence 0)
endmacro()
tkl_enable_handlers(PRE_POST function custom_macro)
tkl_add_last_handler(PRE custom_macro custom_pre_handler)
set(a 111)
custom_macro()
tkl_get_global_prop(call_sequence call_sequence 0)
tkl_test_assert_true("call_sequence STREQUAL \"-1;0\"" "call sequence is invalid: call_sequence=${call_sequence}")
return()
tkl_test_assert_true(0 "unreachable code")