2013-02-27 10 views
16

Voglio che i miei test vengano lanciati ogni volta che il mio progetto viene realizzato con successo. E se alcuni test sono rotti, voglio che anche la mia build venga spezzata. Per impostazione predefinita, ho bisogno di eseguire test manualmente eseguendo il comando ctest. CTest può effettivamente costruire un progetto ma io uso IDE che invoca make per creare fonti. E make non esegue test.Come eseguire ctest dopo aver creato il mio progetto con cmake

Aggiungo questo comando al file radice CMakeLists.txt ma non funziona.

add_custom_command(OUTPUT tests.txt 
        POST_BUILD 
        COMMAND ctest --output-on-failure) 

CMake non restituisce errori e tutto ciò che costruisce bene ma il mio comando personalizzato non lo fa invoca. Come posso eseguire qualcosa dopo ogni build di successo in CMake?

Aggiornamento:

La mia soluzione finale è questa funzione:

macro(add_unit_test target target_test) 
    set(UNIT_TEST_TARGETS ${UNIT_TEST_TARGETS} ${target_test} PARENT_SCOPE) 
    add_test(target ${CMAKE_CURRENT_BINARY_DIR}/target_test) 
endmacro(add_unit_test) 

Chiede add_test e ricorda bersaglio di prova in un elenco. Ogni test in un progetto aggiunto da questa funzione. Nel CMakeLists.txt radice ho questo codice:

add_custom_target(all_tests ALL 
        DEPENDS ${UNIT_TEST_TARGETS} 
) 
add_custom_command(TARGET all_tests 
        COMMENT "Run tests" 
        POST_BUILD COMMAND ctest ARGS --output-on-failure 
        WORKING_DIRECTORY ${CMAKE_BINARY_DIR} 
) 

Si crea obiettivo personalizzato che dipende da tutti i test di unità in un progetto. Il comando personalizzato viene eseguito dopo la creazione dell'obiettivo all_tests.

+1

Grazie per la risposta - nella macro, in 'add_test', penso che hai bisogno' $ {} target_test 'invece di' target_test' – experquisite

risposta

12

Questo modulo di add_custom_command verrà eseguito solo se un altro target di CMake ha una dipendenza su "tests.txt". Presumo che nessun altro target abbia "tests.txt" come un file di input, quindi il comando personalizzato non viene mai eseguito.

Penso che potresti utilizzare il secondo modulo di add_custom_command per raggiungere il tuo obiettivo; qualcosa di simile:

add_custom_command(TARGET MainTest 
        POST_BUILD 
        COMMAND ctest -C $<CONFIGURATION> --output-on-failure) 
+0

Grazie per la risposta, apprezzare questo! Ho trovato una soluzione simile. Creo un target personalizzato che dipende da ogni unit test nel progetto e che utilizzo 'add_custom_command' con il mio target personalizzato come parametro TARGET. Questo è essenziale perché non voglio eseguire test obsoleti. E scopro anche che è impossibile enumerare tutti gli obiettivi nel progetto 'cmake' quindi la lista degli obiettivi deve essere mantenuta manualmente. – Lazin

Problemi correlati