cmCommonTargetGenerator: Adopt linked target directory computation

Factor a GetLinkedTargetDirectories method out of
cmMakefileTargetGenerator::WriteTargetDependRules to compute the list of
directories associated with targets to which the current target links.
This commit is contained in:
Brad King 2015-07-28 14:05:34 -04:00
parent 98d6e9ec2d
commit 6d79eda769
3 changed files with 40 additions and 26 deletions

View File

@ -368,3 +368,37 @@ std::string cmCommonTargetGenerator::GetIncludes(std::string const& l)
} }
return i->second; return i->second;
} }
std::vector<std::string>
cmCommonTargetGenerator::GetLinkedTargetDirectories() const
{
std::vector<std::string> dirs;
std::set<cmTarget const*> emitted;
if (cmComputeLinkInformation* cli =
this->Target->GetLinkInformation(this->ConfigName))
{
cmComputeLinkInformation::ItemVector const& items = cli->GetItems();
for(cmComputeLinkInformation::ItemVector::const_iterator
i = items.begin(); i != items.end(); ++i)
{
cmTarget const* linkee = i->Target;
if(linkee && !linkee->IsImported()
// We can ignore the INTERFACE_LIBRARY items because
// Target->GetLinkInformation already processed their
// link interface and they don't have any output themselves.
&& linkee->GetType() != cmTarget::INTERFACE_LIBRARY
&& emitted.insert(linkee).second)
{
cmGeneratorTarget* gt =
this->GlobalGenerator->GetGeneratorTarget(linkee);
cmLocalGenerator* lg = gt->GetLocalGenerator();
cmMakefile* mf = linkee->GetMakefile();
std::string di = mf->GetCurrentBinaryDirectory();
di += "/";
di += lg->GetTargetDirectory(*linkee);
dirs.push_back(di);
}
}
}
return dirs;
}

View File

@ -85,6 +85,8 @@ protected:
ByLanguageMap DefinesByLanguage; ByLanguageMap DefinesByLanguage;
std::string GetIncludes(std::string const& l); std::string GetIncludes(std::string const& l);
ByLanguageMap IncludesByLanguage; ByLanguageMap IncludesByLanguage;
std::vector<std::string> GetLinkedTargetDirectories() const;
}; };
#endif #endif

View File

@ -1059,33 +1059,11 @@ void cmMakefileTargetGenerator::WriteTargetDependRules()
<< "\n" << "\n"
<< "# Targets to which this target links.\n" << "# Targets to which this target links.\n"
<< "set(CMAKE_TARGET_LINKED_INFO_FILES\n"; << "set(CMAKE_TARGET_LINKED_INFO_FILES\n";
std::set<cmTarget const*> emitted; std::vector<std::string> dirs = this->GetLinkedTargetDirectories();
const char* cfg = this->LocalGenerator->GetConfigName().c_str(); for (std::vector<std::string>::iterator i = dirs.begin();
if(cmComputeLinkInformation* cli = this->Target->GetLinkInformation(cfg)) i != dirs.end(); ++i)
{ {
cmComputeLinkInformation::ItemVector const& items = cli->GetItems(); *this->InfoFileStream << " \"" << *i << "/DependInfo.cmake\"\n";
for(cmComputeLinkInformation::ItemVector::const_iterator
i = items.begin(); i != items.end(); ++i)
{
cmTarget const* linkee = i->Target;
if(linkee && !linkee->IsImported()
// We can ignore the INTERFACE_LIBRARY items because
// Target->GetLinkInformation already processed their
// link interface and they don't have any output themselves.
&& linkee->GetType() != cmTarget::INTERFACE_LIBRARY
&& emitted.insert(linkee).second)
{
cmGeneratorTarget* gt =
this->GlobalGenerator->GetGeneratorTarget(linkee);
cmLocalGenerator* lg = gt->GetLocalGenerator();
cmMakefile* mf = linkee->GetMakefile();
std::string di = mf->GetCurrentBinaryDirectory();
di += "/";
di += lg->GetTargetDirectory(*linkee);
di += "/DependInfo.cmake";
*this->InfoFileStream << " \"" << di << "\"\n";
}
}
} }
*this->InfoFileStream *this->InfoFileStream
<< " )\n"; << " )\n";