如何";钩;在Cmake命令中添加可执行文件或添加库以运行额外的内容?

如何";钩;在Cmake命令中添加可执行文件或添加库以运行额外的内容?,cmake,Cmake,我们使用CMake和普通Unix Make文件构建。有一些静态分析检查,例如,我们在项目中的每个C/C++文件上运行,以在编译时捕获错误 我已经为cppcheck创建了一个自定义目标,并将其附加到“all”目标中。这将检查项目中的所有*.c和*.cpp文件 我们希望在每次更改和重新编译文件时运行检查,并且仅对该文件执行检查。检查应自动运行,用户无需在CMake中添加额外命令。基本上,检查应该“附加/挂接”到正常的CMake命令add\u library()和add\u executable()。

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

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


我们希望在每次更改和重新编译文件时运行检查,并且仅对该文件执行检查。检查应自动运行,用户无需在CMake中添加额外命令。基本上,检查应该“附加/挂接”到正常的CMake命令
add\u library()
add\u executable()
。在CMake中有什么方法可以做到这一点吗?

当CMake本身提供了
add_executable
(和
add_library
)时,您可以定义一个同名的函数或宏,这将“隐藏”原始的CMake函数。在函数/宏中,可以使用下划线前缀名称调用原始CMake函数:

function(add_executable target_name)
   # Call the original function
   _add_executable(${target_name} ${ARGN})
   ... perform additional steps...
endfunction(add_executable target_name)

假设您有一个源文件列表(您应该这样做)

使用for_each循环迭代源文件。对于每个源文件,使用add_custom_命令对文件运行cppcheck工具。使该自定义_命令依赖于当前循环中的文件。现在,您应该拥有用于所有单个源文件的自定义命令,该命令将在且仅当文件因DEPENDS指令而更改时触发

并不是说这些命令必须创建某种输出文件。我建议将cppcheck的输出管道化到一个名为$source$\u test的文件中


文档:

您可以从tacklelib库尝试连接功能:

我不能保证它对系统功能有效,但您可以按照测试中的示例进行尝试:

测试中的一些示例:

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

这些是内置的cmake函数。如果您想要自定义功能,通常必须编辑CMakeLists.txt。虽然这些链接很有帮助,但最好将这些源代码中的重要部分包含在回答文章中。链接可能会随着时间的推移变得陈旧,您的答案也会变得不那么有用。如果可能的话,请提供一个示例用法。@squareskittles实际上这里包含的源代码太多了。这里我只能举一个很小的例子,无论如何也不会有太多的说明。另一方面,示例可能在一段时间后发生变化,从而失去了现实性。