summaryrefslogtreecommitdiffstats
path: root/Source
diff options
context:
space:
mode:
authorChristoph Watzl <christoph.watzl@gmail.com>2010-06-11 19:33:38 (GMT)
committerBrad King <brad.king@kitware.com>2010-06-11 19:44:55 (GMT)
commit2d9dc9ac6560214de280aaab2264812a274aa7ba (patch)
tree33de979ce5a9aa950ed0584ad19bfe90d4917ae9 /Source
parentb9e3c243d476efa04479d253cfc4f76ecbdb6fe3 (diff)
downloadCMake-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.cxx49
-rw-r--r--Source/cmVisualStudio10TargetGenerator.h4
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;