【问题标题】:CMake set cache is taking "CACHE" as a variableCMake set cache 将“CACHE”作为变量
【发布时间】:2015-11-13 22:55:35
【问题描述】:

我正在尝试从命令行覆盖 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

【问题讨论】:

    标签: cmake


    【解决方案1】:

    它是这样工作的:

    cd path/to/build/dir && cmake -DVAR=VALUE path/to/src
    

    首先cmake从path/to/src/CMakeLists.txt运行脚本(步骤1) 之后它将VAR 设置为适当的值(步骤2)。 在 CMakeLitst.txt 你有:

    set(VAR DEF_VALUE FORCE)
    message(STATUS "VAR: ${VAR}")
    

    FORCE 告诉 cmake 重写缓存,所以在第 1 步你有默认值, 之后 cmake 打印它的值,当然它是DEF_VALUE, 之后,它使用-D 命令设置缓存。

    【讨论】:

      【解决方案2】:

      从您的 set 命令中删除 [FORCE] 选项,并将 INTERNAL 选项替换为指示变量类型的关键字之一(BOOLSTRING 等)。 FORCE 选项将导致您的 CMakeLists.txt 覆盖您在命令行上指定的任何内容。指定INTERNAL 意味着FORCE(参见the CMake docs)。

      您看到的部分奇怪行为可能是因为您在 FORCE 周围添加了方括号。如果您确实想要使用FORCE,则方括号不应该存在(CMake 文档中的方括号只是为了表明它是一个可选参数)。

      【讨论】:

      • Craig, & 是 CACHE 模式的必填字段,如果我删除 INTERNAL,我会收到以下错误: CMakeLists.txt:18 (set): set given invalid CACHE 模式的参数。
      • 我的回答可能不太清楚。我对其进行了重新措辞,以明确您需要将 change INTERNAL 更改为指定类型之一,而不是完全删除它。
      • 其他 4 种类型都不符合我的要求,我实际上使用 MY_VAR 作为预定义路径中的文件夹名称。即 /path/to/${MY_VAR}/文件夹。我希望该值在连续的 cmake 调用中保持不变,因此我认为 INTERNAL 如果它有效,将是理想的选择。
      • INTERNAL 据我所知基本上等同于 STRING。 STRING 本质上意味着它在 CMake GUI 中没有得到特殊处理,提供了一个简单的行编辑来修改它的值。
      猜你喜欢
      • 2016-07-21
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      • 2022-12-27
      • 2022-11-17
      • 2014-01-16
      • 2017-02-06
      • 2021-10-19
      相关资源
      最近更新 更多