【问题标题】:CMake: show all modified variablesCMake:显示所有修改的变量
【发布时间】:2018-05-07 07:59:16
【问题描述】:

我想要一个命令或选项来列出当前构建配置的所有修改的缓存变量。虽然cmake -L[AH] 很好,但它也很让人难以抗拒,并且没有显示哪些是非默认值。

似乎有一个变量属性MODIFIED 听起来与我正在寻找的完全一样 - 但文档并不是很让人放心:

内部管理属性。 请勿设置或获取。 这是由 CMake 管理的内部缓存条目属性,用于跟踪条目的交互式用户修改。 忽略它

这个问题也没有帮助:CMAKE: Print out all accessible variables in a script

【问题讨论】:

  • 您只能检查脚本本身内部发生的变化(类似于this)。
  • 我主要想检查顶级用户修改变量。例如CMAKE_BUILD_TYPE。如果默认情况下这是Release,那么当当前构建配置为Debug 时,我希望看到一条信息消息 - 而不会看到所有其他 20 个未修改的可用变量。
  • 为什么不添加 if 语句来根据变量值运行代码?您知道默认值是什么,如果变量不是默认值,则用户必须将其设置为其他值。为什么在知道默认值的情况下还需要检查它是否被修改?要么是默认的,要么是被修改的……

标签: cmake


【解决方案1】:

您可以通过多种方式更改或初始化 CMake 中的变量(命令行、环境变量、脚本文件等),您无法一一涵盖。

我刚刚想出了以下涵盖命令行开关的脚本。将以下文件放在 CMake 项目的根文件夹中,然后打印修改后的变量:

PreLoad.cmake

set(_file "${CMAKE_BINARY_DIR}/UserModifiedVars.txt")

get_directory_property(_vars CACHE_VARIABLES)
list(FIND _vars "CMAKE_BACKWARDS_COMPATIBILITY" _idx)

if (_idx EQUAL -1)
    list(REMOVE_ITEM _vars "CMAKE_COMMAND" "CMAKE_CPACK_COMMAND" "CMAKE_CTEST_COMMAND" "CMAKE_ROOT")
    file(WRITE "${_file}" "${_vars}")
else()
    file(READ "${_file}" _vars)
endif()

foreach(_var IN LISTS _vars)
    message(STATUS "User modified ${_var} = ${${_var}}")
endforeach()

这将在其他任何内容之前加载,因此可以相对轻松地识别用户修改的变量并将它们存储到文件中以供以后参考。

CMAKE_BACKWARDS_COMPATIBILITY 是 CMake 在配置运行结束时设置的缓存变量,因此在此处用于标识已配置的 CMake 项目。

参考

【讨论】:

    猜你喜欢
    • 2015-09-29
    • 2017-01-16
    • 2022-10-13
    • 2019-04-16
    • 2016-11-21
    • 2010-11-12
    • 2017-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多