diff options
author | Brad King <brad.king@kitware.com> | 2010-06-15 18:07:58 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2010-06-15 18:07:58 (GMT) |
commit | a8a10d0f6a6f19170f38a91e51a283af885fb79b (patch) | |
tree | 8fbf7ea87ac5826df827b6deca7613a6f3da72db /Source | |
parent | e82d918322391e5f312a014c28e4d18a75b91b22 (diff) | |
parent | 2d9dc9ac6560214de280aaab2264812a274aa7ba (diff) | |
download | CMake-a8a10d0f6a6f19170f38a91e51a283af885fb79b.zip CMake-a8a10d0f6a6f19170f38a91e51a283af885fb79b.tar.gz CMake-a8a10d0f6a6f19170f38a91e51a283af885fb79b.tar.bz2 |
Merge branch 'vs10-source-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; |