2017-04-21 23 views
1

cmake変数はユーザーが変更していない場合のみ設定できますか?変数はtestdirtestdir/subdirに初期化されている最初の実行でcmake変数がユーザーによって変更されていない場合は、それを設定します

set(DIR "testdir" CACHE PATH "main directory") 
set(SUBDIR ${DIR}/subdir CACHE PATH "subdirectory") 

私はこの変数を持っています。ユーザーがSUBDIRを変更せずにDIRと再放送cmakeのを変更し

、私はSUBDIRパスを維持したい一方で、ユーザーがそれを変更する場合、新しいSUBDIRパスを生成したいと思います。

DIRが変更されたのであればSUBDIRは、DIRの新しい値に基づいて、新しいデフォルト値に設定する必要があり、SUBDIRを前に変更されませんでした。

+1

['MODIFIED'](https://cmake.org/cmake/help/latest/prop_cache/MODIFIED.html)キャッシュ変数プロパティを使用することができますが、ドキュメントには「設定しない」というメッセージが表示されます。おそらく、if文で修正をチェックする方が良いでしょうか?したがって 'SUBDIR'が' testdir/subdir'と等しくなければ 'SUBDIR'を使います。 – Florian

+0

if文の問題は、最初の設定の後に '' DIR''を変更すると、 '' SUBDIR''は変更されません(つまり、古いデフォルトにとどまります)。 – allo

答えて

2

ユーザーが見ることができるキャッシュ変数SUBDIRに加えて、最後の値がSUBDIRで、内部で(ユーザーが変更する予定のない)別のキャッシュ変数、たとえばSUBDIR_oldを保存することができます。 cmake

次の起動後、ユーザーがSUBDIRを変更した、あなたはSUBDIRSUBDIR_oldの値を比較することができる、と彼らは異なる場合:

:ユーザー が言うことができないというアプローチで

if(NOT DEFINED SUBDIR_old OR (SUBDIR EQUAL SUBDIR_old)) 
    # User haven't changed SUBDIR since previous configuration. Rewrite it. 
    set(SUBDIR <new-value> CACHE PATH "<documentation>" FORCE) 
endif() 
# Store current value in the "shadow" variable unconditionally. 
set(SUBDIR_old ${SUBDIR} CACHE INTERNAL "Copy of SUBDIR") 

問題

私はSUBDIRの値をチェックしており、が既に正しいとわかりましたです。

変更なしでは、ユーザーは変数の値を気にしないと仮定します。

+0

私はこれを解決策として考えました。これを行うよりクリーンな方法があるのだろうかと思います。そのような変数でキャッシュを混乱させる(そしておそらくいくつかの高度なビュー)は、 "cmake方法"ではないようです。 – allo

1

は答え

に私のコメントを回すあなたはMODIFIEDキャッシュ変数プロパティを使用することができますが、ドキュメントが

設定または取得しないでくださいと言います。

set(DIR "testdir" CACHE PATH "main directory") 
if (NOT DEFINED SUBDIR OR SUBDIR MATCHES "/subdir$") 
    set(SUBDIR "${DIR}/subdir" CACHE PATH "subdirectory" FORCE) 
endif() 

それとも、単にSUBDIR内部DIRを置くと説明に詳細を入れていない:

set(SUBDIR "subdir" CACHE PATH "subdirectory of main directory (see DIR)") 

たぶん、より良いアプローチは、if文で変更をチェックすることです

関連する問題