【问题标题】:CMake do something when command failsCMake 在命令失败时执行某些操作
【发布时间】:2021-01-15 03:24:49
【问题描述】:

我使用 CMake。自定义构建步骤会在失败时保存错误输出。

FIND_PROGRAM (BASH bash HINTS /bin)

SET (BASH_CMD "my-script input.file >output.file 2>error.file")

ADD_CUSTOM_COMMAND (
   OUTPUT output.file
   COMMAND ${CMAKE_COMMAND} -E env ${BASH} -c "${BASH_CMD}"
   ...)

这行得通。如果my-script 对给定的input.file 失败,则stderr 将保存在error.file 中,但是当我运行make 并且目标无法构建时,正常输出不会使error.file 的位置明显。 (这个文件的实际路径是比较纠结的生成的。)

我不希望在make 期间在终端中显示嘈杂的标准错误。我想做类似的事情

MESSAGE ("input.file failed, see error.file")

(最好是红色或其他颜色)在output.file 的命令失败时执行。

我可以在 CMakeLists.txt 食谱中表达这种行为吗?

【问题讨论】:

  • 在命令末尾添加|| (echo "..." && /bin/false) 有什么问题?例如。 my-script input.file >output.file 2>error.file || (echo "input.file failed, see error.file" && /bin/false)。或者,您可以创建一个独立的包装脚本,它将原始脚本的输出重定向到一个文件中,并在原始脚本失败时打印一条消息。

标签: cmake


【解决方案1】:

不确定突出显示,但您可以创建一个通过execute_process 执行命令的 cmake 脚本文件,检查它的错误代码并打印自定义消息以防出现问题。以下示例在 windows 上运行,而不是在 linux 上运行,但这应该足以进行演示。

一些失败的命令:script.bat

echo "some long message" 1>&2
exit 1

CMake 脚本:execute_script_bat.cmake

execute_process(COMMAND script.bat RESULT_VARIBALE _EXIT_CODE ERROR_FILE error.log)

if (NOT _EXIT_CODE EQUAL 0)
    message(FATAL_ERROR "command failed; output see ${CMAKE_SOURCE_DIR}/error.log")
endif()

CMakeLists.txt

add_custom_command(
   OUTPUT output.file
   COMMAND "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_SOURCE_DIR}/execute_script_bat.cmake")

可以通过在"${CMAKE_COMMAND}" 之后添加-D "SOME_VARIABLE=some value" 参数来传递其他信息

【讨论】:

    猜你喜欢
    • 2018-11-05
    • 1970-01-01
    • 1970-01-01
    • 2013-12-28
    • 2013-05-01
    • 1970-01-01
    • 2017-02-22
    相关资源
    最近更新 更多