From 3d9d8934262df109938c0cb5498544b311d8bac7 Mon Sep 17 00:00:00 2001 From: Brad King Date: Thu, 17 Feb 2005 10:03:27 -0500 Subject: [PATCH] ENH: Avoid generating duplicate rules for an object file. A warning about duplicate source files in a target is now generated. --- Source/cmLocalUnixMakefileGenerator2.cxx | 23 +++++++++++++++++------ Source/cmLocalUnixMakefileGenerator2.h | 3 +++ 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/Source/cmLocalUnixMakefileGenerator2.cxx b/Source/cmLocalUnixMakefileGenerator2.cxx index ee759af44..57ff0c9f4 100644 --- a/Source/cmLocalUnixMakefileGenerator2.cxx +++ b/Source/cmLocalUnixMakefileGenerator2.cxx @@ -442,9 +442,25 @@ cmLocalUnixMakefileGenerator2 } // Get the full path name of the object file. - // TODO: Remove duplicate objects and warn. 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 // subdirectory under the target's directory. std::string dir = cmSystemTools::GetFilenamePath(obj.c_str()); @@ -1907,11 +1923,6 @@ cmLocalUnixMakefileGenerator2 for(std::vector::iterator i = commands.begin(); 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, linkLanguage, buildObjs.c_str(), diff --git a/Source/cmLocalUnixMakefileGenerator2.h b/Source/cmLocalUnixMakefileGenerator2.h index 0aad83a81..ed830814f 100644 --- a/Source/cmLocalUnixMakefileGenerator2.h +++ b/Source/cmLocalUnixMakefileGenerator2.h @@ -276,6 +276,9 @@ private: // Set of custom rule files that have been generated. std::set m_CustomRuleFiles; + // Set of object file names that will be built in this directory. + std::set m_ObjectFiles; + // The prefix required of a path to be converted to a relative path. // No sequence of ../.. will ever go past this path. std::string m_RelativePathTop;