|  | @@ -133,20 +133,25 @@ void cmGlobalUnixMakefileGenerator3::Generate()
 | 
	
		
			
				|  |  |      total += lg->GetNumberOfProgressActions();
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  // write each target's progress.make
 | 
	
		
			
				|  |  | +  // write each target's progress.make this loop is done twice. Bascially the
 | 
	
		
			
				|  |  | +  // Generate pass counts all the actions, the first loop below determines
 | 
	
		
			
				|  |  | +  // how many actions have progress updates for each target and writes to
 | 
	
		
			
				|  |  | +  // corrrect variable values for everything except the all targets. The
 | 
	
		
			
				|  |  | +  // second loop actually writes out correct values for the all targets as
 | 
	
		
			
				|  |  | +  // well. This is because the all targets require more information that is
 | 
	
		
			
				|  |  | +  // computed in the first loop.
 | 
	
		
			
				|  |  |    unsigned long current = 0;
 | 
	
		
			
				|  |  | -  for (i = 1; i < this->LocalGenerators.size(); ++i)
 | 
	
		
			
				|  |  | +  for (i = 0; i < this->LocalGenerators.size(); ++i)
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  |      cmLocalUnixMakefileGenerator3 *lg = 
 | 
	
		
			
				|  |  |        static_cast<cmLocalUnixMakefileGenerator3 *>(this->LocalGenerators[i]);
 | 
	
		
			
				|  |  |      lg->WriteProgressVariables(total,current);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -  // write the top one last to get the total count
 | 
	
		
			
				|  |  | -  if (this->LocalGenerators.size())
 | 
	
		
			
				|  |  | +  for (i = 0; i < this->LocalGenerators.size(); ++i)
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  |      cmLocalUnixMakefileGenerator3 *lg = 
 | 
	
		
			
				|  |  | -      static_cast<cmLocalUnixMakefileGenerator3 *>(this->LocalGenerators[0]);
 | 
	
		
			
				|  |  | -    lg->WriteProgressVariables(total,current);
 | 
	
		
			
				|  |  | +      static_cast<cmLocalUnixMakefileGenerator3 *>(this->LocalGenerators[i]);
 | 
	
		
			
				|  |  | +    lg->WriteAllProgressVariable();
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |    
 | 
	
		
			
				|  |  |    // write the main makefile
 | 
	
	
		
			
				|  | @@ -935,7 +940,7 @@ GetNumberOfProgressActionsInAll(cmLocalUnixMakefileGenerator3 *lg)
 | 
	
		
			
				|  |  |            if (t->second.IsInAll())
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  |              std::vector<int> &progFiles = lg3->ProgressFiles[t->first];
 | 
	
		
			
				|  |  | -            result += progFiles.size();
 | 
	
		
			
				|  |  | +            result += static_cast<unsigned long>(progFiles.size());
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |            }
 | 
	
		
			
				|  |  |          }
 | 
	
	
		
			
				|  | @@ -943,8 +948,61 @@ GetNumberOfProgressActionsInAll(cmLocalUnixMakefileGenerator3 *lg)
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |    else
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  | -    // TODO: would be nice to report progress for subdir "all" targets
 | 
	
		
			
				|  |  | -    return 0;
 | 
	
		
			
				|  |  | +    std::deque<cmLocalUnixMakefileGenerator3 *> lg3Stack;
 | 
	
		
			
				|  |  | +    lg3Stack.push_back(lg);
 | 
	
		
			
				|  |  | +    std::vector<cmStdString> targetsInAll;
 | 
	
		
			
				|  |  | +    std::set<cmTarget *> targets;
 | 
	
		
			
				|  |  | +    while (lg3Stack.size())
 | 
	
		
			
				|  |  | +      {
 | 
	
		
			
				|  |  | +      cmLocalUnixMakefileGenerator3 *lg3 = lg3Stack.front();
 | 
	
		
			
				|  |  | +      lg3Stack.pop_front();
 | 
	
		
			
				|  |  | +      for(cmTargets::iterator l = lg3->GetMakefile()->GetTargets().begin();
 | 
	
		
			
				|  |  | +          l != lg3->GetMakefile()->GetTargets().end(); ++l)
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +        if((l->second.GetType() == cmTarget::EXECUTABLE) ||
 | 
	
		
			
				|  |  | +           (l->second.GetType() == cmTarget::STATIC_LIBRARY) ||
 | 
	
		
			
				|  |  | +           (l->second.GetType() == cmTarget::SHARED_LIBRARY) ||
 | 
	
		
			
				|  |  | +           (l->second.GetType() == cmTarget::MODULE_LIBRARY) ||
 | 
	
		
			
				|  |  | +           (l->second.GetType() == cmTarget::UTILITY))
 | 
	
		
			
				|  |  | +          {
 | 
	
		
			
				|  |  | +          // Add this to the list of depends rules in this directory.
 | 
	
		
			
				|  |  | +          if (l->second.IsInAll() && 
 | 
	
		
			
				|  |  | +              targets.find(&l->second) == targets.end())
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +            std::deque<cmTarget *> activeTgts;
 | 
	
		
			
				|  |  | +            activeTgts.push_back(&(l->second));
 | 
	
		
			
				|  |  | +            // trace depth of target dependencies
 | 
	
		
			
				|  |  | +            while (activeTgts.size())
 | 
	
		
			
				|  |  | +              {
 | 
	
		
			
				|  |  | +              if (targets.find(activeTgts.front()) == targets.end())
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                targets.insert(activeTgts.front());
 | 
	
		
			
				|  |  | +                cmLocalUnixMakefileGenerator3 *lg4 = 
 | 
	
		
			
				|  |  | +                  static_cast<cmLocalUnixMakefileGenerator3 *>
 | 
	
		
			
				|  |  | +                  (activeTgts.front()->GetMakefile()->GetLocalGenerator());
 | 
	
		
			
				|  |  | +                std::vector<int> &progFiles2 = 
 | 
	
		
			
				|  |  | +                  lg4->ProgressFiles[activeTgts.front()->GetName()];
 | 
	
		
			
				|  |  | +                result += progFiles2.size();
 | 
	
		
			
				|  |  | +                std::vector<cmTarget *> deps2 = 
 | 
	
		
			
				|  |  | +                  this->GetTargetDepends(*activeTgts.front());
 | 
	
		
			
				|  |  | +                activeTgts.insert(activeTgts.end(),deps2.begin(),deps2.end());
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +              activeTgts.pop_front();
 | 
	
		
			
				|  |  | +              }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      
 | 
	
		
			
				|  |  | +      // The directory-level rule depends on the directory-level
 | 
	
		
			
				|  |  | +      // rules of the subdirectories.
 | 
	
		
			
				|  |  | +      for(std::vector<cmLocalGenerator*>::iterator sdi = 
 | 
	
		
			
				|  |  | +            lg3->GetChildren().begin(); sdi != lg3->GetChildren().end(); ++sdi)
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +        cmLocalUnixMakefileGenerator3* slg =
 | 
	
		
			
				|  |  | +          static_cast<cmLocalUnixMakefileGenerator3*>(*sdi);
 | 
	
		
			
				|  |  | +        lg3Stack.push_back(slg);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |    return result;
 | 
	
		
			
				|  |  |  }
 |