diff options
author | Christoph Watzl <christoph.watzl@gmail.com> | 2010-06-11 19:33:38 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2010-06-11 19:44:55 (GMT) |
commit | 2d9dc9ac6560214de280aaab2264812a274aa7ba (patch) | |
tree | 33de979ce5a9aa950ed0584ad19bfe90d4917ae9 /Source | |
parent | b9e3c243d476efa04479d253cfc4f76ecbdb6fe3 (diff) | |
download | CMake-2d9dc9ac6560214de280aaab2264812a274aa7ba.zip CMake-2d9dc9ac6560214de280aaab2264812a274aa7ba.tar.gz CMake-2d9dc9ac6560214de280aaab2264812a274aa7ba.tar.bz2 |
Fix nested source groups with VS 10 (#9863)
Add intermediate (but empty) source group filters for the container
groups.
Diffstat (limited to 'Source')
-rw-r--r-- | Source/cmVisualStudio10TargetGenerator.cxx | 49 | ||||
-rw-r--r-- | Source/cmVisualStudio10TargetGenerator.h | 4 |
2 files changed, 53 insertions, 0 deletions
diff --git a/Source/cmVisualStudio10TargetGenerator.cxx b/Source/cmVisualStudio10TargetGenerator.cxx index 53d6594..59e20d5 100644 --- a/Source/cmVisualStudio10TargetGenerator.cxx +++ b/Source/cmVisualStudio10TargetGenerator.cxx @@ -435,6 +435,9 @@ void cmVisualStudio10TargetGenerator::WriteGroups() none.push_back(sf); } } + + this->AddMissingSourceGroups(groupsUsed, sourceGroups); + // Write out group file std::string path = this->Makefile->GetStartOutputDirectory(); path += "/"; @@ -492,6 +495,52 @@ void cmVisualStudio10TargetGenerator::WriteGroups() } } +// Add to groupsUsed empty source groups that have non-empty children. +void +cmVisualStudio10TargetGenerator::AddMissingSourceGroups( + std::set<cmSourceGroup*>& groupsUsed, + const std::vector<cmSourceGroup>& allGroups + ) +{ + for(std::vector<cmSourceGroup>::const_iterator current = allGroups.begin(); + current != allGroups.end(); ++current) + { + std::vector<cmSourceGroup> const& children = current->GetGroupChildren(); + if(children.empty()) + { + continue; // the group is really empty + } + + this->AddMissingSourceGroups(groupsUsed, children); + + cmSourceGroup* current_ptr = const_cast<cmSourceGroup*>(&(*current)); + if(groupsUsed.find(current_ptr) != groupsUsed.end()) + { + continue; // group has already been added to set + } + + // check if it least one of the group's descendants is not empty + // (at least one child must already have been added) + std::vector<cmSourceGroup>::const_iterator child_it = children.begin(); + while(child_it != children.end()) + { + cmSourceGroup* child_ptr = const_cast<cmSourceGroup*>(&(*child_it)); + if(groupsUsed.find(child_ptr) != groupsUsed.end()) + { + break; // found a child that was already added => add current group too + } + child_it++; + } + + if(child_it == children.end()) + { + continue; // no descendants have source files => ignore this group + } + + groupsUsed.insert(current_ptr); + } +} + void cmVisualStudio10TargetGenerator:: WriteGroupSources(const char* name, diff --git a/Source/cmVisualStudio10TargetGenerator.h b/Source/cmVisualStudio10TargetGenerator.h index 989db71..64b2361 100644 --- a/Source/cmVisualStudio10TargetGenerator.h +++ b/Source/cmVisualStudio10TargetGenerator.h @@ -77,6 +77,10 @@ private: void WriteGroupSources(const char* name, std::vector<cmSourceFile*> const& sources, std::vector<cmSourceGroup>& ); + void AddMissingSourceGroups(std::set<cmSourceGroup*>& groupsUsed, + const std::vector<cmSourceGroup>& allGroups); + + private: typedef cmVisualStudioGeneratorOptions Options; typedef std::map<cmStdString, Options*> OptionsMap; |