Properties CMake缓存变量与全局属性:使用变量值的简单语法

Properties CMake缓存变量与全局属性:使用变量值的简单语法,properties,cmake,global-variables,Properties,Cmake,Global Variables,要使整个CMake环境在子目录中都可以使用值,可以使用set(variable\u NAME Value cache INTERNAL”“)语法设置缓存变量,或者使用set\u属性(global property variable\u NAME Value)语法设置全局属性(另请参见关于CMake中的变量) 使用后者的优点是不会“污染”CMake缓存,因为它不是为之设计的,并且在不使用FORCE参数时,也不会依赖于删除的缓存 但是,使用变量值的语法并不友好,因为您必须使用get_属性来检索值,而

要使整个CMake环境在子目录中都可以使用值,可以使用
set(variable\u NAME Value cache INTERNAL”“)
语法设置缓存变量,或者使用
set\u属性(global property variable\u NAME Value)
语法设置全局属性(另请参见关于CMake中的变量)

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

但是,使用变量值的语法并不友好,因为您必须使用
get_属性
来检索值,而不是简单地使用
${…}
表示法


有没有更简单的语法来代替
get\u属性(某种语法糖)?

让我们总结一下评论

对于我的实际问题:没有特定的快捷方式来使用
get\u属性

有用的意见:

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

“污染”CMake缓存,因为它不是为之设计的
-CMake缓存是为内部缓存变量(以及其他缓存)设计的<代码>不依赖于不使用FORCE参数时删除的缓存
-
内部
意味着
强制
。因此,使用
缓存内部
变量作为全局变量完全可以,这是推荐的方法。@Tsyvarev感谢
内部
缓存变量类型提示。不清楚,我已经相应地更新了。我更喜欢
全局属性的主要原因是它使测试更容易(第一次和所有连续运行之间没有区别)。@Roland Sarrazin您能举一个例子,说明您需要检索全局属性的值吗?无法直接访问变量等属性,但有一些快捷方式可以简化操作,如
设置_属性(全局附加属性…
语法,用于附加到列表属性(而不是获取、附加和设置列表属性).@RolandSarrazin能否请您更具体地说明您在其他子目录中需要什么样的路径?您使用的是什么CMake版本?这些属性——不仅是
全局的
属性——非常强大(参见示例)。假设我们讨论的是include目录:
set_属性(目录“${CMAKE_SOURCE_DIR}”APPEND属性包括_目录“${CMAKE_CURRENT_SOURCE_DIR}”)
要附加到主作用域,
set_属性(目标Lib1 APPEND属性包括_目录“${CMAKE_CURRENT_SOURCE_DIR}”)
APPEND到目标,如果您通过显式清除所有内部缓存变量(
set(VAR“cache internal”
)来启动
CMakeLists.txt
,则可以使用重复运行之间应该没有区别。如果不能清除内部变量怎么办?我认为每次新调用cmake时,它本身应该清除所有内部缓存变量。但是它没有。请参见我的(自己的)答案是几年前的,所以当时我不完全确定我对第二个要点的意思。可能我的意思是,应该在一开始就设置内部缓存变量,以确保在第一次运行时设置之前不会使用它。