diff options
-rw-r--r-- | Source/cmGlobalUnixMakefileGenerator3.cxx | 115 | ||||
-rw-r--r-- | Source/cmGlobalUnixMakefileGenerator3.h | 24 | ||||
-rw-r--r-- | Source/cmLocalUnixMakefileGenerator3.cxx | 83 | ||||
-rw-r--r-- | Source/cmLocalUnixMakefileGenerator3.h | 11 | ||||
-rw-r--r-- | Source/cmMakefileTargetGenerator.cxx | 39 | ||||
-rw-r--r-- | Source/cmMakefileTargetGenerator.h | 8 |
6 files changed, 104 insertions, 176 deletions
diff --git a/Source/cmGlobalUnixMakefileGenerator3.cxx b/Source/cmGlobalUnixMakefileGenerator3.cxx index 2b2f31a..6538936 100644 --- a/Source/cmGlobalUnixMakefileGenerator3.cxx +++ b/Source/cmGlobalUnixMakefileGenerator3.cxx @@ -17,6 +17,7 @@ #include "cmGlobalUnixMakefileGenerator3.h" #include "cmLocalUnixMakefileGenerator3.h" +#include "cmMakefileTargetGenerator.h" #include "cmMakefile.h" #include "cmake.h" #include "cmGeneratedFileStream.h" @@ -150,13 +151,11 @@ void cmGlobalUnixMakefileGenerator3::Generate() this->cmGlobalGenerator::Generate(); // initialize progress - unsigned int i; unsigned long total = 0; - for (i = 0; i < this->LocalGenerators.size(); ++i) + for(ProgressMapType::const_iterator pmi = this->ProgressMap.begin(); + pmi != this->ProgressMap.end(); ++pmi) { - cmLocalUnixMakefileGenerator3 *lg = - static_cast<cmLocalUnixMakefileGenerator3 *>(this->LocalGenerators[i]); - total += lg->GetNumberOfProgressActions(); + total += pmi->second.NumberOfActions; } // write each target's progress.make this loop is done twice. Bascially the @@ -167,17 +166,21 @@ void cmGlobalUnixMakefileGenerator3::Generate() // well. This is because the all targets require more information that is // computed in the first loop. unsigned long current = 0; - for (i = 0; i < this->LocalGenerators.size(); ++i) + for(ProgressMapType::iterator pmi = this->ProgressMap.begin(); + pmi != this->ProgressMap.end(); ++pmi) { - cmLocalUnixMakefileGenerator3 *lg = - static_cast<cmLocalUnixMakefileGenerator3 *>(this->LocalGenerators[i]); - lg->WriteProgressVariables(total,current); + pmi->second.WriteProgressVariables(total, current); } - for (i = 0; i < this->LocalGenerators.size(); ++i) + for(unsigned int i = 0; i < this->LocalGenerators.size(); ++i) { cmLocalUnixMakefileGenerator3 *lg = static_cast<cmLocalUnixMakefileGenerator3 *>(this->LocalGenerators[i]); - lg->WriteAllProgressVariable(); + std::string markFileName = lg->GetMakefile()->GetStartOutputDirectory(); + markFileName += "/"; + markFileName += cmake::GetCMakeFilesDirectory(); + markFileName += "/progress.marks"; + cmGeneratedFileStream markFile(markFileName.c_str()); + markFile << this->CountProgressMarksInAll(lg) << "\n"; } // write the main makefile @@ -752,7 +755,7 @@ cmGlobalUnixMakefileGenerator3 cmLocalGenerator::FULL, cmLocalGenerator::SHELL); progCmd << " "; - std::vector<int> &progFiles = lg->ProgressFiles[t->first]; + std::vector<int> &progFiles = this->ProgressMap[t->first].Marks; for (std::vector<int>::iterator i = progFiles.begin(); i != progFiles.end(); ++i) { @@ -794,8 +797,7 @@ cmGlobalUnixMakefileGenerator3 // std::set<cmTarget *> emitted; progCmd << " " - << this->GetTargetTotalNumberOfActions(t->second, - emitted); + << this->CountProgressMarksInTarget(&t->second, emitted); commands.push_back(progCmd.str()); } std::string tmp = cmake::GetCMakeFilesDirectoryPostSlash(); @@ -868,46 +870,77 @@ cmGlobalUnixMakefileGenerator3 } //---------------------------------------------------------------------------- -int cmGlobalUnixMakefileGenerator3 -::GetTargetTotalNumberOfActions(cmTarget &target, - std::set<cmTarget *> &emitted) +size_t +cmGlobalUnixMakefileGenerator3 +::CountProgressMarksInTarget(cmTarget* target, + std::set<cmTarget*>& emitted) { - // do not double count - int result = 0; - - if(emitted.insert(&target).second) + size_t count = 0; + if(emitted.insert(target).second) { - cmLocalUnixMakefileGenerator3 *lg = - static_cast<cmLocalUnixMakefileGenerator3 *> - (target.GetMakefile()->GetLocalGenerator()); - result = static_cast<int>(lg->ProgressFiles[target.GetName()].size()); - - TargetDependSet & depends = this->GetTargetDirectDepends(target); - - TargetDependSet::iterator i; - for (i = depends.begin(); i != depends.end(); ++i) + count = this->ProgressMap[target->GetName()].Marks.size(); + TargetDependSet const& depends = this->GetTargetDirectDepends(*target); + for(TargetDependSet::const_iterator di = depends.begin(); + di != depends.end(); ++di) { - result += this->GetTargetTotalNumberOfActions(**i, emitted); + count += this->CountProgressMarksInTarget(*di, emitted); } } - - return result; + return count; } -unsigned long cmGlobalUnixMakefileGenerator3 -::GetNumberOfProgressActionsInAll(cmLocalUnixMakefileGenerator3 *lg) +//---------------------------------------------------------------------------- +size_t +cmGlobalUnixMakefileGenerator3 +::CountProgressMarksInAll(cmLocalUnixMakefileGenerator3* lg) { - unsigned long result = 0; - std::set<cmTarget *> emitted; - std::set<cmTarget *>& targets = this->LocalGeneratorToTargetMap[lg]; - for(std::set<cmTarget *>::iterator t = targets.begin(); + size_t count = 0; + std::set<cmTarget*> emitted; + std::set<cmTarget*> const& targets = this->LocalGeneratorToTargetMap[lg]; + for(std::set<cmTarget*>::const_iterator t = targets.begin(); t != targets.end(); ++t) { - result += this->GetTargetTotalNumberOfActions(**t,emitted); + count += this->CountProgressMarksInTarget(*t, emitted); } - return result; + return count; } +//---------------------------------------------------------------------------- +void +cmGlobalUnixMakefileGenerator3::RecordTargetProgress( + cmMakefileTargetGenerator* tg) +{ + TargetProgress& tp = this->ProgressMap[tg->GetTarget()->GetName()]; + tp.NumberOfActions = tg->GetNumberOfProgressActions(); + tp.VariableFile = tg->GetProgressFileNameFull(); +} + +//---------------------------------------------------------------------------- +void +cmGlobalUnixMakefileGenerator3::TargetProgress +::WriteProgressVariables(unsigned long total, unsigned long ¤t) +{ + cmGeneratedFileStream fout(this->VariableFile.c_str()); + for(unsigned long i = 1; i <= this->NumberOfActions; ++i) + { + fout << "CMAKE_PROGRESS_" << i << " = "; + if (total <= 100) + { + unsigned long num = i + current; + fout << num; + this->Marks.push_back(num); + } + else if (((i+current)*100)/total > ((i-1+current)*100)/total) + { + unsigned long num = ((i+current)*100)/total; + fout << num; + this->Marks.push_back(num); + } + fout << "\n"; + } + fout << "\n"; + current += this->NumberOfActions; +} //---------------------------------------------------------------------------- void diff --git a/Source/cmGlobalUnixMakefileGenerator3.h b/Source/cmGlobalUnixMakefileGenerator3.h index 5cfe26f..d21b3e8 100644 --- a/Source/cmGlobalUnixMakefileGenerator3.h +++ b/Source/cmGlobalUnixMakefileGenerator3.h @@ -20,6 +20,7 @@ #include "cmGlobalGenerator.h" class cmGeneratedFileStream; +class cmMakefileTargetGenerator; class cmLocalUnixMakefileGenerator3; /** \class cmGlobalUnixMakefileGenerator3 @@ -113,11 +114,8 @@ public: const char *targetName, const char* config, bool ignoreErrors, bool fast); - // returns some progress informaiton - int GetTargetTotalNumberOfActions(cmTarget & target, - std::set<cmTarget *> &emitted); - unsigned long GetNumberOfProgressActionsInAll - (cmLocalUnixMakefileGenerator3 *lg); + /** Record per-target progress information. */ + void RecordTargetProgress(cmMakefileTargetGenerator* tg); /** * If true, the CMake variable CMAKE_VERBOSE_MAKEFILES doesn't have effect @@ -177,6 +175,22 @@ protected: std::string EmptyRuleHackCommand; bool ForceVerboseMakefiles; + + // Store per-target progress counters. + struct TargetProgress + { + TargetProgress(): NumberOfActions(0) {} + unsigned long NumberOfActions; + std::string VariableFile; + std::vector<int> Marks; + void WriteProgressVariables(unsigned long total, unsigned long& current); + }; + typedef std::map<cmStdString, TargetProgress> ProgressMapType; + ProgressMapType ProgressMap; + + size_t CountProgressMarksInTarget(cmTarget* target, + std::set<cmTarget*>& emitted); + size_t CountProgressMarksInAll(cmLocalUnixMakefileGenerator3* lg); }; #endif diff --git a/Source/cmLocalUnixMakefileGenerator3.cxx b/Source/cmLocalUnixMakefileGenerator3.cxx index c37a80b..b5779bc 100644 --- a/Source/cmLocalUnixMakefileGenerator3.cxx +++ b/Source/cmLocalUnixMakefileGenerator3.cxx @@ -35,6 +35,8 @@ # include <cmsys/Terminal.h> #endif +#include <cmsys/auto_ptr.hxx> + #include <memory> // auto_ptr #include <queue> @@ -126,14 +128,16 @@ void cmLocalUnixMakefileGenerator3::Generate() // Generate the rule files for each target. cmTargets& targets = this->Makefile->GetTargets(); + cmGlobalUnixMakefileGenerator3* gg = + static_cast<cmGlobalUnixMakefileGenerator3*>(this->GlobalGenerator); for(cmTargets::iterator t = targets.begin(); t != targets.end(); ++t) { - cmMakefileTargetGenerator *tg = - cmMakefileTargetGenerator::New(&(t->second)); - if (tg) + cmsys::auto_ptr<cmMakefileTargetGenerator> tg( + cmMakefileTargetGenerator::New(&(t->second))); + if (tg.get()) { - this->TargetGenerators.push_back(tg); tg->WriteRuleFiles(); + gg->RecordTargetProgress(tg.get()); } } @@ -145,75 +149,6 @@ void cmLocalUnixMakefileGenerator3::Generate() } //---------------------------------------------------------------------------- -// return info about progress actions -unsigned long cmLocalUnixMakefileGenerator3::GetNumberOfProgressActions() -{ - unsigned long result = 0; - - for (std::vector<cmMakefileTargetGenerator *>::iterator mtgIter = - this->TargetGenerators.begin(); - mtgIter != this->TargetGenerators.end(); ++mtgIter) - { - result += (*mtgIter)->GetNumberOfProgressActions(); - } - return result; -} - -//---------------------------------------------------------------------------- -// return info about progress actions -unsigned long cmLocalUnixMakefileGenerator3 -::GetNumberOfProgressActionsForTarget(const char *name) -{ - for (std::vector<cmMakefileTargetGenerator *>::iterator mtgIter = - this->TargetGenerators.begin(); - mtgIter != this->TargetGenerators.end(); ++mtgIter) - { - if (!strcmp(name,(*mtgIter)->GetTarget()->GetName())) - { - return (*mtgIter)->GetNumberOfProgressActions(); - } - } - return 0; -} - - -//---------------------------------------------------------------------------- -// writes the progreess variables and also closes out the targets -void cmLocalUnixMakefileGenerator3 -::WriteProgressVariables(unsigned long total, - unsigned long ¤t) -{ - // delete the makefile target generator objects - for (std::vector<cmMakefileTargetGenerator *>::iterator mtgIter = - this->TargetGenerators.begin(); - mtgIter != this->TargetGenerators.end(); ++mtgIter) - { - (*mtgIter)->WriteProgressVariables(total,current); - delete *mtgIter; - } - this->TargetGenerators.clear(); -} - -void cmLocalUnixMakefileGenerator3::WriteAllProgressVariable() -{ - // write the top level progress for the all target - std::string progressFile = cmake::GetCMakeFilesDirectory(); - progressFile += "/progress.make"; - std::string progressFileNameFull = - this->ConvertToFullPath(progressFile.c_str()); - cmGeneratedFileStream ruleFileStream(progressFileNameFull.c_str()); - if(!ruleFileStream) - { - return; - } - - cmGlobalUnixMakefileGenerator3 *gg = - static_cast<cmGlobalUnixMakefileGenerator3*>(this->GlobalGenerator); - - ruleFileStream << gg->GetNumberOfProgressActionsInAll(this) << "\n"; -} - -//---------------------------------------------------------------------------- void cmLocalUnixMakefileGenerator3::WriteLocalMakefile() { // generate the includes @@ -1717,7 +1652,7 @@ void cmLocalUnixMakefileGenerator3 cmLocalGenerator::SHELL); std::string progressFile = cmake::GetCMakeFilesDirectory(); - progressFile += "/progress.make"; + progressFile += "/progress.marks"; std::string progressFileNameFull = this->ConvertToFullPath(progressFile.c_str()); progCmd << " " << this->Convert(progressFileNameFull.c_str(), diff --git a/Source/cmLocalUnixMakefileGenerator3.h b/Source/cmLocalUnixMakefileGenerator3.h index 15fafa5..0bb0314 100644 --- a/Source/cmLocalUnixMakefileGenerator3.h +++ b/Source/cmLocalUnixMakefileGenerator3.h @@ -66,10 +66,6 @@ public: // write the main variables used by the makefiles void WriteMakeVariables(std::ostream& makefileStream); - // write the progress variables used by the makefiles - void WriteProgressVariables(unsigned long total, unsigned long ¤t); - void WriteAllProgressVariable(); - /** * If true, then explicitly pass MAKEFLAGS on the make all target for makes * that do not use environment variables. @@ -256,10 +252,6 @@ public: std::vector<cmStdString> const& GetLocalHelp() { return this->LocalHelp; } - // return info about progress actions - unsigned long GetNumberOfProgressActions(); - unsigned long GetNumberOfProgressActionsForTarget(const char *); - /** Get whether to create rules to generate preprocessed and assembly sources. This could be converted to a variable lookup later. */ @@ -340,8 +332,6 @@ protected: const std::vector<std::string>& files, cmTarget& target, const char* filename =0); - std::map<cmStdString, std::vector<int> > ProgressFiles; - // Helper methods for dependeny updates. bool ScanDependencies(const char* targetDir); void CheckMultipleOutputs(bool verbose); @@ -390,7 +380,6 @@ private: std::vector<cmStdString> LocalHelp; /* does the work for each target */ - std::vector<cmMakefileTargetGenerator *> TargetGenerators; std::map<cmStdString, cmStdString> MakeVariableMap; std::map<cmStdString, cmStdString> ShortMakeVariableMap; }; diff --git a/Source/cmMakefileTargetGenerator.cxx b/Source/cmMakefileTargetGenerator.cxx index 4b9c724..f38874d 100644 --- a/Source/cmMakefileTargetGenerator.cxx +++ b/Source/cmMakefileTargetGenerator.cxx @@ -96,8 +96,6 @@ void cmMakefileTargetGenerator::CreateRuleFile() this->BuildFileNameFull += "/build.make"; // Construct the rule file name. - this->ProgressFileName = this->TargetBuildDirectory; - this->ProgressFileName += "/progress.make"; this->ProgressFileNameFull = this->TargetBuildDirectoryFull; this->ProgressFileNameFull += "/progress.make"; @@ -1535,43 +1533,6 @@ void cmMakefileTargetGenerator::RemoveForbiddenFlags(const char* flagVar, } } -void cmMakefileTargetGenerator::WriteProgressVariables(unsigned long total, - unsigned long ¤t) -{ - cmGeneratedFileStream *progressFileStream = - new cmGeneratedFileStream(this->ProgressFileNameFull.c_str()); - if(!progressFileStream) - { - return; - } - - unsigned long num; - unsigned long i; - for (i = 1; i <= this->NumberOfProgressActions; ++i) - { - *progressFileStream - << "CMAKE_PROGRESS_" << i << " = "; - if (total <= 100) - { - num = i + current; - *progressFileStream << num; - this->LocalGenerator->ProgressFiles[this->Target->GetName()] - .push_back(num); - } - else if (((i+current)*100)/total > ((i-1+current)*100)/total) - { - num = ((i+current)*100)/total; - *progressFileStream << num; - this->LocalGenerator->ProgressFiles[this->Target->GetName()] - .push_back(num); - } - *progressFileStream << "\n"; - } - *progressFileStream << "\n"; - current += this->NumberOfProgressActions; - delete progressFileStream; -} - //---------------------------------------------------------------------------- void cmMakefileTargetGenerator diff --git a/Source/cmMakefileTargetGenerator.h b/Source/cmMakefileTargetGenerator.h index 0c0d21d..815dc8d 100644 --- a/Source/cmMakefileTargetGenerator.h +++ b/Source/cmMakefileTargetGenerator.h @@ -47,14 +47,11 @@ public: with this target */ virtual void WriteRuleFiles() = 0; - /* the main entry point for this class. Writes the Makefiles associated - with this target */ - virtual void WriteProgressVariables(unsigned long total, - unsigned long ¤t); - /* return the number of actions that have progress reporting on them */ virtual unsigned long GetNumberOfProgressActions() { return this->NumberOfProgressActions;} + std::string GetProgressFileNameFull() + { return this->ProgressFileNameFull; } cmTarget* GetTarget() { return this->Target;} protected: @@ -167,7 +164,6 @@ protected: std::string BuildFileNameFull; // the full path to the progress file - std::string ProgressFileName; std::string ProgressFileNameFull; unsigned long NumberOfProgressActions; bool NoRuleMessages; |