cmake设置INTERNAL是否应用FORCE?

1bqhqjot  于 2023-03-08  发布在  其他
关注(0)|答案(2)|浏览(263)

来自CMake set()命令的文档:
如果为INTERNAL,该高速缓存变量被标记为内部变量,并且不会在cmake-gui等工具中向用户显示。这适用于应保留在缓存中但用户通常不应更改的值。INTERNAL表示FORCE。
通过“INTERNAL implied FORCE",这是否意味着应用了FORCE,或者是否意味着使用INTERNAL也应该应用FORCE
以下是否等价?

set(foo "value" CACHE INTERNAL "description" FORCE)
set(foo "value" CACHE INTERNAL "description")
bq3bfh9z

bq3bfh9z1#

cmake设置INTERNAL是否应用FORCE?
大多数情况下是的。
如果缓存变量是通过命令行指定的,没有类型(当然-这是一个奇怪的边缘情况-我们不得不问为什么用户会考虑通过命令行设置一些应该是内部的东西),那么在生成的buildsystem的 * 初始配置 * 期间,FORCE当前不会隐式应用于INTERNAL
从刚刚尝试:

cmake_minimum_required(VERSION 3.25)
project(hello)

# uncomment for first test
# set(foo OFF CACHE BOOL "set to OFF")
# set(bar OFF CACHE BOOL "set to OFF")

set(foo ON CACHE INTERNAL "set to OFF on commandline")
set(bar ON CACHE INTERNAL "set to OFF on commandline" FORCE)

message("foo: $CACHE{foo}")
message("bar: $CACHE{bar}")

如果通过set()预先设置缓存条目:

$ cmake -S . -B build --fresh
<...>
foo: ON
bar: ON
<...>

如果通过命令行使用指定的类型预先设置缓存条目:

$ cmake -S . -B build --fresh -Dfoo:BOOL=OFF -Dbar:BOOL=OFF
<...>
foo: ON
bar: ON
<...>

如果通过命令行预先设置未指定类型的缓存条目:

$ cmake -S . -B build --fresh -Dfoo=OFF -Dbar=OFF
<...>
foo: OFF
bar: ON
<...>

如果我没看错的话,这个小问题在CMake的Kitware问题跟踪器上已经提到了:set: CACHE INTERNAL type initialization drops value (#22734)。请参见Brad King(维护者之一)的回复:
问题出在这里的代码中,该代码用于初始化没有定义的缓存条目的类型。它考虑了FORCE,这意味着旧值将不会保留,但没有考虑类型INTERNAL,这意味着隐式"强制"。此修补程序修复了它:

diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx
index 23b97ed789..db7d048e01 100644
--- a/Source/cmMakefile.cxx
+++ b/Source/cmMakefile.cxx
@@ -1911,7 +1911,7 @@ void cmMakefile::AddCacheDefinition(const std::string& name, const char* value,
        cmStateEnums::UNINITIALIZED)) {
     // if this is not a force, then use the value from the cache
     // if it is a force, then use the value being passed in
-    if (!force) {
+    if (!force && type != cmStateEnums::INTERNAL) {
       value = existingValue->c_str();
     }
     if (type == cmStateEnums::PATH || type == cmStateEnums::FILEPATH) {

需要进一步调查以确定该更改的其他可能影响以及是否需要policy。这可能不常被注意到,因为INTERNAL类型通常不打算公开设置。作为一种解决方法,可以在命令行上显式传递类型:-Dvar:INTERNAL=value。这将跳过有问题的代码路径。

5anewei6

5anewei62#

cmake设置INTERNAL是否应用FORCE?
是的。
"内部"意味着"力",这是否意味着施加了"力",
是的。
以下是否等价?
是的。

相关问题