只有当用户没有更改cmake变量时,我才能(重新)设置它?
我有这些变量:
set(DIR "testdir" CACHE PATH "main directory")
set(SUBDIR ${DIR}/subdir CACHE PATH "subdirectory")
首次运行时,变量初始化为testdir
和testdir/subdir
。
当用户更改DIR
并重新运行cmake而不更改SUBDIR
时,我想生成新的SUBDIR
路径,而我想保留SUBDIR
路径,当用户改变它时。
因此,如果SUBDIR
已更改且DIR
之前从未更改过DIR
,则SUBDIR
应根据String str = myBool ? "John" : "Peter";
的新值设置为新的默认值。
答案 0 :(得分:2)
除了用户可见的缓存变量SUBDIR
之外,您还可以存储另一个缓存变量,例如SUBDIR_old
,其中包含SUBDIR
的最后一个值并标记为INTERNAL(不是意图由用户修改。
下次发布cmake
您可以比较SUBDIR
和SUBDIR_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)")