diff --git a/Source/cmLocalVisualStudioGenerator.cxx b/Source/cmLocalVisualStudioGenerator.cxx index b2bacca69..53decdf86 100644 --- a/Source/cmLocalVisualStudioGenerator.cxx +++ b/Source/cmLocalVisualStudioGenerator.cxx @@ -50,6 +50,61 @@ bool cmLocalVisualStudioGenerator::SourceFileCompiles(const cmSourceFile* sf) } } +//---------------------------------------------------------------------------- +void cmLocalVisualStudioGenerator::CountObjectNames( + const std::vector& groups, + std::map& counts) +{ + for(unsigned int i = 0; i < groups.size(); ++i) + { + cmSourceGroup sg = groups[i]; + std::vector const& srcs = sg.GetSourceFiles(); + for(std::vector::const_iterator s = srcs.begin(); + s != srcs.end(); ++s) + { + const cmSourceFile* sf = *s; + if(this->SourceFileCompiles(sf)) + { + std::string objectName = cmSystemTools::LowerCase( + cmSystemTools::GetFilenameWithoutLastExtension( + sf->GetFullPath())); + objectName += ".obj"; + counts[objectName] += 1; + } + } + this->CountObjectNames(sg.GetGroupChildren(), counts); + } +} + +//---------------------------------------------------------------------------- +void cmLocalVisualStudioGenerator::InsertNeedObjectNames( + const std::vector& groups, + std::map& count) +{ + for(unsigned int i = 0; i < groups.size(); ++i) + { + cmSourceGroup sg = groups[i]; + std::vector const& srcs = sg.GetSourceFiles(); + for(std::vector::const_iterator s = srcs.begin(); + s != srcs.end(); ++s) + { + const cmSourceFile* sf = *s; + if(this->SourceFileCompiles(sf)) + { + std::string objectName = cmSystemTools::LowerCase( + cmSystemTools::GetFilenameWithoutLastExtension(sf->GetFullPath())); + objectName += ".obj"; + if(count[objectName] > 1) + { + this->NeedObjectName.insert(sf); + } + } + } + this->InsertNeedObjectNames(sg.GetGroupChildren(), count); + } +} + + //---------------------------------------------------------------------------- void cmLocalVisualStudioGenerator::ComputeObjectNameRequirements (std::vector const& sourceGroups) @@ -60,50 +115,11 @@ void cmLocalVisualStudioGenerator::ComputeObjectNameRequirements // Count the number of object files with each name. Note that // windows file names are not case sensitive. std::map objectNameCounts; - for(unsigned int i = 0; i < sourceGroups.size(); ++i) - { - cmSourceGroup sg = sourceGroups[i]; - std::vector const& srcs = sg.GetSourceFiles(); - for(std::vector::const_iterator s = srcs.begin(); - s != srcs.end(); ++s) - { - const cmSourceFile* sf = *s; - if(this->SourceFileCompiles(sf)) - { - std::string objectName = - cmSystemTools::LowerCase( - cmSystemTools::GetFilenameWithoutLastExtension( - sf->GetFullPath())); - objectName += ".obj"; - objectNameCounts[objectName] += 1; - } - } - } + this->CountObjectNames(sourceGroups, objectNameCounts); // For all source files producing duplicate names we need unique // object name computation. - for(unsigned int i = 0; i < sourceGroups.size(); ++i) - { - cmSourceGroup sg = sourceGroups[i]; - std::vector const& srcs = sg.GetSourceFiles(); - for(std::vector::const_iterator s = srcs.begin(); - s != srcs.end(); ++s) - { - const cmSourceFile* sf = *s; - if(this->SourceFileCompiles(sf)) - { - std::string objectName = - cmSystemTools::LowerCase( - cmSystemTools::GetFilenameWithoutLastExtension( - sf->GetFullPath())); - objectName += ".obj"; - if(objectNameCounts[objectName] > 1) - { - this->NeedObjectName.insert(sf); - } - } - } - } + this->InsertNeedObjectNames(sourceGroups, objectNameCounts); } //---------------------------------------------------------------------------- diff --git a/Source/cmLocalVisualStudioGenerator.h b/Source/cmLocalVisualStudioGenerator.h index 9528fd4ef..64ce01ddf 100644 --- a/Source/cmLocalVisualStudioGenerator.h +++ b/Source/cmLocalVisualStudioGenerator.h @@ -46,6 +46,11 @@ protected: // Safe object file name generation. void ComputeObjectNameRequirements(std::vector const&); bool SourceFileCompiles(const cmSourceFile* sf); + void CountObjectNames(const std::vector& groups, + std::map& count); + void InsertNeedObjectNames(const std::vector& groups, + std::map& count); + std::set NeedObjectName; };