在CMake add_custom_command中捕获返回值?

问题描述:

我该如何获取由add_custom_command调用的命令的返回值?在CMake 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_processadd_custom_command本身:

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

我想这add_custom_command并不指望宏或内置功能通过。但是,如何从add_custom_command的命令中获取返回值?或者,更具体地说,我怎么能发现add_custom_command中的命令失败?

由add_custom_command运行的命令不会运行,直到编译时间,所以你不能“捕捉”他们在CMake的配置/生成步骤中失败。

如果自定义命令失败,那么任何依赖于该自定义命令的输出的内容都将被避免,因为在此之后停止,或者如果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() 
+0

总是用'configure_file' :-) – Fraser 2013-03-10 14:56:50

+0

如果它有用,使用它... - ) – DLRdave 2013-03-10 15:11:32

+0

看起来不错!我明天要测试它。 – 2013-03-10 21:01:18