ENH: Moved generation of directory-level object convenience rules to a separate method. This will aid generation of more such rules later.

This commit is contained in:
Brad King 2006-08-01 16:16:21 -04:00
parent 2350085120
commit fe5a6e9413
2 changed files with 39 additions and 22 deletions

View File

@ -275,34 +275,15 @@ void cmLocalUnixMakefileGenerator3::WriteLocalMakefile()
gg->WriteConvenienceRules(ruleFileStream,emittedTargets);
}
std::vector<std::string> depends;
std::vector<std::string> commands;
// now write out the object rules
// for each object file name
for (std::map<cmStdString,std::vector<cmTarget *> >::iterator lo =
this->LocalObjectFiles.begin();
lo != this->LocalObjectFiles.end(); ++lo)
{
commands.clear();
// for each target using the object file
for (std::vector<cmTarget *>::iterator to =
lo->second.begin(); to != lo->second.end(); ++to)
{
std::string tgtMakefileName = this->GetRelativeTargetDirectory(**to);
std::string targetName = tgtMakefileName;
tgtMakefileName += "/build.make";
targetName += "/";
targetName += lo->first.c_str();
commands.push_back(this->GetRecursiveMakeCall
(tgtMakefileName.c_str(),targetName.c_str()));
this->CreateCDCommand(commands,
this->Makefile->GetHomeOutputDirectory(),
this->Makefile->GetStartOutputDirectory());
}
this->WriteMakeRule(ruleFileStream,
"target for object file",
lo->first.c_str(), depends, commands, false);
this->WriteObjectConvenienceRule(ruleFileStream,
"target to build an object file",
lo->first.c_str(), lo->second);
}
// add a help target as long as there isn;t a real target named help
@ -316,6 +297,38 @@ void cmLocalUnixMakefileGenerator3::WriteLocalMakefile()
this->WriteSpecialTargetsBottom(ruleFileStream);
}
//----------------------------------------------------------------------------
void
cmLocalUnixMakefileGenerator3
::WriteObjectConvenienceRule(std::ostream& ruleFileStream,
const char* output, const char* comment,
std::vector<cmTarget*>& targets)
{
// Recursively make the rule for each target using the object file.
std::vector<std::string> commands;
for(std::vector<cmTarget*>::iterator t = targets.begin();
t != targets.end(); ++t)
{
std::string tgtMakefileName = this->GetRelativeTargetDirectory(**t);
std::string targetName = tgtMakefileName;
tgtMakefileName += "/build.make";
targetName += "/";
targetName += output;
commands.push_back(
this->GetRecursiveMakeCall(tgtMakefileName.c_str(), targetName.c_str())
);
this->CreateCDCommand(commands,
this->Makefile->GetHomeOutputDirectory(),
this->Makefile->GetStartOutputDirectory());
}
// Write the rule to the makefile.
std::vector<std::string> no_depends;
this->WriteMakeRule(ruleFileStream, comment,
output, no_depends, commands, true);
}
//----------------------------------------------------------------------------
void cmLocalUnixMakefileGenerator3
::WriteLocalMakefileTargets(std::ostream& ruleFileStream,
std::set<cmStdString> &emitted)

View File

@ -223,6 +223,7 @@ protected:
void WriteLocalMakefile();
// write the target rules for the local Makefile into the stream
void WriteLocalMakefileTargets(std::ostream& ruleFileStream,
std::set<cmStdString> &emitted);
@ -267,6 +268,9 @@ protected:
void WriteTargetRequiresRule(std::ostream& ruleFileStream,
cmTarget& target,
const std::vector<std::string>& objects);
void WriteObjectConvenienceRule(std::ostream& ruleFileStream,
const char* comment, const char* output,
std::vector<cmTarget*>& targets);
std::string GetObjectFileName(cmTarget& target,
const cmSourceFile& source,