2015-05-10 15 views
18

Czasami dobrze jest sprawdzić, że pewne rzeczy nie budować, np .:Oczekiwane testy build-failure w 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(); 

Czy to możliwe, aby włączyć te rodzaje rzeczy do CMake/CTest? Szukam czegoś takiego w 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) 

(. Oczywiście, te konkretne wytyczne CWprowadä nie istnieją, do mojej najlepszej wiedzy)

Odpowiedz

21

Można to zrobić mniej więcej jak opisałeś. Możesz dodać cel, którego nie uda się skompilować, a następnie dodać test, który wywoła cmake --build, aby spróbować zbudować cel. Pozostaje tylko ustawić właściwość testową na wartość WILL_FAIL.

Tak, że masz swoje testy w pliku o nazwie „will_fail.cpp”, który zawiera:

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

to możesz mieć coś jak następuje w 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) 

Można oczywiście zawinąć to wszystko w funkcję lub makro, jeśli masz dużo do napisania.

+0

Doskonale! To działa idealnie. Wielkie dzięki! –

+0

Czy mogę zapytać, skąd znasz te wszystkie rzeczy? Lubię cmake, ale w przeciwieństwie do innych systemów kompilacji nigdy nie znalazłem obszernego samouczka online. –

+0

Głównie współpracując z CMake w średniej wielkości codebase, podążając za listą mailingową i odpowiadając na pytania StackOverflow :) Dokumenty są teraz całkiem niezłe i są ulepszane, chociaż dokumenty CTest są zdecydowanie za CMake'a w mojej opinii. – Fraser