Browse Source

ENH: Update cmInstallTargetGenerator to get the shared libraries linked by a target from cmComputeLinkInformation instead of duplicating the computation.

Brad King 18 years ago
parent
commit
319c4c4d80

+ 13 - 0
Source/cmComputeLinkInformation.cxx

@@ -283,6 +283,13 @@ std::vector<std::string> const& cmComputeLinkInformation::GetFrameworkPaths()
   return this->FrameworkPaths;
 }
 
+//----------------------------------------------------------------------------
+std::set<cmTarget*> const&
+cmComputeLinkInformation::GetSharedLibrariesLinked()
+{
+  return this->SharedLibrariesLinked;
+}
+
 //----------------------------------------------------------------------------
 bool cmComputeLinkInformation::Compute()
 {
@@ -340,6 +347,12 @@ void cmComputeLinkInformation::AddItem(std::string const& item,
     return;
     }
 
+  // Keep track of shared libraries linked.
+  if(tgt && tgt->GetType() == cmTarget::SHARED_LIBRARY)
+    {
+    this->SharedLibrariesLinked.insert(tgt);
+    }
+
   if(tgt && (tgt->GetType() == cmTarget::STATIC_LIBRARY ||
              tgt->GetType() == cmTarget::SHARED_LIBRARY ||
              tgt->GetType() == cmTarget::MODULE_LIBRARY ||

+ 2 - 0
Source/cmComputeLinkInformation.h

@@ -56,6 +56,7 @@ public:
   std::string GetRPathString(bool for_install);
   std::string GetChrpathString();
   std::string GetChrpathTool();
+  std::set<cmTarget*> const& GetSharedLibrariesLinked();
 private:
   void AddItem(std::string const& item, cmTarget* tgt);
 
@@ -65,6 +66,7 @@ private:
   std::vector<std::string> Depends;
   std::vector<std::string> FrameworkPaths;
   std::vector<std::string> RuntimeSearchPath;
+  std::set<cmTarget*> SharedLibrariesLinked;
 
   // Context information.
   cmTarget* Target;

+ 28 - 47
Source/cmInstallTargetGenerator.cxx

@@ -382,56 +382,37 @@ cmInstallTargetGenerator
   // Build a map of build-tree install_name to install-tree install_name for
   // shared libraries linked to this target.
   std::map<cmStdString, cmStdString> install_name_remap;
-  cmTarget::LinkLibraryType linkType = cmTarget::OPTIMIZED;
-  if(config && cmSystemTools::UpperCase(config) == "DEBUG")
+  if(cmComputeLinkInformation* cli = this->Target->GetLinkInformation(config))
     {
-    linkType = cmTarget::DEBUG;
-    }
-  // TODO: Merge with ComputeLinkInformation.
-  const cmTarget::LinkLibraryVectorType& inLibs = 
-    this->Target->GetLinkLibraries();
-  for(cmTarget::LinkLibraryVectorType::const_iterator j = inLibs.begin();
-      j != inLibs.end(); ++j)
-    {
-    std::string lib = j->first;
-    if((this->Target->GetType() == cmTarget::EXECUTABLE ||
-        lib != this->Target->GetName()) &&
-       (j->second == cmTarget::GENERAL || j->second == linkType))
+    std::set<cmTarget*> const& sharedLibs = cli->GetSharedLibrariesLinked();
+    for(std::set<cmTarget*>::const_iterator j = sharedLibs.begin();
+        j != sharedLibs.end(); ++j)
       {
-      if(cmTarget* tgt = this->Target->GetMakefile()->
-         GetLocalGenerator()->GetGlobalGenerator()->
-         FindTarget(0, lib.c_str()))
+      // If the build tree and install tree use different path
+      // components of the install_name field then we need to create a
+      // mapping to be applied after installation.
+      cmTarget* tgt = *j;
+      std::string for_build = tgt->GetInstallNameDirForBuildTree(config);
+      std::string for_install = tgt->GetInstallNameDirForInstallTree(config);
+      std::string fname = this->GetInstallFilename(tgt, config, false, true);
+
+      // Map from the build-tree install_name.
+      for_build += fname;
+
+      // Map to the install-tree install_name.
+      if (!for_install.empty())
         {
-        if(tgt->GetType() == cmTarget::SHARED_LIBRARY)
-          {
-          // If the build tree and install tree use different path
-          // components of the install_name field then we need to create a
-          // mapping to be applied after installation.
-          std::string for_build = tgt->GetInstallNameDirForBuildTree(config);
-          std::string for_install = 
-            tgt->GetInstallNameDirForInstallTree(config);
-          std::string fname =
-            this->GetInstallFilename(tgt, config, false, true);
-
-          // Map from the build-tree install_name.
-          for_build += fname;
-
-          // Map to the install-tree install_name.
-          if (!for_install.empty())
-            {
-            for_install += fname;
-            }
-          else
-            {
-            for_install = tgt->GetInstallNameFixupPath();
-            }
-
-          if(for_build != for_install)
-            {
-            // Store the mapping entry.
-            install_name_remap[for_build] = for_install;
-            }
-          }
+        for_install += fname;
+        }
+      else
+        {
+        for_install = tgt->GetInstallNameFixupPath();
+        }
+
+      if(for_build != for_install)
+        {
+        // Store the mapping entry.
+        install_name_remap[for_build] = for_install;
         }
       }
     }