2017-07-03 4 views
2

Die CMake manual for set_directory_properties Ansprüche:Directory-Eigenschaften und Unterverzeichnisse

eine Eigenschaft für das aktuelle Verzeichnis und das Unter ein.

Dies deutet darauf hin, dass Eigenschaften in einem übergeordneten Verzeichnis auch auf alle Unterverzeichnisse vererbt werden sollten. Aber das scheint nicht der Fall zu sein. Bedenken Sie:

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}) 

Diese Drucke:

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

So ist die Eigenschaft nur r sein kann Aus dem Verzeichnis, in dem es festgelegt wurde, nicht die Unterverzeichnisse. Das gleiche gilt, wenn Sie die Eigenschaften set_directory_properties/get_directory_properties verwenden.

Habe ich den entsprechenden Abschnitt im Handbuch set_directory_properties falsch interpretiert? Oder ist es einfach veraltet/falsch?

+2

Wenn ich mir den Source-Code von CMake anschaue, dann hängt das von einem 'verketteten' Mitglied von 'cmPropertyDefinition' ab, dass es 'wahr' ist. Also ich habe nicht überprüft, ob Sie dies von außen einstellen können, aber haben Sie versucht, 'define_property (VERZEICHNIS-EIGENTUM narf INHERITED BRIEF_DOCS" "FULL_DOCS" ")' 'aufzurufen? Wahrscheinlich macht das Schlüsselwort "INHERITED" den Trick (auch wenn die "INHERITED" -Dokumentation besagt, dass es für etwas anderes verwendet wird). – Florian

+0

@Florian wow, du hast Recht! Das hätte ich nie vermutet. Die INHERITED-Dokumentation bezieht sich nur auf Verkettung von Bereichstypen, nicht auf übergeordnete Bereiche desselben Typs. Sie sollten dies eine Antwort geben, es ist wichtig. – utopia

Antwort

2

Drehen meines Kommentars in einer Antwort

Wenn ich CMake Quellcode sehen dies auf die um wahr zu sein chained Mitglied cmPropertyDefinition abhängt.

So können Sie dies für Ihre eigene Verzeichniseigenschaft erreichen, indem die INHERITED Schlüsselwort mit define_property() mit:

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

Auch wenn die INHERITED documentation sagt nur:

Wenn die INHERITED Option dann die get_property() Befehl wird bis zum nächst höheren Bereich verkettet, wenn die angeforderte Eigenschaft nicht in dem für den Befehl angegebenen Bereich festgelegt ist. DIRECTORY Scope-Ketten zu GLOBAL. TARGET, SOURCE und TEST Kette zu DIRECTORY.

Verwandte Themen