2013-02-27 11 views
16

Chcę, aby moje testy były uruchamiane za każdym razem, gdy mój projekt został pomyślnie zbudowany. A jeśli niektóre testy zostaną przerwane, chcę, aby moja kompilacja również została uszkodzona. Domyślnie muszę uruchomić testy ręcznie, wykonując komendę ctest. CTest może faktycznie budować projekt, ale używam IDE, który wywołuje make do budowania źródeł. I make nie uruchamia testów.Jak uruchomić ctest po zbudowaniu mojego projektu za pomocą cmake

Dodaję to polecenie do mojego głównego pliku CMakeLists.txt, ale to nie działa.

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

CMake nie zwraca żadnych błędów i wszystko jest w porządku, ale moje polecenie niestandardowe nie wywołuje. Jak mogę uruchomić coś po każdej pomyślnej kompilacji w CMake?

Aktualizacja:

Moje ostatnie rozwiązanie jest funkcja:

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) 

wywołuje add_test i pamięta cel testu w postaci listy. Każdy test w projekcie dodanym przez tę funkcję. W głównym katalogu CMakeLists.txt mam ten kod:

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} 
) 

Tworzy niestandardowy cel, który zależy od wszystkich testów jednostkowych w projekcie. Polecenie niestandardowe jest uruchamiane po zbudowaniu celu docelowego all_tests.

+1

Dzięki za odpowiedź - w makra, w 'add_test', myślę, że trzeba' $ {target_test} 'zamiast' target_test' – experquisite

Odpowiedz

12

Ta forma add_custom_command będzie wykonać tylko wtedy, gdy inny cel CUpewnij posiada zależność „tests.txt”. Zakładam, że żaden inny cel nie ma "tests.txt" jako pliku wejściowego, dlatego polecenie niestandardowe nigdy nie działa.

Myślę, że można użyć drugiego formę add_custom_command aby osiągnąć swój cel; coś takiego:

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

Dzięki za odpowiedź, to doceniam! Znalazłem podobne rozwiązanie. Tworzę własny cel, który zależy od każdej badanej jednostki w projekcie i nie używam 'add_custom_command' z moim niestandardowym cel jako parametr TARGET. Jest to istotne, ponieważ nie chcę, aby uruchomić testy zestarzeć. I ja również odkryć, że jest to niemożliwe, aby wyliczyć wszystkie cele w 'cmake' projektu więc lista celów muszą być utrzymywane ręcznie. – Lazin

Powiązane problemy