Consolidate duplicate link rule make dependency code

Factor code previously duplicated for library and executable rules into
a common method.
This commit is contained in:
Brad King 2010-11-05 08:33:47 -04:00
parent 947de96030
commit 07cfa57ec5
4 changed files with 36 additions and 50 deletions

View File

@ -82,34 +82,9 @@ void cmMakefileExecutableTargetGenerator::WriteExecutableRule(bool relink)
{ {
std::vector<std::string> commands; std::vector<std::string> commands;
std::string relPath = this->LocalGenerator->GetHomeRelativeOutputPath();
std::string objTarget;
// Build list of dependencies. // Build list of dependencies.
std::vector<std::string> depends; std::vector<std::string> depends;
for(std::vector<std::string>::const_iterator obj = this->Objects.begin(); this->AppendLinkDepends(depends);
obj != this->Objects.end(); ++obj)
{
objTarget = relPath;
objTarget += *obj;
depends.push_back(objTarget);
}
// Add dependencies on targets that must be built first.
this->AppendTargetDepends(depends);
// Add a dependency on the rule file itself.
this->LocalGenerator->AppendRuleDepend(depends,
this->BuildFileNameFull.c_str());
for(std::vector<std::string>::const_iterator obj =
this->ExternalObjects.begin();
obj != this->ExternalObjects.end(); ++obj)
{
depends.push_back(*obj);
}
// from here up is the same for exe or lib
// Get the name of the executable to generate. // Get the name of the executable to generate.
std::string targetName; std::string targetName;

View File

@ -308,33 +308,10 @@ void cmMakefileLibraryTargetGenerator::WriteLibraryRules
// code duplication. // code duplication.
std::vector<std::string> commands; std::vector<std::string> commands;
std::string relPath = this->LocalGenerator->GetHomeRelativeOutputPath();
std::string objTarget;
// Build list of dependencies. // Build list of dependencies.
std::vector<std::string> depends; std::vector<std::string> depends;
for(std::vector<std::string>::const_iterator obj = this->Objects.begin(); this->AppendLinkDepends(depends);
obj != this->Objects.end(); ++obj)
{
objTarget = relPath;
objTarget += *obj;
depends.push_back(objTarget);
}
// Add dependencies on targets that must be built first.
this->AppendTargetDepends(depends);
// Add a dependency on the rule file itself.
this->LocalGenerator->AppendRuleDepend(depends,
this->BuildFileNameFull.c_str());
for(std::vector<std::string>::const_iterator obj
= this->ExternalObjects.begin();
obj != this->ExternalObjects.end(); ++obj)
{
depends.push_back(*obj);
}
// Get the language to use for linking this library. // Get the language to use for linking this library.
const char* linkLanguage = const char* linkLanguage =
this->Target->GetLinkerLanguage(this->ConfigName); this->Target->GetLinkerLanguage(this->ConfigName);

View File

@ -1505,6 +1505,37 @@ void cmMakefileTargetGenerator
} }
} }
//----------------------------------------------------------------------------
void cmMakefileTargetGenerator
::AppendLinkDepends(std::vector<std::string>& depends)
{
// Add dependencies on the compiled object files.
std::string relPath = this->LocalGenerator->GetHomeRelativeOutputPath();
std::string objTarget;
for(std::vector<std::string>::const_iterator obj = this->Objects.begin();
obj != this->Objects.end(); ++obj)
{
objTarget = relPath;
objTarget += *obj;
depends.push_back(objTarget);
}
// Add dependencies on targets that must be built first.
this->AppendTargetDepends(depends);
// Add a dependency on the rule file itself.
this->LocalGenerator->AppendRuleDepend(depends,
this->BuildFileNameFull.c_str());
// Add dependencies on the external object files.
for(std::vector<std::string>::const_iterator obj
= this->ExternalObjects.begin();
obj != this->ExternalObjects.end(); ++obj)
{
depends.push_back(*obj);
}
}
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
void cmMakefileTargetGenerator void cmMakefileTargetGenerator
::CloseFileStreams() ::CloseFileStreams()

View File

@ -115,6 +115,9 @@ protected:
// append intertarget dependencies // append intertarget dependencies
void AppendTargetDepends(std::vector<std::string>& depends); void AppendTargetDepends(std::vector<std::string>& depends);
// Append link rule dependencies (objects, etc.).
void AppendLinkDepends(std::vector<std::string>& depends);
/** In order to support parallel builds for custom commands with /** In order to support parallel builds for custom commands with
multiple outputs the outputs are given a serial order, and only multiple outputs the outputs are given a serial order, and only
the first output actually has the build rule. Other outputs the first output actually has the build rule. Other outputs