在 cmake 中,我怎样才能始终执行一个进程? (或从 add_custom_command 捕获标准输出)

Posted

技术标签:

【中文标题】在 cmake 中,我怎样才能始终执行一个进程? (或从 add_custom_command 捕获标准输出)【英文标题】:In cmake, how can I always execute a process? (or capture stdout from add_custom_command) 【发布时间】:2017-03-31 00:40:31 【问题描述】:

我在我的 cmake 项目中使用生成的文件。我有一个从某些输入生成源代码的脚本,如果给定不同的命令行参数,相同的脚本也可以验证输入,如下所示:

generate_code.py --generate

generate_code.py --validate

如果输入无效,--validate 模式会将错误打印到stdout,我希望这些错误可见。我当前的设置是在execute_process 中使用--validate,在add_custom_command 中使用--generate。这可行,但不会在输入更改时从--validate 模式打印用户友好的错误消息,因为execute_process 不会再次运行。

发现这些错误的最佳方法是什么?如果我可以强制execute_process 始终运行,那将起作用,或者如果我可以在--generate 失败时捕获stdout 并显示出来,我可以修改--generate 选项以打印友好的错误消息,然后显示它们.我怎样才能做到其中一项或两项?

【问题讨论】:

【参考方案1】:

只要您传递ALL 参数,每次执行构建时都会重新运行add_custom_target statements 中的命令。这可能是您正在寻找的。

或者,您可以使generate_code.py 的输入成为自定义命令的依赖项(如果它们还没有),并让自定义命令在generate_code.py --generate 之前执行generate_code.py --validate。这样,它会在需要重建时重新验证,而不是在其他任何时候。

【讨论】:

这看起来很有希望。只有在我需要重建时重新验证才会很棒。你知道我如何捕获自定义命令的stdout,以便在验证失败时显示它吗? 我认为您对 CMake-generate 时间运行的命令和 构建时间 运行的命令感到困惑。您可以捕获 execute_process 运行的命令的标准输出,因为 CMake 在您运行 CMake 脚本时会运行这些命令。您无法捕获来自add_custom_commandadd_custom_target 的输出,因为这些命令是由make 在构建时运行的。如果您确实需要捕获该输出,您可以 做的是编写一个使用execute_process 的CMake 脚本并通过使用add_custom_command 调用它来执行cmake -P 但是,我建议让generate_code.py --validate 在验证失败时返回错误退出代码并将结果打印到屏幕上。这样,make 将看到错误代码并停止构建,您将能够看到打印的错误消息。

以上是关于在 cmake 中,我怎样才能始终执行一个进程? (或从 add_custom_command 捕获标准输出)的主要内容,如果未能解决你的问题,请参考以下文章

我怎样才能等到 Qt 的 keyevents 中的每个进程完成?

我怎样才能杀死正在使用端口 8080 的任何进程,以便我可以流浪?

在wpf中使用Process.Start()启动了一个程序,要怎样才能等待这个程序执行完并输出结果后再执行后面的语句

我怎样才能始终如一地自动化,使用 TFS vNext 构建步骤,构建我们的开发团队使用 Visual Studio 工作的任何解决方案文件?

ubuntu安装最新版本cmake-转-

死锁是怎样炼成的