2013-02-27 30 views
16

プロジェクトが正常にビルドされるたびにテストを開始します。いくつかのテストが壊れてしまった場合、私のビルドも壊れてしまいます。デフォルトでは、ctestコマンドを実行してテストを手動で実行する必要があります。 CTestは実際にプロジェクトをビルドできますが、私はソースを構築するためにmakeを呼び出すIDEを使用します。 makeはテストを実行しません。cmakeでプロジェクトをビルドした後でctestを実行するには

このコマンドをルートCMakeLists.txtファイルに追加しますが、動作しません。

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

CMakeのは、すべてのエラーを返さないとすべてがうまく構築しますが、私のカスタムコマンドが起動されますされません。 CMakeで成功裏にビルドするたびに、どうすればよいのですか?

更新:

私の最終的な解決策は、この関数である:

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) 

それはadd_testを呼び出し、リスト内のテスト対象を記憶しています。この関数によって追加されたプロジェクトのすべてのテスト。ルートCMakeLists.txtで、私はこのコードを持っている:

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

これは、プロジェクト内のすべてのユニットテストに依存するカスタムターゲットを作成します。カスタムコマンドは、all_testsターゲットが構築された後に実行されます。

+1

おかげ - あなたのマクロで、add_test' 'で、私はあなたが'代わりに答えを 'target_test' – experquisite

答えて

12

この形式のadd_custom_commandは、別のCMakeターゲットが "tests.txt"に依存する場合にのみ実行されます。私は他のターゲットが "tests.txt"を入力ファイルとして持っていないと仮定しているので、カスタムコマンドは決して実行されません。

add_custom_commandの2番目の形式を使用して目標を達成できると思います。何かのように:答えを

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

おかげで、このことを感謝し、' $ {target_testを}必要があると思います!私は同様の解決策を見つけた。プロジェクトのすべての単体テストに依存するカスタムターゲットを作成し、カスタムターゲットをTARGETパラメータとして 'add_custom_command'を使用するよりも、私はカスタムターゲットを作成します。私は古いテストを実行したくないので、これは必須です。また、私は、 'cmake'プロジェクトのすべてのターゲットを列挙することは不可能であることを発見し、ターゲットのリストを手動で管理する必要があります。 – Lazin

関連する問題