diff options
author | Alexander Neundorf <neundorf@kde.org> | 2007-08-27 21:05:43 (GMT) |
---|---|---|
committer | Alexander Neundorf <neundorf@kde.org> | 2007-08-27 21:05:43 (GMT) |
commit | 94f0eca6897dcaff3d109cea78510d439adbb128 (patch) | |
tree | bfcf1ef729f7fd7e9641843cd1b57f0c7a267ddf | |
parent | 8302ea66d2b385c6161c69b0afd28d64dd44f135 (diff) | |
download | CMake-94f0eca6897dcaff3d109cea78510d439adbb128.zip CMake-94f0eca6897dcaff3d109cea78510d439adbb128.tar.gz CMake-94f0eca6897dcaff3d109cea78510d439adbb128.tar.bz2 |
BUG: fix #5326: source files with the same name in different groups lead to colliding object file names
Alex
-rw-r--r-- | Source/cmLocalVisualStudioGenerator.cxx | 60 | ||||
-rw-r--r-- | Source/cmLocalVisualStudioGenerator.h | 5 |
2 files changed, 43 insertions, 22 deletions
diff --git a/Source/cmLocalVisualStudioGenerator.cxx b/Source/cmLocalVisualStudioGenerator.cxx index b2bacca..53decdf 100644 --- a/Source/cmLocalVisualStudioGenerator.cxx +++ b/Source/cmLocalVisualStudioGenerator.cxx @@ -51,18 +51,13 @@ bool cmLocalVisualStudioGenerator::SourceFileCompiles(const cmSourceFile* sf) } //---------------------------------------------------------------------------- -void cmLocalVisualStudioGenerator::ComputeObjectNameRequirements -(std::vector<cmSourceGroup> const& sourceGroups) +void cmLocalVisualStudioGenerator::CountObjectNames( + const std::vector<cmSourceGroup>& groups, + std::map<cmStdString, int>& counts) { - // Clear the current set of requirements. - this->NeedObjectName.clear(); - - // Count the number of object files with each name. Note that - // windows file names are not case sensitive. - std::map<cmStdString, int> objectNameCounts; - for(unsigned int i = 0; i < sourceGroups.size(); ++i) + for(unsigned int i = 0; i < groups.size(); ++i) { - cmSourceGroup sg = sourceGroups[i]; + cmSourceGroup sg = groups[i]; std::vector<const cmSourceFile*> const& srcs = sg.GetSourceFiles(); for(std::vector<const cmSourceFile*>::const_iterator s = srcs.begin(); s != srcs.end(); ++s) @@ -70,21 +65,25 @@ void cmLocalVisualStudioGenerator::ComputeObjectNameRequirements const cmSourceFile* sf = *s; if(this->SourceFileCompiles(sf)) { - std::string objectName = - cmSystemTools::LowerCase( + std::string objectName = cmSystemTools::LowerCase( cmSystemTools::GetFilenameWithoutLastExtension( sf->GetFullPath())); objectName += ".obj"; - objectNameCounts[objectName] += 1; + counts[objectName] += 1; } } + this->CountObjectNames(sg.GetGroupChildren(), counts); } +} - // For all source files producing duplicate names we need unique - // object name computation. - for(unsigned int i = 0; i < sourceGroups.size(); ++i) +//---------------------------------------------------------------------------- +void cmLocalVisualStudioGenerator::InsertNeedObjectNames( + const std::vector<cmSourceGroup>& groups, + std::map<cmStdString, int>& count) +{ + for(unsigned int i = 0; i < groups.size(); ++i) { - cmSourceGroup sg = sourceGroups[i]; + cmSourceGroup sg = groups[i]; std::vector<const cmSourceFile*> const& srcs = sg.GetSourceFiles(); for(std::vector<const cmSourceFile*>::const_iterator s = srcs.begin(); s != srcs.end(); ++s) @@ -92,20 +91,37 @@ void cmLocalVisualStudioGenerator::ComputeObjectNameRequirements const cmSourceFile* sf = *s; if(this->SourceFileCompiles(sf)) { - std::string objectName = - cmSystemTools::LowerCase( - cmSystemTools::GetFilenameWithoutLastExtension( - sf->GetFullPath())); + std::string objectName = cmSystemTools::LowerCase( + cmSystemTools::GetFilenameWithoutLastExtension(sf->GetFullPath())); objectName += ".obj"; - if(objectNameCounts[objectName] > 1) + if(count[objectName] > 1) { this->NeedObjectName.insert(sf); } } } + this->InsertNeedObjectNames(sg.GetGroupChildren(), count); } } + +//---------------------------------------------------------------------------- +void cmLocalVisualStudioGenerator::ComputeObjectNameRequirements +(std::vector<cmSourceGroup> const& sourceGroups) +{ + // Clear the current set of requirements. + this->NeedObjectName.clear(); + + // Count the number of object files with each name. Note that + // windows file names are not case sensitive. + std::map<cmStdString, int> objectNameCounts; + this->CountObjectNames(sourceGroups, objectNameCounts); + + // For all source files producing duplicate names we need unique + // object name computation. + this->InsertNeedObjectNames(sourceGroups, objectNameCounts); +} + //---------------------------------------------------------------------------- std::string cmLocalVisualStudioGenerator diff --git a/Source/cmLocalVisualStudioGenerator.h b/Source/cmLocalVisualStudioGenerator.h index 9528fd4..64ce01d 100644 --- a/Source/cmLocalVisualStudioGenerator.h +++ b/Source/cmLocalVisualStudioGenerator.h @@ -46,6 +46,11 @@ protected: // Safe object file name generation. void ComputeObjectNameRequirements(std::vector<cmSourceGroup> const&); bool SourceFileCompiles(const cmSourceFile* sf); + void CountObjectNames(const std::vector<cmSourceGroup>& groups, + std::map<cmStdString, int>& count); + void InsertNeedObjectNames(const std::vector<cmSourceGroup>& groups, + std::map<cmStdString, int>& count); + std::set<const cmSourceFile*> NeedObjectName; }; |