10

如何获取由调用的命令的返回值add_custom_command

我以为我可以做这样的事情,

macro(mac param1)
    execute_process(COMMAND process ${param1} RESULT_VARIABLE res_var)
    if(${res_var} ....

endmacro(mac)

add_custom_command(COMMAND mac(param1))

但这行不通。我发现即使是平原

macro(mac)
endmacro()

add_custom_command(COMMAND mac())

不起作用。在构建时,sh 抱怨:

/bin/sh: 1: Syntax error: end of file unexpected

或者,如果我不使用宏但execute_process自己调用add_custom_command

/bin/sh: 1: Syntax error: word unexpected (expecting ")")

我猜这add_custom_command不希望传递宏或内置函数。但是,如何从 in 中的命令获取返回值add_custom_command?或者,不太具体,我怎样才能发现命令add_custom_command失败?

4

1 回答 1

17

add_custom_command 运行的命令在构建时间之前不会运行,因此您无法“捕捉”它们在 CMake 的配置/生成步骤期间失败。

如果自定义命令失败,那么依赖于该自定义命令输出的任何事情都将被避免,因为 make 在那之后停止,或者如果 make 继续跟踪错误,它最终将在其结束时返回错误,并给出某种排序“构建失败”消息。

您始终可以编写一个作为自定义命令运行的等效脚本,然后在该脚本中,在某些类型的错误之后执行某些操作。如果在-P脚本处理模式下使用cmake,可以制作一个跨平台的脚本,调用execute_process并分析返回值。

例如:

configure_file(
  ${CMAKE_CURRENT_SOURCE_DIR}/script.cmake.in
  ${CMAKE_CURRENT_BINARY_DIR}/script.cmake
  COPYONLY
)
add_custom_command(COMMAND ${CMAKE_COMMAND} -P
  ${CMAKE_CURRENT_BINARY_DIR}/script.cmake
)

然后在 script.cmake.in 中:

execute_process(COMMAND process param1 RESULT_VARIABLE res_var)
if(NOT "${res_var}" STREQUAL "0")
  # do something here about the failed "process" call...
  message(FATAL_ERROR "process failed res_var='${res_var}'")
endif()
于 2013-03-10T14:48:48.850 回答