【问题标题】:Directory properties and subdirectories目录属性和子目录
【发布时间】:2017-07-03 12:44:44
【问题描述】:

CMake manual for set_directory_properties 声称:

为当前目录和子目录设置一个属性。

对我来说,这表明在父目录中设置的属性也应该被继承到所有子目录。但情况似乎并非如此。考虑:

CMakeLists.txt

cmake_minimum_required(VERSION 3.0)
project(foo CXX)

set_property(DIRECTORY . PROPERTY narf "zort")

add_subdirectory(a)

get_property(res DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY narf)
message("Property read from root: " ${res})

a/CMakeLists.txt

get_property(res DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY narf)
message("Property for a read from a: " ${res})
get_property(res DIRECTORY ${CMAKE_SOURCE_DIR} PROPERTY narf)
message("Property for root directory root read from a: " ${res})

打印出来:

Property for a read from a: 
Property for root directory root read from a: zort
Property read from root: zort

因此只能从设置它的目录中检索该属性,而不是从子目录中检索该属性。使用set_directory_properties/get_directory_properties处理属性时也是如此。

我是否误解了set_directory_properties 手册中的相应部分?或者它只是过时/错误?

【问题讨论】:

  • 如果我查看 CMake 的源代码,这取决于 cmPropertyDefinitionchained 成员是 true。所以我没有检查你是否可以从外面设置这个,但你有没有试过打电话给define_property(DIRECTORY PROPERTY narf INHERITED BRIEF_DOCS "" FULL_DOCS"")?可能INHERITED 关键字可以解决问题(即使INHERITED 文档说它用于其他用途)。
  • @Florian 哇,你是对的!我从来没有猜到过。 INHERITED 文档仅涉及链接范围类型,而不是相同类型的父范围。你应该把这个作为答案,这很重要。

标签: cmake


【解决方案1】:

把我的评论变成答案

如果我查看 CMake 的源代码,这取决于 cmPropertyDefinitionchained 成员是否为真。

因此,您可以通过使用 INHERITED 关键字和 define_property() 来为自己的目录属性实现此目的:

define_property(
    DIRECTORY 
    PROPERTY narf 
    INHERITED 
    BRIEF_DOCS "Brief Doc" 
    FULL_DOCS "Full Doc"
)

即使INHERITED documentation 只说:

如果使用INHERITED 选项,则当请求的属性未设置在给定命令的范围内时,get_property() 命令将链接到下一个更高的范围。 DIRECTORY 作用域链到 GLOBALTARGETSOURCETEST 链接到 DIRECTORY

【讨论】:

  • 查看更改 here,它更新了文档以阐明现有行为。希望它能让事情变得更清晰。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-18
  • 2012-12-25
  • 2010-12-18
相关资源
最近更新 更多