From 0af3b3b8028bfe01621887d115dfbdcd3890e602 Mon Sep 17 00:00:00 2001 From: Brad King Date: Wed, 2 Sep 2009 16:06:43 -0400 Subject: Speed up graph traversal for project->targets map The cmGlobalGenerator::AddTargetDepends method traces the dependencies of targets recursively to collect the complete set of targets needed for a given project (for VS .sln files). This commit teaches the method to avoid tracing its dependencies more than once. Otherwise the code does an all-paths walk needlessly. --- Source/cmGlobalGenerator.cxx | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/Source/cmGlobalGenerator.cxx b/Source/cmGlobalGenerator.cxx index f4fa6f4..812cffd 100644 --- a/Source/cmGlobalGenerator.cxx +++ b/Source/cmGlobalGenerator.cxx @@ -1971,14 +1971,12 @@ cmGlobalGenerator::AddTargetDepends(cmTarget* target, projectTargets) { // add the target itself - projectTargets.insert(target); - // get the direct depends of target - cmGlobalGenerator::TargetDependSet const& tset - = this->GetTargetDirectDepends(*target); - if(tset.size()) - { - // if there are targets that depend on target - // add them and their depends as well + if(projectTargets.insert(target).second) + { + // This is the first time we have encountered the target. + // Recursively follow its dependencies. + cmGlobalGenerator::TargetDependSet const& tset + = this->GetTargetDirectDepends(*target); for(cmGlobalGenerator::TargetDependSet::const_iterator i = tset.begin(); i != tset.end(); ++i) { -- cgit v0.12