特定のものが構築に失敗することを確認するのが良い場合があります。例:
// 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();
これらのタイプのものをCMake/CTestに組み込むことは可能ですか? 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)
(もちろん、私の知る限り、これらの特定のCMakeディレクティブは存在しません。)
あなたが説明したように、これは多かれ少なかれ行うことができます。コンパイルに失敗するターゲットを追加してから、cmake --build
を呼び出してターゲットの構築を試みるテストを追加できます。残っているのは、テストプロパティWILL_FAIL
をtrueに設定することだけです。
したがって、次の内容を含む「will_fail.cpp」という名前のファイルにテストがあるとします。
#if defined TEST1
non-compiling code for test 1
#Elif defined TEST2
non-compiling code for test 2
#endif
次に、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)
これらをたくさん書く場合は、明らかにこれらすべてを関数またはマクロにラップすることができます。
@Fraserの答えは良いアプローチであり、特にWILL_FAIL
プロパティは良いアドバイスです。ただし、失敗したターゲットをメインプロジェクトの一部にする代わりの方法があります。問題のユースケースは、ほとんどctest --build-and-test
モードの目的です。メインビルドの失敗が予想されるターゲット部分を作成するのではなく、それを独自の個別のミニプロジェクトに配置して、テストの一部としてビルドすることができます。これがメインプロジェクトでどのように見えるかの例は、次のようになります。
add_test(NAME iter_conversion
COMMAND ${CMAKE_CTEST_COMMAND}
--build-and-test
${CMAKE_CURRENT_LIST_DIR}/test_iter
${CMAKE_CURRENT_BINARY_DIR}/test_iter
--build-generator ${CMAKE_GENERATOR}
--test-command ${CMAKE_CTEST_COMMAND}
)
set_tests_properties(iter_conversion PROPERTIES WILL_FAIL TRUE)
これには、プロジェクトのテスト結果の一部になるため、通常のテストプロセスの一部として定期的に実行される可能性が高くなるという利点があります。上記の例では、test_iter
ディレクトリは本質的にそれ自体の別個のプロジェクトです。メインビルドから情報を渡す必要がある場合は、--build-options
を追加して、CMake実行に渡すキャッシュ変数を定義することでそれを行うことができます。この領域で最近修正/明確化されたヘルプについては、 最新のドキュメント を確認してください。