【问题标题】:CMake cache variables vs. global properties: Simple syntax to use the variable valueCMake 缓存变量与全局属性:使用变量值的简单语法
【发布时间】:2024-04-30 22:35:02
【问题描述】:

要使值可从子目录中用于整个 CMake 环境,可以使用 set(VARIABLE_NAME Value CACHE INTERNAL "") 语法设置缓存变量或使用 set_property(GLOBAL PROPERTY VARIABLE_NAME Value) 语法设置全局属性(另请参阅 this very good answer 关于 CMake 中的变量) .

使用后者的优点是您不会“污染” CMake 缓存,因为它不是为它设计的东西,并且您不依赖于在不使用 FORCE 参数时被删除的缓存。

但是使用变量值的语法对用户并不友好,因为您必须使用 get_property 而不是简单地使用 ${...} 表示法来检索值。

有没有更简单的语法来代替get_property(某种语法糖)?

【问题讨论】:

  • "polluting" the CMake cache for something it is not designed for - CMake 缓存设计用于内部缓存变量(以及其他缓存)。 not dependent on the cache being deleted when not using the FORCE parameter - INTERNAL 暗示 FORCE。因此,使用CACHE INTERNAL 变量作为全局变量是完全可以的,这是推荐的方式。
  • @Tsyvarev 感谢INTERNAL 缓存变量类型提示。 My answer 那里不清楚,我已经相应地更新了它。我更喜欢 GLOBAL 属性的主要原因是它使测试更容易(第一次和所有连续运行之间没有区别)。
  • @Roland Sarrazin 你能举个例子,你需要检索全局属性的值吗?没有像变量那样直接访问属性,但是有一些快捷方式可以让生活更轻松,例如 set_property(GLOBAL APPEND PROPERTY ...) 语法附加到列表属性(而不是获取、附加和设置它)。
  • @RolandSarrazin 您能否更具体地说明您在其他子目录中需要什么样的路径?您使用的是什么 CMake 版本?这些属性——不仅是GLOBAL ——非常强大(参见例如here)。假设我们正在讨论包含目录:set_property(DIRECTORY "${CMAKE_SOURCE_DIR}" APPEND PROPERTY INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR}") 附加到主范围,set_property(TARGET Lib1 APPEND PROPERTY INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR}") 附加到目标,...
  • @RolandSarrazin 如果您通过显式清除所有内部缓存变量 (set(VAR "" CACHE INTERNAL "") 来启动 CMakeLists.txt,那么重复运行之间应该没有区别。

标签: properties cmake global-variables


【解决方案1】:

让我们总结一下cmets。

对于我的实际问题:没有特定的快捷方式可以使用get_property

有用的 cmets:

  • 正如CACHE INTERNAL 所暗示的FORCE 一样,可以使用缓存变量使变量全局可访问。
  • 最好通过显式清理/设置内部缓存变量来启动 CMake 文件,以避免重复运行时出现不可预测的行为。

【讨论】:

  • 无法清除内部变量怎么办?我认为 cmake 本身应该在每次新调用时清除所有内部缓存变量。但事实并非如此。见*.com/questions/61024065/…
  • 我(自己的)答案已经有几年了,所以我不完全确定当时第二个要点是什么意思。可能我的意思是应该在一开始就设置内部缓存变量,以确保在第一次运行之前不使用它。
最近更新 更多