2017-02-10 52 views
6

CMakeLists.txtの編集後にcmakeを使用しているので、いくつかの変数はロードされません。私がCACHE STRINGで定義したものを持っていれば、それを強制的に変更したり、キャッシュを削除したりせずに変更することはできません。CMakeCache.txtとはなぜ私の変数を上書きするのですか

なぜこのCMakeCache.txtファイルがあるのですか?それは必要なのでしょうか?

+1

の詳細については、我々はCMakeCache.txtを持っていなかった場合は

、私たちは覚えていると、再びすべてのオプションを入力する必要があります[変数を設定および使用するためのCMakeの構文は何ですか](https://stackoverflow.com/questions/31037882/whats-the-cmake-syntax-to-set-and-use-variables)を参照してください。 – Florian

答えて

8

はい、確かに必要です。 CMakeは、CMakeListファイルが変更されたか、またはmake rebuild_cacheのときに、ビルド中にキャッシュが再実行されているときにキャッシュを使用します。また、通常の構成実行の開始時にキャッシュをロードします。

次のようにCMakeのある使用のために標準worflow:

  1. 実行CMakeのを空のバイナリディレクトリにプロジェクト&キャッシュ
  2. CMakeのGUIで
  3. 又はccmakeまたは類似の初期バージョンを生成するためには、検査最初の実行によって設定されたキャッシュ変数を表示し、適切に修正します。
  4. CMakeを再実行してください(またはUIが提供する場合はその設定ステップのみ)。
  5. あなたが唯一の3に設定を実行していた場合は、設定
  6. に満足している繰り返して、2 & 3ステップ、実行するあなたが今、あなたの好みに応じて構成されたビルドシステムを持っている

を生成します。

上記を有効にするには、キャッシュ内のユーザー変更を、CMakeLists.txtで指定された既定のキャッシュ値よりも優先させる必要があります。それ以外の場合、ポイント2からのユーザー変更は、次回の構成時に失われ、プロジェクト指定のデフォルトによって再び上書きされます。

そのため、CMakeコマンドset(var ... CACHE)は、キャッシュ変数varが既に存在する場合は変更しません。通常、あなたのプロジェクトでは、キャッシュをユーザーが調整可能なデフォルト値を提供するものとして設定する必要があります。

あなたは本当にあなたができる、プロジェクト内のユーザーの選択肢をオーバーライドする必要がある場合:

  • が非キャッシュ変数を設定するCACHEなしsetを使うsetコマンドにFORCEを追加したり、
  • 。非キャッシュ変数は、同じ名前のキャッシュ変数よりも優先されます。
+0

最後に、[load_cache](https://cmake.org/cmp/help/v3.4/command/load_cache.html?highlight=load_cache)コマンドは、別のプロジェクトのCMakeキャッシュから値をロードします。 –

1

やる気例

これは言及が、より明示的な例を理解しやすくするためにhttps://stackoverflow.com/a/42160304/895245何基本的にあります。

git clone project 
cd project 
# Options dfined with "option(" in CMakeLists.txt. 
cmake -DOPT1=ON -DOPT2=OFF -DOPT3=ON . 
make 
# Create bugs (edit code). 
make 

その後、数日後に、新しいディレクトリがプロジェクトに追加されます。

は、このユースケースを考えてみましょう。

つまり、CMakeLists.txtが新しいadd_subdirectoryに変更されたため、cmakeを再度実行してメイクファイルを更新する必要があります。

git pull 
cmake -DOPT1=ON -DOPT2=OFF -DOPT3=ON . 
make 

をしかし、キャッシュのために、私たちは行うことができます:

cmake . 
make 
関連する問題