这是发现变量值并仅在尚未缓存的情况下缓存它的正确习惯用法吗?使用路径类型只是为了举例说明。
IF(NOT $CACHE{PATH_CACHED})
#discover the PATH_CACHED value and store it in PATH_NORMAL
SET(PATH_CACHED ${PATH_NORMAL} CACHE FILEPATH "My path")
ENDIF(NOT $CACHE{PATH_CACHED})
使用if (NOT DEFINED)
,如下所示:
if (NOT DEFINED PATH_CACHED)
# do something expensive to compute PATH_CACHED as a normal
# variable
endif ()
set(PATH_CACHED "${PATH_CACHED}"
CACHE FILEPATH "My path")
这里有两个要点:
- 使用
if (NOT DEFINED X)
是比if (NOT X)
更精确的检查,因为有人可能希望将X
设置为空 - 无条件地将
PATH_CACHED
设置为计算的正常变量在一系列CMake版本中具有更一致的行为,并且当非类型化缓存变量(在命令行上设置为-DPATH_CACHED=foo
(获得PATH
或FILEPATH
类型时,还保留了相对于进程工作目录调整路径的行为。请参阅此处的文档:https://cmake.org/cmake/help/latest/manual/cmake.1.html#cmdoption-cmake-D
此外,近二十年来,不需要使用所有caps命令名或在endif()
中重复该条件。