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

This commit is contained in:
Brad King 2008-01-29 15:47:18 -05:00
parent 6e70424fc8
commit 319c4c4d80
3 changed files with 42 additions and 46 deletions

View File

@ -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 ||

View File

@ -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;

View File

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