2013-03-10 9 views
9

Jak mogę pobrać zwracaną wartość polecenia wywołanego przez add_custom_command?catch wartość zwracana w CMake add_custom_command?

Myślałem, że mogę zrobić coś takiego,

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

endmacro(mac) 

add_custom_command(COMMAND mac(param1)) 

ale to nie będzie działać. Dowiedziałem się, że nawet zwykły kod nie działa. Na budynku, sh narzeka:

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

lub, jeśli nie używam makro ale zadzwonić execute_process w add_custom_command się:

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

Chyba że add_custom_command nie spodziewa makr lub funkcje wbudowany w Zostać przekazane. Jak jednak uzyskać wartość zwracaną z polecenia w add_custom_command? Lub, mniej szczegółowo, jak mogę złapać, że polecenie w add_custom_command się nie powiodło?

Odpowiedz

14

Polecenia uruchamiane przez polecenie add_custom_command nie są uruchamiane do czasu kompilacji, więc nie można "złapać" ich niepowodzenia podczas konfiguracji/generowania CMake.

Jeśli polecenie niestandardowe nie powiedzie się, wówczas uniknie się niczego, co zależy od wyniku tego polecenia niestandardowego, ponieważ zatrzyma się po nim lub jeśli będzie kontynuował błędy, w końcu zwróci błąd po jego zakończeniu, i dać komunikat "nieudanej kompilacji".

Zawsze można napisać równoważny skrypt, który działa jako polecenie niestandardowe, a następnie w tym skrypcie zrobić coś po pewnych typach błędów. Jeśli używasz cmake w trybie przetwarzania skryptu -P, możesz utworzyć skrypt wieloplatformowy, który wywoła execute_process i przeanalizuje wartość zwracaną.

Na przykład:

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 
) 

A potem w 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

zawsze z 'configure_file' :-) – Fraser

+0

Jeśli jego użyteczny, użyj go ...: -) – DLRdave

+0

który wygląda dobrze! Mam zamiar przetestować to jutro. –