2015-05-10 41 views
18

Đôi khi rất tốt để kiểm tra xem những điều nhất định thất bại trong việc xây dựng, ví dụ .:Dự kiến ​​kiểm tra xây dựng thất bại trong 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(); 

Có thể kết hợp các loại vật vào CMake/CTest? Tôi đang tìm một cái gì đó như thế này trong 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) 

(. Tất nhiên, các chỉ thị CMake cụ thể không tồn tại, với tất cả sự hiểu biết của tôi)

Trả lời

21

Bạn có thể làm điều này nhiều hay ít như bạn đã mô tả. Bạn có thể thêm một mục tiêu sẽ không biên dịch, sau đó thêm một thử nghiệm gọi cmake --build để cố gắng xây dựng mục tiêu. Tất cả những gì còn lại là đặt thuộc tính thử nghiệm WILL_FAIL thành true.

Vì vậy, nói rằng bạn có các bài kiểm tra của bạn trong một file có tên "will_fail.cpp", trong đó có:

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

Sau đó, bạn có thể có một cái gì đó như sau trong CMakeLists.txt của bạn:

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) 

Bạn rõ ràng có thể bọc tất cả điều này vào một hàm hoặc macro nếu bạn có nhiều thứ để viết.

+0

Tuyệt vời! Điều này hoạt động hoàn hảo. Cảm ơn nhiều! –

+0

Tôi có thể hỏi làm thế nào bạn biết tất cả những thứ này? Tôi thích cmake, nhưng trái ngược với các hệ thống xây dựng khác, tôi chưa bao giờ tìm thấy một hướng dẫn trực tuyến toàn diện cho nó. –

+0

Chủ yếu làm việc với CMake trong một codebase cỡ trung bình, theo Danh sách gửi thư, và trả lời các câu hỏi StackOverflow :) Các tài liệu khá tốt và đang được cải thiện, mặc dù tài liệu của CTEST nằm phía sau CMake theo ý kiến ​​của tôi. – Fraser

Các vấn đề liên quan