如何";钩;在Cmake命令中添加可执行文件或添加库以运行额外的内容?
我们使用CMake和普通Unix Make文件构建。有一些静态分析检查,例如,我们在项目中的每个C/C++文件上运行,以在编译时捕获错误 我已经为cppcheck创建了一个自定义目标,并将其附加到“all”目标中。这将检查项目中的所有*.c和*.cpp文件如何";钩;在Cmake命令中添加可执行文件或添加库以运行额外的内容?,cmake,Cmake,我们使用CMake和普通Unix Make文件构建。有一些静态分析检查,例如,我们在项目中的每个C/C++文件上运行,以在编译时捕获错误 我已经为cppcheck创建了一个自定义目标,并将其附加到“all”目标中。这将检查项目中的所有*.c和*.cpp文件 我们希望在每次更改和重新编译文件时运行检查,并且仅对该文件执行检查。检查应自动运行,用户无需在CMake中添加额外命令。基本上,检查应该“附加/挂接”到正常的CMake命令add\u library()和add\u executable()。
我们希望在每次更改和重新编译文件时运行检查,并且仅对该文件执行检查。检查应自动运行,用户无需在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实际上这里包含的源代码太多了。这里我只能举一个很小的例子,无论如何也不会有太多的说明。另一方面,示例可能在一段时间后发生变化,从而失去了现实性。