私の設定では、CMake 3.6、Visual Studio 2015、GitHubの最新のGoogleテストがあります。私は私のcmake関数addGtest
の1つを通して私のユニットテストを追加し、ビルドを行います。この後、RUN_TESTS
ターゲットからテストを実行するか、ctrl + F5をVSで実行し、期待どおりに動作します。CMake生成システムでビルド時にGoogleテストを実行
最後の目標は、CMake依存関係管理を使用してビルド時にユニットテストを実行することです。
function (addGtest)
# vvvv this part works as explained vvvv #
set (optBOOLS)
set (optSINGLES EXE)
set (optLISTS DLL_LIST)
cmake_parse_arguments (myARGS
"${optBOOLS}" "${optSINGLES}" "${optLISTS}" ${ARGN})
# addExecutable is a function that adds target executables
set(myARGS_DLL_LIST gtest_main gtest "${myARGS_DLL_LIST}")
addExecutable (EXE ${myARGS_EXE} DLL_LIST ${myARGS_DLL_LIST} ${myARGS_UNPARSED_ARGUMENTS})
add_test (NAME ${myARGS_EXE} COMMAND ${myARGS_EXE} WORKING_DIRECTORY
${CMAKE_INSTALL_PREFIX}/$<$<CONFIG:Release>:Release>$<$<CONFIG:Debug>:Debug>/bin
) # so it can be run using ctest
# ^^^^ this part works as explained ^^^^ #
add_custom_target (${myARGS_EXE}.tgt DEPENDS ${myARGS_EXE}
COMMAND ${myARGS_EXE} --gtest_output="xml:${myARGS_EXE}.xml"
WORKING_DIRECTORY ${CMAKE_INSTALL_PREFIX}/$<$<CONFIG:Release>:Release>$<$<CONFIG:Debug>:Debug>/bin
)
endfunction (addGtest)
時に期待されるように:今のところ、最初のステップとして、私はcustom_target
(予期せぬ問題が作動部分である場合には、全体の機能を含む)が、それを構築していないを作成するために、私の機能を強化しました私はビルドを実行し、新しいターゲット、例えばutMyTest.tgt
がVSに追加されますが、ビルドされていません。 VSで手作業でこの新しいターゲットを構築すると、テストが実行されることが期待されます。しかし、それはしていませんし、次のエラーを与える:
1> The filename, directory name, or volume label syntax is incorrect.
は私が
--gtest_output
値の周りに二重引用符を削除し、
COMMAND
オプションへのフル・パスを提供しようとしたが、無駄に。一方、コマンドラインウィンドウで作業ディレクトリに移動してexeを呼び出すと、正常に動作します!
最初の質問は、この新しいターゲットを構築してテストを実行するにはどうすればいいですか?その後、add_custom_target (${myARGS_EXE}.run)
とadd_dependencies (${myARGS_EXE}.run ${myARGS_EXE}.tgt)
に予定しています。 exeが変わるたびにテストを実行しますか?それとも私は別のことをしなければならないのですかご協力ありがとうございました。
あなたの 'add_custom_target'呼び出しからすべての変数の逆参照とジェネレータ式を削除しようとしましたが、**この呼び出しの**すべての引数**をハードコードしましたか?そのようなやり方は、おそらく変数の参照解除に関連する* debug *の問題があるときには一般的です。 – Tsyvarev
'add_custom_target'コマンドの' COMMAND'オプションのCMakeのドキュメントには、ジェネレータ式を使用できると書かれていますが、 'WORKING DIRECTORY'オプションで*記載されていません。作業ディレクトリのパスをハードコードすると、ターゲットをビルドするとgtestが実行されます。より多くの研究/デバッグを行い、有用な情報を投稿します。ありがとうございました。 – NameRakes
いいですね。実際には、CMakeのドキュメント** explicitely **は、どのオプションがジェネレータの表現を使用するかもしれないと言っています。 'add_custom_target'コマンドの' WORKING_DIRECTORY'オプションについては、そのような考え方がないので、ジェネレータ式を使用することはできません。興味深いことに、 'add_test'と同じオプションは、ジェネレータ式を使用することができます(それは明示的にドキュメントに記述されています)。 – Tsyvarev