Просмотр исходного кода

Merge topic 'dir-IMPORTED_TARGETS'

e13704ce72 Add directory property to list imported targets
ea6d338ea1 cmState: Record imported target names in each directory

Acked-by: Kitware Robot <[email protected]>
Merge-request: !6215
Brad King 4 лет назад
Родитель
Сommit
f597bb396e

+ 1 - 0
Help/manual/cmake-properties.7.rst

@@ -74,6 +74,7 @@ Properties on Directories
    /prop_dir/DEFINITIONS
    /prop_dir/EXCLUDE_FROM_ALL
    /prop_dir/IMPLICIT_DEPENDS_INCLUDE_TRANSFORM
+   /prop_dir/IMPORTED_TARGETS
    /prop_dir/INCLUDE_DIRECTORIES
    /prop_dir/INCLUDE_REGULAR_EXPRESSION
    /prop_dir/INTERPROCEDURAL_OPTIMIZATION

+ 2 - 0
Help/prop_dir/BUILDSYSTEM_TARGETS.rst

@@ -11,3 +11,5 @@ and :command:`add_custom_target` commands.  The list does not include any
 :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.
+
+See also the :prop_dir:`IMPORTED_TARGETS` directory property.

+ 14 - 0
Help/prop_dir/IMPORTED_TARGETS.rst

@@ -0,0 +1,14 @@
+IMPORTED_TARGETS
+----------------
+
+.. versionadded:: 3.21
+
+This read-only directory property contains a
+:ref:`semicolon-separated list <CMake Language Lists>` of
+:ref:`Imported Targets` added in the directory by calls to the
+:command:`add_library` and :command:`add_executable` commands.
+Each entry in the list is the logical name of a target, suitable
+to pass to the :command:`get_property` command ``TARGET`` option
+when called in the same directory.
+
+See also the :prop_dir:`BUILDSYSTEM_TARGETS` directory property.

+ 6 - 0
Help/release/dev/dir-IMPORTED_TARGETS.rst

@@ -0,0 +1,6 @@
+dir-IMPORTED_TARGETS
+--------------------
+
+* The :prop_dir:`IMPORTED_TARGETS` directory property was added to
+  get a list of :ref:`Imported Targets` created in the current
+  directory.

+ 1 - 0
Source/cmMakefile.cxx

@@ -4134,6 +4134,7 @@ cmTarget* cmMakefile::AddImportedTarget(const std::string& name,
   // Add to the set of available imported targets.
   this->ImportedTargets[name] = target.get();
   this->GetGlobalGenerator()->IndexTarget(target.get());
+  this->GetStateSnapshot().GetDirectory().AddImportedTargetName(name);
 
   // Transfer ownership to this cmMakefile object.
   this->ImportedTargetsOwned.push_back(std::move(target));

+ 1 - 0
Source/cmState.cxx

@@ -286,6 +286,7 @@ cmStateSnapshot cmState::Reset()
     it->LinkDirectoriesBacktraces.clear();
     it->DirectoryEnd = pos;
     it->NormalTargetNames.clear();
+    it->ImportedTargetNames.clear();
     it->Properties.Clear();
     it->Children.clear();
   }

+ 11 - 0
Source/cmStateDirectory.cxx

@@ -8,7 +8,9 @@
 #include <vector>
 
 #include <cm/iterator>
+#include <cm/string_view>
 #include <cmext/algorithm>
+#include <cmext/string_view>
 
 #include "cmAlgorithms.h"
 #include "cmProperty.h"
@@ -475,6 +477,10 @@ cmProp cmStateDirectory::GetProperty(const std::string& prop, bool chain) const
     output = cmJoin(this->DirectoryState->NormalTargetNames, ";");
     return &output;
   }
+  if (prop == "IMPORTED_TARGETS"_s) {
+    output = cmJoin(this->DirectoryState->ImportedTargetNames, ";");
+    return &output;
+  }
 
   if (prop == "LISTFILE_STACK") {
     std::vector<std::string> listFiles;
@@ -546,3 +552,8 @@ void cmStateDirectory::AddNormalTargetName(std::string const& name)
 {
   this->DirectoryState->NormalTargetNames.push_back(name);
 }
+
+void cmStateDirectory::AddImportedTargetName(std::string const& name)
+{
+  this->DirectoryState->ImportedTargetNames.emplace_back(name);
+}

+ 1 - 0
Source/cmStateDirectory.h

@@ -81,6 +81,7 @@ public:
   std::vector<std::string> GetPropertyKeys() const;
 
   void AddNormalTargetName(std::string const& name);
+  void AddImportedTargetName(std::string const& name);
 
 private:
   cmLinkedTree<cmStateDetail::BuildsystemDirectoryStateType>::iterator

+ 1 - 0
Source/cmStatePrivate.h

@@ -83,6 +83,7 @@ struct cmStateDetail::BuildsystemDirectoryStateType
   std::vector<cmListFileBacktrace> LinkDirectoriesBacktraces;
 
   std::vector<std::string> NormalTargetNames;
+  std::vector<std::string> ImportedTargetNames;
 
   std::string ProjectName;
 

+ 4 - 0
Tests/RunCMake/get_property/directory_properties-stderr.txt

@@ -12,6 +12,10 @@ get_directory_property: -->CustomTop;InterfaceTop<--
 get_property: -->CustomTop;InterfaceTop<--
 get_directory_property: -->CustomSub;InterfaceSub<--
 get_property: -->CustomSub;InterfaceSub<--
+get_directory_property: -->Imported1Top;Imported2Top<--
+get_property: -->Imported1Top;Imported2Top<--
+get_directory_property: -->Imported1Sub;Imported2Sub<--
+get_property: -->Imported1Sub;Imported2Sub<--
 get_directory_property: -->[^<;]*/Tests/RunCMake/get_property/directory_properties-build<--
 get_property: -->[^<;]*/Tests/RunCMake/get_property/directory_properties-build<--
 get_directory_property: -->[^<;]*/RunCMake/get_property<--

+ 5 - 0
Tests/RunCMake/get_property/directory_properties.cmake

@@ -18,11 +18,16 @@ add_custom_target(CustomTop)
 add_library(InterfaceTop INTERFACE)
 add_library(my::InterfaceTop ALIAS InterfaceTop)
 
+add_library(Imported1Top INTERFACE IMPORTED)
+add_library(Imported2Top INTERFACE IMPORTED)
+
 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)
+check_directory_property("${CMAKE_CURRENT_SOURCE_DIR}" IMPORTED_TARGETS)
+check_directory_property("${CMAKE_CURRENT_SOURCE_DIR}/directory_properties" IMPORTED_TARGETS)
 
 check_directory_property("${CMAKE_CURRENT_SOURCE_DIR}" BINARY_DIR)
 check_directory_property("${CMAKE_CURRENT_SOURCE_DIR}" SOURCE_DIR)

+ 3 - 0
Tests/RunCMake/get_property/directory_properties/CMakeLists.txt

@@ -5,5 +5,8 @@ add_custom_target(CustomSub)
 add_library(InterfaceSub INTERFACE)
 add_library(my::InterfaceSub ALIAS InterfaceSub)
 
+add_library(Imported1Sub INTERFACE IMPORTED)
+add_library(Imported2Sub INTERFACE IMPORTED)
+
 add_test(Sub/test1 COMMAND "${CMAKE_COMMAND}" -E echo "Sub/test1")
 add_test(Sub/test2 COMMAND "${CMAKE_COMMAND}" -E echo "Sub/test2")