目录属性和子目录

Com*_*sMS 5 cmake

CMake的手册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})
Run Code Online (Sandbox Code Playgroud)

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})
Run Code Online (Sandbox Code Playgroud)

打印:

Property for a read from a: 
Property for root directory root read from a: zort
Property read from root: zort
Run Code Online (Sandbox Code Playgroud)

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

我是否误解了set_directory_properties手册的相应部分?还是仅仅是过时/错误?

Flo*_*ian 4

将我的评论变成答案

如果我查看 CMake 的源代码,这取决于chained的成员cmPropertyDefinition是否正确。

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

define_property(
    DIRECTORY 
    PROPERTY narf 
    INHERITED 
    BRIEF_DOCS "Brief Doc" 
    FULL_DOCS "Full Doc"
)
Run Code Online (Sandbox Code Playgroud)

即使INHERITED文档只说:

如果该INHERITED选项,则get_property()当请求的属性未在给定命令的范围内设置时,该命令将链接到下一个更高的范围。DIRECTORY范围链到GLOBAL. TARGETSOURCE、 并TEST链接到DIRECTORY

  • 请参阅[此处](https://gitlab.kitware.com/cmake/cmake/merge_requests/1879) 的更改,该更改更新了文档以阐明现有行为。希望它能让事情变得更清楚一些。 (3认同)