8

プロジェクトに CMake を使用し、テスト ケースに googletest を使用しています。インターネットを見回すと、googletest のソースをリポジトリのサブフォルダーにコピーし、「add_subdirectory(googletest)」で含めるのが一般的な方法のようです。私はそれをしました。

現在、CPack を使用してプロジェクトの debian パッケージを生成しています。残念ながら、CPack によって生成されたパッケージは、私のプロジェクトと一緒に googletest をインストールします。もちろん、これは私が望むものではありません。

googletest ディレクトリを見ると、そこにいくつかの INSTALL cmake コマンドが見つかりました。なぜそれが起こるのかは明らかです。問題は今です - どうすればそれを避けることができますか? 更新時に変更を再適用することを覚えておく必要があるため、googletest から CMakeLists.txt ファイルを変更するのは好きではありません。CPack でこれらのインストールを無効にする別の方法はありますか?

4

3 に答える 3

13

したがって、最初にここで提案された@Tsyvarevが言及したマクロオプションがあります:

# overwrite install() command with a dummy macro that is a nop
macro (install)
endmacro ()

# configure build system for external libraries
add_subdirectory(external)

# replace install macro by one which simply invokes the CMake
install() function with the given arguments
macro (install)
  _install(${ARGV})
endmacro(install)

${ARGV}${ARGN}は同じですが、ドキュメントでは現在 の使用が推奨されてい${ARGN}ます。また、マクロの上書き_が元のマクロ名の先頭に追加されるという事実は文書化されていませんが、それでも動作は変わりません。こちらのコードを参照してください。

ただし、上記のコードが正しく機能することはありませんでした。それは本当に奇妙なことをし、しばしばinstall()2回呼び出します。

代替手段-これも文書化されていません-を使用することEXCLUDE_FROM_ALLです:

add_subdirectory(external EXCLUDE_FROM_ALL)

いくつかのコメントによると、これinstall()がそのサブディレクトリを無効にする場所を見つけました。それが実際に行うことは、おそらくあなたが望むこともEXCLUDE_FROM_ALLするすべてのコマンドに対してデフォルトで設定されていると思います。install()私は実際にそれをテストしていませんが、一見の価値があります。

于 2017-03-27T09:45:27.667 に答える
8

更新:他の回答に記載されているように、EXCLUDE_FROM_ALLオプションは、サブディレクトリのサブプロジェクトで無効にするための最も直接的で正しい方法のようですinstall:

add_subdirectory(googletest EXCLUDE_FROM_ALL)

以前のソリューション

プロジェクトのリリース (CPack で配信したい) でテストが必要ない場合は、googletest条件付きでサブディレクトリを含め、パッケージ化するときに条件付きを false に設定します。

...
if(NOT DISABLE_TESTS)
    add_subdirectory(googletest)
endif()

で包装

cmake -DDISABLE_TESTS=ON <source-dir>
cpack

または、テストが必要であるが、テスト インフラストラクチャをインストールしたくない場合はinstall、同じ名前のマクロまたは関数を定義してコマンドを無効にすることができます。

# Replace install() to do-nothing macro.
macro(install)
endmacro()
# Include subproject (or any other CMake code) with "disabled" install().
add_subdirectory(googletest)
# Restore original install() behavior.
macro(install)
    _install(${ARGN})
endmacro()

このアプローチは、 CMake メーリングでも提案されています。

コメントによると、CMake コマンドを置き換える方法は非常にトリッキーであり、場合によっては機能しない可能性があります。変更されたに渡されたパラメーターがinstall正しく解析されないか、復元installが機能せず、次の s さえinstall無効になっています。

于 2016-02-11T17:20:47.503 に答える