2

CMakeにエスケープ文字を追加せずに、cmakeでadd_testを使用して${CTEST_CONFIGURATION_TYPE}を渡す方法がわからないようです。

私は現在、cmakeを使用してVSプロジェクトファイルを生成し、RUNTIME_OUTPUT_DIRECTORYを設定しています。これらは他のビルドされた実行可能ファイルに依存するため、いくつかのテストの作業ディレクトリとしてこのディレクトリ+構成を使用する必要があります。

使ってみました

add_test(NAME test 
     WORKING_DIRECTORY "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/\${CTEST_CONFIGURATION_TYPE}"
     COMMAND test ${TEST_ARGS})

これにより、テスト実行可能ファイルが正しく検出されますが、生成されるCTestTestfile.cmakeファイルには次のものが含まれています。

WORKING_DIRECTORY "<CORRECT_RUNTIME_PATH>/\${CTEST_CONFIGURATION_TYPE}"

とにかくこれを機能させることができますか、それともコマンドラインを介して毎回正しいディレクトリをテストに渡す必要がありますか?

4

2 に答える 2

2

これは現在、一般的なケースでは不可能です。CMake の次のバージョンでは、このコミットの機能を使用して、テスト プロパティでジェネレータ式を使用できるようになるはずです。

于 2013-09-18T18:47:41.683 に答える
1

アップデート:

@mathstuf が彼自身の回答で指摘したように、バージョン 2.8.12 の時点で、CMake は のWORKING_DIRECTORY引数内でジェネレータ式をサポートしていますadd_test。これにより、残りの回答は CMake v2.8.11 以下にのみ適用されます。


私の知る限り、「$」をADD_TESTエスケープせずに渡すことは実際には不可能CTestTestfile.cmakeです。

実際、この状況を処理する "CMake" の方法は、おそらく、依存する exe をコマンド ライン パラメーターとしてテスト exe に渡すことです。これには、テスト コードの変更が含まれます。依存する実行可能ファイルがすべて CMake ターゲットである場合、" "ADD_TESTを使用してコマンドで参照できます。ここで、 は CMake ターゲットの名前です。$<TARGET_FILE:tgt>tgt

ただし、これを回避するために使用できる大きくて汚いハックがあります。ADD_TESTコマンドを次のように置き換えます。

ADD_TEST(NAME test WORKING_DIRECTORY "@WORKING_DIR@" COMMAND test ${TEST_ARGS})
FILE(WRITE ${CMAKE_BINARY_DIR}/CTestCustom.cmake
     "SET(WORKING_DIR \"${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/\\\${CTEST_CONFIGURATION_TYPE}\")\n")
FILE(APPEND ${CMAKE_BINARY_DIR}/CTestCustom.cmake
     "CONFIGURE_FILE(${CMAKE_BINARY_DIR}/CTestTestfile.cmake ${CMAKE_BINARY_DIR}/CTestTestfile.cmake @ONLY)\n")

これはCTestCustom.cmakeCTestTestfile.cmake. CMakeを実行した後、次CTestTestfile.cmakeの行があります

SET_TESTS_PROPERTIES(test PROPERTIES  WORKING_DIRECTORY "@WORKING_DIR@")

CTest を実行して を呼び出すCTestCustom.cmakeと、"@WORKING_DIR@"が正しい値に置き換えられます。

それは本当にハックです。自動生成された CMake ファイルをいじるのは面倒ですが、テストをリファクタリングする時間が得られるまで、または CMake が構成ごとのサポートをより適切にサポートできるようになるまで、問題が発生する可能性がありますWORKING_DIRECTORY

于 2012-02-28T00:46:47.873 に答える