2015-05-10 11 views
18

A volte è bene controllare che certe cose non riescono a costruire, ad es .:attesi test di accumulo di guasto a CMake

// Next line should fail to compile: can't convert const iterator to iterator. 
my_new_container_type::iterator it = my_new_container_type::const_iterator(); 

E 'possibile incorporare questi tipi di cose in CMake/CTest? Sto cercando qualcosa di simile in CMakeLists.txt:

add_build_failure_executable(
    test_iterator_conversion_build_failure 
    iterator_conversion_build_failure.cpp) 
add_build_failure_test(
    test_iterator_conversion_build_failure 
    test_iterator_conversion_build_failure) 

(. Naturalmente, non esistono queste direttive specifiche CMake, al meglio delle mie conoscenze)

risposta

21

Si può fare questo più o meno come hai descritto È possibile aggiungere un obiettivo che non riuscirà a compilare, quindi aggiungere un test che invochi cmake --build per provare a creare il target. Non resta che impostare la proprietà di prova WILL_FAIL su true.

Quindi, supponiamo di avere i test in un file chiamato "will_fail.cpp", che contiene:

#if defined TEST1 
non-compiling code for test 1 
#elif defined TEST2 
non-compiling code for test 2 
#endif 

allora si può avere qualcosa di simile a quanto segue nel CMakeLists.txt:

cmake_minimum_required(VERSION 3.0) 
project(Example) 

include(CTest) 

# Add a couple of failing-to-compile targets 
add_executable(will_fail will_fail.cpp) 
add_executable(will_fail_again will_fail.cpp) 
# Avoid building these targets normally 
set_target_properties(will_fail will_fail_again PROPERTIES 
         EXCLUDE_FROM_ALL TRUE 
         EXCLUDE_FROM_DEFAULT_BUILD TRUE) 
# Provide a PP definition to target the appropriate part of 
# "will_fail.cpp", or provide separate files per test. 
target_compile_definitions(will_fail PRIVATE TEST1) 
target_compile_definitions(will_fail_again PRIVATE TEST2) 

# Add the tests. These invoke "cmake --build ..." which is a 
# cross-platform way of building the given target. 
add_test(NAME Test1 
     COMMAND ${CMAKE_COMMAND} --build . --target will_fail --config $<CONFIGURATION> 
     WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) 
add_test(NAME Test2 
     COMMAND ${CMAKE_COMMAND} --build . --target will_fail_again --config $<CONFIGURATION> 
     WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) 
# Expect these tests to fail (i.e. cmake --build should return 
# a non-zero value) 
set_tests_properties(Test1 Test2 PROPERTIES WILL_FAIL TRUE) 

Puoi ovviamente racchiudere tutto questo in una funzione o macro se ne hai molti da scrivere.

+0

Eccellente! Questo funziona perfettamente. Grazie molto! –

+0

Posso chiederti come fai a sapere tutto questo? Mi piace cmake, ma al contrario di altri sistemi di compilazione, non ho mai trovato un tutorial online completo per questo. –

+0

Principalmente lavorando con CMake in una base di codice di medie dimensioni, seguendo la Mailing List, e rispondendo alle domande StackOverflow :) I documenti sono abbastanza buoni ora, e sono in via di miglioramento, anche se i documenti di CTest sono molto indietro rispetto a quelli di CMake. – Fraser

Problemi correlati