2013-03-10 193 views
9

我該如何獲取由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中的命令失敗?

回答

14

由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