ENH: now also provides obj rules for local Makefiles

This commit is contained in:
Ken Martin 2005-06-02 13:41:34 -04:00
parent 0b518c2fdb
commit c2aa4e7a08
2 changed files with 41 additions and 9 deletions

View File

@ -681,6 +681,8 @@ cmLocalUnixMakefileGenerator3
// The object file should be checked for dependency integrity. // The object file should be checked for dependency integrity.
m_CheckDependFiles[lang].insert(relativeObj); m_CheckDependFiles[lang].insert(relativeObj);
// add this to the list of objects for this local generator
m_LocalObjectFiles[cmSystemTools::GetFilenameName(obj)].push_back(&target);
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
@ -2729,7 +2731,7 @@ void cmLocalUnixMakefileGenerator3::WriteLocalMakefile()
std::string dir = m_Makefile->GetStartOutputDirectory(); std::string dir = m_Makefile->GetStartOutputDirectory();
dir += "/directorystart"; dir += "/directorystart";
dir = this->Convert(dir.c_str(),HOME_OUTPUT,MAKEFILE); dir = this->Convert(dir.c_str(),HOME_OUTPUT,MAKEFILE);
this->CreateJumpCommand(commands,dir); this->CreateJumpCommand(commands,"Makefile2",dir);
this->WriteMakeRule(ruleFileStream, "The main all target", "all", depends, commands); this->WriteMakeRule(ruleFileStream, "The main all target", "all", depends, commands);
// Write the clean rule. // Write the clean rule.
@ -2737,11 +2739,35 @@ void cmLocalUnixMakefileGenerator3::WriteLocalMakefile()
dir += "/clean"; dir += "/clean";
dir = this->Convert(dir.c_str(),HOME_OUTPUT,MAKEFILE); dir = this->Convert(dir.c_str(),HOME_OUTPUT,MAKEFILE);
commands.clear(); commands.clear();
this->CreateJumpCommand(commands,dir); this->CreateJumpCommand(commands,"Makefile2",dir);
this->WriteMakeRule(ruleFileStream, "The main clean target", "clean", depends, commands); this->WriteMakeRule(ruleFileStream, "The main clean target", "clean", depends, commands);
// recursively write our targets // recursively write our targets, and while doing it collect up the object
// file rules
this->WriteLocalMakefileTargets(ruleFileStream); this->WriteLocalMakefileTargets(ruleFileStream);
// now write out the object rules
// for each object file name
for (std::map<cmStdString,std::vector<const cmTarget *> >::iterator lo =
m_LocalObjectFiles.begin();
lo != m_LocalObjectFiles.end(); ++lo)
{
commands.clear();
// for each target using the object file
for (std::vector<const 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();
this->CreateJumpCommand(commands,tgtMakefileName.c_str(),targetName);
}
this->WriteMakeRule(ruleFileStream,
"target for object file",
lo->first.c_str(), depends, commands);
}
} }
void cmLocalUnixMakefileGenerator3 void cmLocalUnixMakefileGenerator3
@ -2766,7 +2792,7 @@ void cmLocalUnixMakefileGenerator3
commands.clear(); commands.clear();
depends.clear(); depends.clear();
this->CreateJumpCommand(commands,localName); this->CreateJumpCommand(commands,"Makefile2",localName);
this->WriteMakeRule(ruleFileStream, "Convenience name for target.", this->WriteMakeRule(ruleFileStream, "Convenience name for target.",
localName.c_str(), depends, commands); localName.c_str(), depends, commands);
@ -2782,8 +2808,10 @@ void cmLocalUnixMakefileGenerator3
} }
} }
void cmLocalUnixMakefileGenerator3::CreateJumpCommand(std::vector<std::string>& commands, void cmLocalUnixMakefileGenerator3
std::string& localName) ::CreateJumpCommand(std::vector<std::string>& commands,
const char *MakefileName,
std::string& localName)
{ {
if(m_WindowsShell) if(m_WindowsShell)
{ {
@ -2797,7 +2825,7 @@ void cmLocalUnixMakefileGenerator3::CreateJumpCommand(std::vector<std::string>&
// Build the target for this pass. // Build the target for this pass.
commands.push_back(this->GetRecursiveMakeCall commands.push_back(this->GetRecursiveMakeCall
("Makefile2",localName.c_str())); (MakefileName,localName.c_str()));
// Change back to the starting directory. Any trailing slash must be // Change back to the starting directory. Any trailing slash must be
// removed to avoid problems with Borland Make. // removed to avoid problems with Borland Make.
@ -2822,7 +2850,7 @@ void cmLocalUnixMakefileGenerator3::CreateJumpCommand(std::vector<std::string>&
// Build the target for this pass. // Build the target for this pass.
cmd += " && "; cmd += " && ";
cmd += this->GetRecursiveMakeCall("Makefile2",localName.c_str()); cmd += this->GetRecursiveMakeCall(MakefileName,localName.c_str());
// Add the command as a single line. // Add the command as a single line.
commands.push_back(cmd); commands.push_back(cmd);

View File

@ -158,7 +158,9 @@ protected:
void WriteLocalMakefileTargets(std::ostream& ruleFileStream); void WriteLocalMakefileTargets(std::ostream& ruleFileStream);
// create the cd to home commands // create the cd to home commands
void CreateJumpCommand(std::vector<std::string>& commands, std::string & localName); void CreateJumpCommand(std::vector<std::string>& commands,
const char *MakefileName,
std::string & localName);
// these two methods just compute reasonable values for m_LibraryOutputPath and // these two methods just compute reasonable values for m_LibraryOutputPath and
// m_ExecutableOutputPath // m_ExecutableOutputPath
@ -343,6 +345,8 @@ private:
// Set of object file names that will be built in this directory. // Set of object file names that will be built in this directory.
std::set<cmStdString> m_ObjectFiles; std::set<cmStdString> m_ObjectFiles;
std::map<cmStdString,std::vector<const cmTarget *> > m_LocalObjectFiles;
}; };
#endif #endif