据我了解,当您通过命令行使用cmake(例如-DMy_Var = ON)提供变量时,该变量存储在缓存中。当在将来运行CMake脚本时访问该变量时,它将始终获取存储在缓存中的值,忽略命令行上的任何后续-DMy_Var = OFF参数。
据我所知,您可以使用“FORCE”或删除缓存文件强制缓存CMakeLists.txt文件中的缓存变量,但是我想知道-DMy_Var = XXX是否有好的方法每次指定时都有效吗?
我怀疑答案不是在单个构建中更改这些变量,而是为不同的配置分别构建子目录。有人可以澄清吗?
答案 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
我希望这会有所帮助。