我试图从命令行覆盖MY_VAR的默认值,但是我得到了意外的结果:
摘自我的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;INTERNAL;This is my_var;[FORCE]
我期待输出为:
MY_VAR = MY_VAR_USER_VALUE
奇怪的是,MY_VAR在CMakeCache.txt中正确更新,请参阅摘录:
//No help, variable specified on the command line.
MY_VAR:INTERNAL=MY_VAR_USER_VALUE
注意:我正在进行源代码构建
更新(2015年11月15日):
我删除了FORCE周围的方括号,输出为:
MY_VAR = MY_VAR_DEF_VALUE
我删除了FORCE,输出为:
MY_VAR = MY_VAR_DEF_VALUE
答案 0 :(得分:0)
它以这种方式运作:
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重写缓存,所以在第1步你有默认值,
之后cmake打印它的值,当然它是DEF_VALUE
,
之后,它使用-D
命令设置CACHE。
答案 1 :(得分:0)
从set命令中删除[FORCE]
选项,并将INTERNAL
选项替换为指示变量类型的关键字之一(BOOL
,STRING
等)。 FORCE
选项会导致CMakeLists.txt
覆盖您在命令行中指定的任何内容。指定INTERNAL
隐含FORCE
(请参阅the CMake docs)。
您看到的部分奇怪行为可能是因为您在FORCE
周围加了方括号。如果 想要使用FORCE
,则方括号不应该在那里(CMake文档中的方括号只是表示它是可选参数)。