2016-10-17 11 views
2

私の設定では、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が変わるたびにテストを実行しますか?それとも私は別のことをしなければならないのですかご協力ありがとうございました。

+1

あなたの 'add_custom_target'呼び出しからすべての変数の逆参照とジェネレータ式を削除しようとしましたが、**この呼び出しの**すべての引数**をハードコードしましたか?そのようなやり方は、おそらく変数の参照解除に関連する* debug *の問題があるときには一般的です。 – Tsyvarev

+1

'add_custom_target'コマンドの' COMMAND'オプションのCMakeのドキュメントには、ジェネレータ式を使用できると書かれていますが、 'WORKING DIRECTORY'オプションで*記載されていません。作業ディレクトリのパスをハードコードすると、ターゲットをビルドするとgtestが実行されます。より多くの研究/デバッグを行い、有用な情報を投稿します。ありがとうございました。 – NameRakes

+0

いいですね。実際には、CMakeのドキュメント** explicitely **は、どのオプションがジェネレータの表現を使用するかもしれないと言っています。 'add_custom_target'コマンドの' WORKING_DIRECTORY'オプションについては、そのような考え方がないので、ジェネレータ式を使用することはできません。興味深いことに、 'add_test'と同じオプションは、ジェネレータ式を使用することができます(それは明示的にドキュメントに記述されています)。 – Tsyvarev

答えて

0

コメントに多くの詳細を追加できませんでした。したがって、この回答です。

1.元の問題

への回答私はadd_custom_targetコマンドのWORKING_DIRECTORYオプションで設定依存のパスを必要とするので、しかしはそれにジェネレータ式を渡すことはできません、という考えは、を使用することですそうCMAKE_CFG_INTDIR変数:

add_custom_target (${myARGS_EXE}.tgt 
    DEPENDS ${myARGS_EXE} 
    COMMAND ${myARGS_EXE} --gtest_output=xml:${myARGS_EXE}.xml 
    WORKING_DIRECTORY ${CMAKE_INSTALL_PREFIX}/${CMAKE_CFG_INTDIR}/bin 
) 

、あなたが上記のターゲットをビルドするとき、ユニットテストをで実行されますこれはlibsとexesのインストールディレクトリであるため、完全には望ましくありません。それは、そのビルドディレクトリから

一方では、同じ時刻には、Visual Studio内からDLLパスを拾って、GTESTを格納することに...

2.ユニットテストを実行し、本当にいいだろうbuildディレクトリの.xmlファイルを生成しました。これは解決策です。

In CMakeバージョン3.10 CMAKE_MSVCIDE_RUN_PATHプロパティが追加されました。プロジェクトの幅広いCMakeLists.txt、set(CMAKE_MSVCIDE_RUN_PATH ${CMAKE_INSTALL_PREFIX}/${CMAKE_CFG_INTDIR}/bin) - solution#3のおかげでPATHを追加してインストールディレクトリを指すことができます。そして、これを上記add_custom_targetのコマンドを置き換えます。

add_custom_command (
    TARGET ${myARGS_EXE} POST_BUILD 
    COMMAND ${myARGS_EXE} --gtest_output=xml:${myARGS_EXE}.xml 
    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR} 
) 

このソリューションでは、追加のターゲットを作成するの混乱を回避することができます。明らかに、myARGS_EXEがビルドされている場合にのみ、単体テストが実行されます。明らかに他のDLLへのmyARGS_EXEの推移依存性についても取り上げます。

その他の優雅なソリューションがある場合は、投稿してください。

関連する問題