0

私のアプリケーションは、コア、多くの共有ライブラリ、およびこれらの共有ライブラリを使用する多くのプラグインで構成されています。option()各プラグインを有効/無効にするためにcmakeコマンドを使用しています。

私がやりたいことは、有効なプラグインのいずれかで必要な場合にのみ、共有ライブラリをビルドしてインストールすることです。

共有ライブラリのディレクトリで次を使用してみました。

set_directory_properties(PROPERTIES EXCLUDE_FROM_ALL true)

ただし、ターゲットはまだ Visual Studio でビルドされています。Linux の GNU make は、それらのビルドを正しく回避します。install()ただし、必要なライブラリはどちらのシステムでもインストールされなくなりました。

私もライブラリターゲットに追加しようとしましたが、cmake はターゲットが無効になっている場合EXCLUDE_FROM_DEFAULT_BUILD falseの未定義の動作について不平を言いました。install()

4

1 に答える 1

0

次のようなものがあるようです。

OPTION( BUILD_OPTIONAL_PLUGINS "Build plugins that are not required for core install" FALSE) 
IF(${BUILD_OPTIONAL_PLUGINS}) 
    ADD_SUBDIRECTORY( Plugins/Optional) # Whatever it really is. 
ENDIF()

ここまでは順調ですね。ただし、これらのオプション フラグがすべて false の場合、誰も必要としない "libCommon" のようなライブラリを使用できるようになりました。

したがって、最も簡単な解決策は次のとおりです。ライブラリをオプションとして扱います。

結局のところ、使用するプロジェクト自体がビルドされない場合は、それをビルドする必要さえありません。したがって、同じトップレベルの CMakeLists.txt に「BUILD_COMMON」のような通常の「SET」変数を用意し、デフォルトで TRUE に設定します。次に、これを行うだけです:

SET( BUILD_COMMON 0) 
IF(${BUILD_OPTIONAL_1} OR ...) # Detect if you need to build the lib 
    SET( BUILD_COMMON 1) 
ENDIF()

IF(${BUILD_COMMON}) 
   ADD_SUBDIRECTORY( common)
ENDIF()

その後、最終的にこのビルドで「make install」を実行すると、すべてが期待どおりに機能します。オプションのプラグインをすべてオフにすると、それらによってのみ使用されていたライブラリもビルドされませんでした。ビルドには含まれていないため、必要かどうかをインストール ロジックに認識させる必要はありません。

また、ライブラリとすべてのオプションのプラグインの INSTALL() コマンドに次のような行を追加する必要があります。

INSTALL( TARGETS <plugin> .... OPTIONAL)

これは、「make install」に、バイナリが表示されない場合にターゲットをビルドまたはインストールしないように指示します。

于 2018-05-03T17:04:16.860 に答える