ENH: Avoid generating duplicate rules for an object file. A warning about duplicate source files in a target is now generated.

This commit is contained in:
Brad King 2005-02-17 10:03:27 -05:00
parent cd6dd55330
commit 3d9d893426
2 changed files with 20 additions and 6 deletions

View File

@ -442,9 +442,25 @@ cmLocalUnixMakefileGenerator2
} }
// Get the full path name of the object file. // Get the full path name of the object file.
// TODO: Remove duplicate objects and warn.
std::string obj = this->GetObjectFileName(target, source); std::string obj = this->GetObjectFileName(target, source);
// Avoid generating duplicate rules.
if(m_ObjectFiles.find(obj) == m_ObjectFiles.end())
{
m_ObjectFiles.insert(obj);
}
else
{
cmOStringStream err;
err << "Warning: Source file \""
<< source.GetSourceName().c_str() << "."
<< source.GetSourceExtension().c_str()
<< "\" is listed multiple times for target \"" << target.GetName()
<< "\".";
cmSystemTools::Message(err.str().c_str(), "Warning");
return;
}
// Create the directory containing the object file. This may be a // Create the directory containing the object file. This may be a
// subdirectory under the target's directory. // subdirectory under the target's directory.
std::string dir = cmSystemTools::GetFilenamePath(obj.c_str()); std::string dir = cmSystemTools::GetFilenamePath(obj.c_str());
@ -1907,11 +1923,6 @@ cmLocalUnixMakefileGenerator2
for(std::vector<std::string>::iterator i = commands.begin(); for(std::vector<std::string>::iterator i = commands.begin();
i != commands.end(); ++i) i != commands.end(); ++i)
{ {
// TODO: Fix target output paths to use "cd...;pwd" idiom to pass
// a full path to the linker. This should be done by identifying
// a relative path and stripping the directory part off to put in
// this format. This rule is the only place that this idiom is
// needed.
this->ExpandRuleVariables(*i, this->ExpandRuleVariables(*i,
linkLanguage, linkLanguage,
buildObjs.c_str(), buildObjs.c_str(),

View File

@ -276,6 +276,9 @@ private:
// Set of custom rule files that have been generated. // Set of custom rule files that have been generated.
std::set<cmStdString> m_CustomRuleFiles; std::set<cmStdString> m_CustomRuleFiles;
// Set of object file names that will be built in this directory.
std::set<cmStdString> m_ObjectFiles;
// The prefix required of a path to be converted to a relative path. // The prefix required of a path to be converted to a relative path.
// No sequence of ../.. will ever go past this path. // No sequence of ../.. will ever go past this path.
std::string m_RelativePathTop; std::string m_RelativePathTop;