如果用户未更改cmake变量,则设置该变量

时间:2017-04-21 12:10:07

标签: 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应根据String str = myBool ? "John" : "Peter"; 的新值设置为新的默认值。

2 个答案:

答案 0 :(得分: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的值,发现已经正确

如果不进行修改,我们假设用户不必担心变量的值。

答案 1 :(得分:2)

将我的评论转化为答案

您可以使用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()

或者您只是不将DIR放在SUBDIR内并将详细信息放入说明中:

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