CMake使用命令行覆盖缓存变量

时间:2014-01-06 08:47:59

标签: caching cmake

据我了解,当您通过命令行使用cmake(例如-DMy_Var = ON)提供变量时,该变量存储在缓存中。当在将来运行CMake脚本时访问该变量时,它将始终获取存储在缓存中的值,忽略命令行上的任何后续-DMy_Var = OFF参数。

据我所知,您可以使用“FORCE”或删除缓存文件强制缓存CMakeLists.txt文件中的缓存变量,但是我想知道-DMy_Var = XXX是否有好的方法每次指定时都有效吗?

我怀疑答案不是在单个构建中更改这些变量,而是为不同的配置分别构建子目录。有人可以澄清吗?

3 个答案:

答案 0 :(得分:2)

我发现了两种更改CMake变量的方法。

在上一个答案中建议第一个:

rebase

第二种方法(我更喜欢)是使用CMake内部变量。在这种情况下,您的变量仍将保留在CMake缓存中,但是如果用cmake -U My_Var -D Mu_Var=new_value 指定变量,则每次调用cmake时它们都会被更改。缺点是这些变量不会从GUI或用户的缓存变量列表中获得。我对内部变量使用以下方法:

-D My_Var=...

它允许我从命令行设置if (NOT DEFINED BUILD_NUMBER) set(BUILD_NUMBER "unknown") endif() (在CI服务器上特别有用):

BUILD_NUMBER

使用这种方法,如果您不指定cmake -D BUILD_NUMBER=4242 <source_dir> (但在先前的调用中已指定),它将使用缓存的值。

答案 1 :(得分:0)

通过巧合找到此帖子。

似乎OP所描述的行为不适用于CMake 3.12及更高版本。对于以前的版本,我没有进行一些测试,所以无法确认。

-D在命令行上提供的变量存储在CMakeCache.txt中。它们可以被覆盖,即使重复提供相同的变量,并且最后一个设置为该变量的值。

例如,一个非常简单的CMake脚本

message(STATUS "FOO = " ${FOO})
$ cmake -DFOO=123 -DFOO=321 .. # the last one takes effect
-- FOO = 321
-- Configuring done
-- Generating done
-- Build files have been written to: xxx
$ cmake .. # cache is remembered
-- FOO = 321
-- Configuring done
-- Generating done
-- Build files have been written to: xxx
$ cmake -DFOO=changed .. # override it
-- FOO = changed
-- Configuring done
-- Generating done
-- Build files have been written to: xxx

答案 2 :(得分:-2)

您可以使用

CMake -UMy_Var -DMy_Var=new_value

请参阅文档https://cmake.org/cmake/help/v3.9/manual/cmake.1.html

我希望这会有所帮助。