From cbca65826c2bf49ba8c99efe8fa315d2942c4836 Mon Sep 17 00:00:00 2001 From: Brad King Date: Mon, 19 Sep 2016 13:33:56 -0400 Subject: [PATCH] Add directory property to list buildsystem targets Add a BUILDSYSTEM_TARGETS property to allow project code to traverse the list of its own targets in a given directory. --- Help/manual/cmake-properties.7.rst | 1 + Help/prop_dir/BUILDSYSTEM_TARGETS.rst | 11 +++++++++++ .../dev/directory-list-targets-and-subdirs.rst | 4 ++++ Source/cmState.cxx | 5 +++++ .../get_property/directory_properties-stderr.txt | 6 +++++- .../RunCMake/get_property/directory_properties.cmake | 6 ++++++ .../get_property/directory_properties/CMakeLists.txt | 4 ++++ 7 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 Help/prop_dir/BUILDSYSTEM_TARGETS.rst diff --git a/Help/manual/cmake-properties.7.rst b/Help/manual/cmake-properties.7.rst index 855cee6ba..b15ca9a82 100644 --- a/Help/manual/cmake-properties.7.rst +++ b/Help/manual/cmake-properties.7.rst @@ -54,6 +54,7 @@ Properties on Directories :maxdepth: 1 /prop_dir/ADDITIONAL_MAKE_CLEAN_FILES + /prop_dir/BUILDSYSTEM_TARGETS /prop_dir/CACHE_VARIABLES /prop_dir/CLEAN_NO_CUSTOM /prop_dir/CMAKE_CONFIGURE_DEPENDS diff --git a/Help/prop_dir/BUILDSYSTEM_TARGETS.rst b/Help/prop_dir/BUILDSYSTEM_TARGETS.rst new file mode 100644 index 000000000..da907cb93 --- /dev/null +++ b/Help/prop_dir/BUILDSYSTEM_TARGETS.rst @@ -0,0 +1,11 @@ +BUILDSYSTEM_TARGETS +------------------- + +This read-only directory property contains a +:ref:`;-list ` of buildsystem targets added in the +directory by calls to the :command:`add_library`, :command:`add_executable`, +and :command:`add_custom_target` commands. The list does not include any +:ref:`Imported Targets` or :ref:`Alias Targets`, but does include +:ref:`Interface Libraries`. Each entry in the list is the logical name +of a target, suitable to pass to the :command:`get_property` command +``TARGET`` option. diff --git a/Help/release/dev/directory-list-targets-and-subdirs.rst b/Help/release/dev/directory-list-targets-and-subdirs.rst index 554d6d6b7..5bab6659f 100644 --- a/Help/release/dev/directory-list-targets-and-subdirs.rst +++ b/Help/release/dev/directory-list-targets-and-subdirs.rst @@ -1,5 +1,9 @@ directory-list-targets-and-subdirs ---------------------------------- +* A :prop_dir:`BUILDSYSTEM_TARGETS` directory property was added to + get the list of logical buildsystem target names added by the + project in a directory. + * A :prop_dir:`SUBDIRECTORIES` directory property was added to get the list of subdirectories added by a project in a directory. diff --git a/Source/cmState.cxx b/Source/cmState.cxx index 325ca7689..37e41ad3d 100644 --- a/Source/cmState.cxx +++ b/Source/cmState.cxx @@ -29,6 +29,7 @@ #include #include +static std::string const kBUILDSYSTEM_TARGETS = "BUILDSYSTEM_TARGETS"; static std::string const kSUBDIRECTORIES = "SUBDIRECTORIES"; struct cmState::SnapshotDataType @@ -1683,6 +1684,10 @@ const char* cmState::Directory::GetProperty(const std::string& prop, output = cmJoin(child_dirs, ";"); return output.c_str(); } + if (prop == kBUILDSYSTEM_TARGETS) { + output = cmJoin(this->DirectoryState->NormalTargetNames, ";"); + return output.c_str(); + } if (prop == "LISTFILE_STACK") { std::vector listFiles; diff --git a/Tests/RunCMake/get_property/directory_properties-stderr.txt b/Tests/RunCMake/get_property/directory_properties-stderr.txt index b24c7098a..5fb79e14c 100644 --- a/Tests/RunCMake/get_property/directory_properties-stderr.txt +++ b/Tests/RunCMake/get_property/directory_properties-stderr.txt @@ -7,4 +7,8 @@ get_property: --><-- get_directory_property: -->[^<;]*Tests/RunCMake/get_property/directory_properties<-- get_property: -->[^<;]*Tests/RunCMake/get_property/directory_properties<-- get_directory_property: -->[^<;]*Tests/RunCMake/get_property/directory_properties/sub1;[^<;]*Tests/RunCMake/get_property/directory_properties/sub2<-- -get_property: -->[^<;]*Tests/RunCMake/get_property/directory_properties/sub1;[^<;]*Tests/RunCMake/get_property/directory_properties/sub2<--$ +get_property: -->[^<;]*Tests/RunCMake/get_property/directory_properties/sub1;[^<;]*Tests/RunCMake/get_property/directory_properties/sub2<-- +get_directory_property: -->CustomTop;InterfaceTop<-- +get_property: -->CustomTop;InterfaceTop<-- +get_directory_property: -->CustomSub;InterfaceSub<-- +get_property: -->CustomSub;InterfaceSub<--$ diff --git a/Tests/RunCMake/get_property/directory_properties.cmake b/Tests/RunCMake/get_property/directory_properties.cmake index c1347d3b4..ae57282a3 100644 --- a/Tests/RunCMake/get_property/directory_properties.cmake +++ b/Tests/RunCMake/get_property/directory_properties.cmake @@ -14,6 +14,12 @@ check_directory_property("${CMAKE_CURRENT_SOURCE_DIR}" empty) check_directory_property("${CMAKE_CURRENT_SOURCE_DIR}" custom) check_directory_property("${CMAKE_CURRENT_SOURCE_DIR}" noexist) +add_custom_target(CustomTop) +add_library(InterfaceTop INTERFACE) +add_library(my::InterfaceTop ALIAS InterfaceTop) + add_subdirectory(directory_properties) check_directory_property("${CMAKE_CURRENT_SOURCE_DIR}" SUBDIRECTORIES) check_directory_property("${CMAKE_CURRENT_SOURCE_DIR}/directory_properties" SUBDIRECTORIES) +check_directory_property("${CMAKE_CURRENT_SOURCE_DIR}" BUILDSYSTEM_TARGETS) +check_directory_property("${CMAKE_CURRENT_SOURCE_DIR}/directory_properties" BUILDSYSTEM_TARGETS) diff --git a/Tests/RunCMake/get_property/directory_properties/CMakeLists.txt b/Tests/RunCMake/get_property/directory_properties/CMakeLists.txt index f9ebf7811..7318b9777 100644 --- a/Tests/RunCMake/get_property/directory_properties/CMakeLists.txt +++ b/Tests/RunCMake/get_property/directory_properties/CMakeLists.txt @@ -1,2 +1,6 @@ add_subdirectory(sub1) subdirs(sub2) + +add_custom_target(CustomSub) +add_library(InterfaceSub INTERFACE) +add_library(my::InterfaceSub ALIAS InterfaceSub)