web-dev-qa-db-ja.com

親のCMakeLists.txtからCMakeのデフォルトのオプション(...)値をオーバーライドする

アップグレードを容易にするために、ビルドシステムに最小限の変更を加えて、いくつかのサードパーティライブラリをソースツリーに含めようとしています。それらはすべて私と同じようにCMakeを使用するため、自分のCMakeLists.txtではlibfooにadd_subdirectory(extern/foo)を使用できます。

しかし、foo CMakeLists.txtは、テストハーネスをコンパイルし、ドキュメント、不要な共有ライブラリなどをビルドします。 libfooの作者は、オプション-option(FOO_BUILD_SHARED "Build libfoo shared library" ON)など-を介してこれらを制御する先見性を持っていました。これは、CMakeコマンドラインを介して設定できることを意味します。しかし、私はそれをデフォルトでオフにして、コマンドラインで上書きできるようにしたいと思います。

set(FOO_BUILD_SHARED OFF)の前にadd_subdirectory(extern/foo)を試してみました。これには、2回目以降のビルドの試行中に共有ライブラリをビルドしようとしないという効果がありますが、最初のライブラリビルド中には、本当にスピードアップする必要があるものではありません。

これは可能ですか、またはこれらのプロジェクトのフォークしたCMakeLists.txtを維持する必要がありますか?

58
user79758

変数をキャッシュに設定してみてください

SET(FOO_BUILD_SHARED OFF CACHE BOOL "Build libfoo shared library")

注:変数タイプと説明を指定して、CMakeがこのエントリをGUIに表示する方法を認識できるようにする必要があります。

71
pkit

この質問はかなり古いですが、Googleが私をここに連れてきました。

SET(<variable name> <value> CACHE BOOL "" FORCE)の問題は、オプションをプロジェクト全体に設定することです。ライブラリであるサブプロジェクトを使用し、SET(... CACHE BOOL "" FORCE)を使用してサブプロジェクト(ParentLibrary)に_BUILD_STATIC_LIBS_を設定する場合は、すべてのプロジェクトの価値。

次のプロジェクト構造を使用しています。

_|CMakeLists.txt (root)
|- dependencies
   | CMakeLists.txt (dependencies)
   |- ParentLibrary
      | CMakeLists.txt (parent)
|- lib
   | CMakeLists.txt (lib)
_

これでCMakeLists.txt (dependencies)ができました。

_# Copy the option you want to change from ParentLibrary here
option (BUILD_SHARED_LIBS "Build shared libraries" ON)
set(BUILD_SHARED_LIBS OFF)
add_subdirectory(ParentLibrary)
_

利点は、ParentLibraryを変更する必要がないことと、そのプロジェクトに対してのみオプションを設定できることです。

optionコマンドをParentLibraryから明示的にコピーする必要があります。そうしないと、CMake構成を実行するときに最初に変数の値が最初にsetコマンドによって設定され、後でキャッシュに値がないため、optionコマンドによって値が上書きされます。 CMake構成を2回目に実行するとき、optionコマンドは無視されます。これは、すでにキャッシュに値があり、setコマンドの値が使用されるためです。これは、2つのCMake実行間の構成が異なるという奇妙な動作につながります。

0
Martin Stolpe