From 319c4c4d8033d8c37f320839196ed174c4674fdf Mon Sep 17 00:00:00 2001 From: Brad King Date: Tue, 29 Jan 2008 15:47:18 -0500 Subject: [PATCH] ENH: Update cmInstallTargetGenerator to get the shared libraries linked by a target from cmComputeLinkInformation instead of duplicating the computation. --- Source/cmComputeLinkInformation.cxx | 13 +++++ Source/cmComputeLinkInformation.h | 2 + Source/cmInstallTargetGenerator.cxx | 73 +++++++++++------------------ 3 files changed, 42 insertions(+), 46 deletions(-) diff --git a/Source/cmComputeLinkInformation.cxx b/Source/cmComputeLinkInformation.cxx index 190ffb850..990b8e5ec 100644 --- a/Source/cmComputeLinkInformation.cxx +++ b/Source/cmComputeLinkInformation.cxx @@ -283,6 +283,13 @@ std::vector const& cmComputeLinkInformation::GetFrameworkPaths() return this->FrameworkPaths; } +//---------------------------------------------------------------------------- +std::set 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 || diff --git a/Source/cmComputeLinkInformation.h b/Source/cmComputeLinkInformation.h index 96af2e4c8..33328c084 100644 --- a/Source/cmComputeLinkInformation.h +++ b/Source/cmComputeLinkInformation.h @@ -56,6 +56,7 @@ public: std::string GetRPathString(bool for_install); std::string GetChrpathString(); std::string GetChrpathTool(); + std::set const& GetSharedLibrariesLinked(); private: void AddItem(std::string const& item, cmTarget* tgt); @@ -65,6 +66,7 @@ private: std::vector Depends; std::vector FrameworkPaths; std::vector RuntimeSearchPath; + std::set SharedLibrariesLinked; // Context information. cmTarget* Target; diff --git a/Source/cmInstallTargetGenerator.cxx b/Source/cmInstallTargetGenerator.cxx index 4f6539a71..521fa4db5 100644 --- a/Source/cmInstallTargetGenerator.cxx +++ b/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 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 const& sharedLibs = cli->GetSharedLibrariesLinked(); + for(std::set::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); + for_install += fname; + } + else + { + for_install = tgt->GetInstallNameFixupPath(); + } - // 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; - } - } + if(for_build != for_install) + { + // Store the mapping entry. + install_name_remap[for_build] = for_install; } } }