CMake集缓存正在使用;“缓存”;作为变量
我试图从命令行重写我的_VAR的默认值,但得到了一个意外结果: 摘自my CMakeLists.txt:CMake集缓存正在使用;“缓存”;作为变量,cmake,Cmake,我试图从命令行重写我的_VAR的默认值,但得到了一个意外结果: 摘自my CMakeLists.txt: set( MY_VAR MY_VAR_DEF_VALUE CACHE INTERNAL "This is my_var" [FORCE] ) message( "MY_VAR = ${MY_VAR}" ) cmake命令: cmake -DMY_VAR:INTERNAL=MY_VAR_USER_VALUE .. 输出: MY_VAR = MY_VAR_DEF_VALUE;CACHE;IN
set( MY_VAR MY_VAR_DEF_VALUE CACHE INTERNAL "This is my_var" [FORCE] )
message( "MY_VAR = ${MY_VAR}" )
cmake命令:
cmake -DMY_VAR:INTERNAL=MY_VAR_USER_VALUE ..
输出:
MY_VAR = MY_VAR_DEF_VALUE;CACHE;INTERNAL;This is my_var;[FORCE]
我希望输出为:
MY_VAR = MY_VAR_USER_VALUE
奇怪的是,我的变量在CMakeCache.txt中得到了正确更新,请参见摘录:
//No help, variable specified on the command line.
MY_VAR:INTERNAL=MY_VAR_USER_VALUE
注意:我正在进行源代码外构建
更新(11/15/15):
我去掉了力周围的方括号,输出为:
MY_VAR=MY_VAR_DEF_值
I移除力后,输出为:
MY_VAR=MY_VAR_DEF_值
其工作方式如下:
cd path/to/build/dir && cmake -DVAR=VALUE path/to/src
首先,从path/to/src/CMakeLists.txt
运行cmake脚本(步骤1)
之后,它将VAR
设置为适当的值(步骤2)。
在CMakeLitst.txt中,您有:
set(VAR DEF_VALUE FORCE)
message(STATUS "VAR: ${VAR}")
FORCE
告诉cmake rewrite cache,这样在步骤1中就有了默认值,
之后,cmake打印其值,当然是DEF_值
,
之后,它使用-D
命令设置缓存。它的工作方式如下:
cd path/to/build/dir && cmake -DVAR=VALUE path/to/src
首先,从path/to/src/CMakeLists.txt
运行cmake脚本(步骤1)
之后,它将VAR
设置为适当的值(步骤2)。
在CMakeLitst.txt中,您有:
set(VAR DEF_VALUE FORCE)
message(STATUS "VAR: ${VAR}")
FORCE
告诉cmake rewrite cache,这样在步骤1中就有了默认值,
之后,cmake打印其值,当然是DEF_值
,
然后,它用
-D
命令设置缓存。从set命令中删除[FORCE]
选项,并用指示变量类型的关键字之一(BOOL
,字符串
)替换内部选项。FORCE
选项将导致您的CMakeLists.txt
覆盖您在命令行上指定的任何内容。指定内部
意味着强制
(请参阅)
您看到的奇怪行为的一部分可能是因为您在FORCE
周围包含了方括号。如果您确实想使用FORCE
(CMake文档中的方括号仅用于指示它是一个可选参数),则方括号不应存在。删除[FORCE]
选项,并将内部
选项替换为指示变量类型的关键字之一(BOOL
,字符串
,等等)。FORCE
选项将导致您的CMakeLists.txt
覆盖您在命令行上指定的任何内容。指定内部
意味着强制
(请参阅)
您看到的奇怪行为的一部分可能是因为您在FORCE
周围包含了方括号。如果您确实想使用FORCE
(CMake文档中的方括号只是为了表明它是一个可选参数)。Craig,&是缓存模式的必填字段,如果删除内部,我会得到以下错误:CMakeLists.txt处的CMake error:18(set):为缓存模式设置无效参数。我的答案可能不清楚。我对其进行了重新措辞,以明确您需要将内部更改为指定类型之一,而不是将其完全删除。其他4种类型都不符合我的要求,我实际上是在预定义路径中使用我的_VAR作为文件夹名。i、 e./path/to/${MY_VAR}/文件夹。我希望该值在连续的cmake调用中保持不变,因此我认为如果它起作用,INTERNAL将是理想的选择。就我所知,INTERNAL基本上等同于STRING。字符串本质上意味着它在CMake GUI中没有得到特殊处理,只提供了一个简单的行编辑来修改它的值。Craig和&是缓存模式的必填字段,如果我删除内部字段,我会得到以下错误:CMake error at CMakeLists.txt:18(set):set给定了缓存模式的无效参数。我的答案可能不清楚。我对其进行了重新措辞,以明确您需要将内部更改为指定类型之一,而不是将其完全删除。其他4种类型都不符合我的要求,我实际上是在预定义路径中使用我的_VAR作为文件夹名。i、 e./path/to/${MY_VAR}/文件夹。我希望该值在连续的cmake调用中保持不变,因此我认为如果它起作用,INTERNAL将是理想的选择。就我所知,INTERNAL基本上等同于STRING。字符串本质上意味着它在CMake GUI中没有得到特殊处理,只提供了一个简单的行编辑来修改它的值。