如何“钩”入Cmake命令add_executable或add_library以运行其他内容?

时间:2019-04-17 07:43:04

标签: cmake

我们使用CMake和普通的Unix makefile进行构建。有一些静态分析检查,例如Cppcheck,我们在项目中的每个C / C ++文件上运行,以在编译时捕获错误。

我已经为cppcheck创建了一个自定义目标,并将其附加到“所有”目标中。这将检查项目中的所有* .c和* .cpp文件。

我们希望每次更改和重新编译文件时都进行检查,并且仅对该文件进行检查。该检查应自动运行,而用户不必在CMake中添加其他命令。本质上,检查应“附加/钩住”到常规CMake命令add_library()add_executable()中。在CMake中有什么方法可以做到这一点?

3 个答案:

答案 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")