【发布时间】: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