2017-07-03 149 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