2017-04-21 50 views
1

我怎樣才能設置cmake變量只有當它沒有被用戶更改?設置一個cmake變量,如果它沒有被用戶更改

我有這個變量:

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

在第一次運行的變量初始化爲testdirtestdir/subdir

當用戶改變DIR和重播的cmake不改變SUBDIR,我想產生一個新的SUBDIR路徑,同時我希望保持SUBDIR路徑,當用戶改變了它。

因此SUBDIR應該設置爲基於新值DIR的新默認值,如果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_old,其中包含最後一個值SUBDIR並標記爲INTERNAL(不打算由用戶修改)。

接下來的cmake啓動,你可以比較的SUBDIRSUBDIR_old值,如果不同,那麼用戶修改SUBDIR

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緩存變量屬性,但該文件說,

不要設置或獲取。

也許一個更好的辦法是用if語句來檢查修改:

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

,或者你只是不把DIRSUBDIR,把細節入描述:

set(SUBDIR "subdir" CACHE PATH "subdirectory of main directory (see DIR)") 
相關問題