Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
清除CMake中的错误_Cmake - Fatal编程技术网

清除CMake中的错误

清除CMake中的错误,cmake,Cmake,我正在使用CMake构建我的应用程序并启动它的测试 我的一个测试必须获取一些资源(比如,它创建了一个文件),因此它需要在完成后释放资源。 我的问题是,当测试失败时,资源不会被释放 我的cmake命令基本上如下所示: add_custom_target(acquire_test_release COMMAND acquire_resource COMMAND perform_test.py COMMAND cleanup_resource ) 无论何时perform_te

我正在使用CMake构建我的应用程序并启动它的测试

我的一个测试必须获取一些资源(比如,它创建了一个文件),因此它需要在完成后释放资源。 我的问题是,当测试失败时,资源不会被释放

我的cmake命令基本上如下所示:

add_custom_target(acquire_test_release
    COMMAND acquire_resource
    COMMAND perform_test.py
    COMMAND cleanup_resource
)
无论何时
perform_test.py
返回非零,都不会调用
cleanup_资源

我的问题如下: 即使测试失败,如何执行清理操作,同时保留测试中的失败条件和错误代码(目标仍应失败)


我尝试将我的测试放在
|
(例如,
命令perform_test.py | | true
)中,但随后我丢失了返回代码和失败条件,同时模糊了目标。

在您的具体案例中,作为一种快速解决方法,您可以使用

COMMAND perform_test.py || ( cleanup_resource && false )
在这种情况下,您将丢失
perform_test.py
返回的预大小代码(只保留零/非零除法)

但是编写一个脚本(shell/python/whatever)更好,它实现了运行场景的正确测试。然后,您可以将给定脚本与单个命令选项一起使用


当关注构建操作时(与配置操作相反),CMake不适合一般脚本编写。CMake提供的最多选项是执行一系列
命令
选项,直到失败

请记住:CMake本身不执行构建,此功能可用于其他构建工具。即使在Makefile的接收中,也很难实现条件逻辑,但CMake倾向于支持多种构建工具


但是,CMake脚本模式(
CMake-p
)相对丰富。如果您希望跨平台测试运行场景不需要python等附加先决条件,您可以轻松地在CMake上编写脚本。

在具体情况下,您可以使用
命令perform_test.py|(cleanup_resource&&false)
。但是最好创建一个脚本(shell/python/which),它实现正在运行的测试,并使用命令选项调用该脚本。CMake不适合使用返回代码和条件的常规脚本。谢谢。您的解决方案会起作用,尽管我会丢失
perform_test.py
的精确返回代码?那么,执行所有三个操作(获取、测试、发布)并返回测试操作返回代码的脚本似乎是强制性的?我觉得很遗憾,CMake不能更好地控制目标的完成……你可以删除测试的输出文件夹。这将触发重新配置和重建,但可能已经足够好了。@usr1234567请澄清,删除测试的输出文件夹不是我的具体情况,只是几种情况中的一个示例。我对使用CMake解决故障清理问题的通用解决方案感兴趣。Tsyvarev建议CMake不能在本地完成这项工作,使用脚本是可以接受的答案。