2017-07-03 150 views
2

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 

所以属性只能为r从它所在的目录中检索,而不是子目录。当使用set_directory_properties/get_directory_properties来处理属性时也是如此。

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

+2

如果我看的CMake的源代码这取决于一个''cmPropertyDefinition'的chained'部件是'真'。所以我没有检查你是否可以从外部设置它,但你有没有尝试调用'define_property(DIRECTORY PROPERTY narf INHERITED BRIEF_DOCS“”FULL_DOCS“”))?可能是'INHERITED'关键字可以做到这一点(即使“INHERITED”文档说它用于其他事情)。 – Florian

+0

@弗洛伊恩哇,你是对的!我从来没有猜到过。 INHERITED文档仅涉及链接范围类型,而不是相同类型的父范围。你应该做出这个答案,这很重要。 – utopia

回答

2

谈到我的意见为答案

如果我看的CMake的源代码这个要看的cmPropertyDefinitionchained部件上是真实的。

所以,你可以用define_property()使用INHERITED关键字做到这一点你自己的目录属性:

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

即使INHERITED documentation说,只有:

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