From af486c5935a432683052d019da364aef97af745f Mon Sep 17 00:00:00 2001 From: marha Date: Thu, 2 Sep 2010 11:59:00 +0000 Subject: Autodep optimisation --- tools/mhmake/src/mhmakefileparser.cpp | 69 ++++++++++++++++++++--------------- 1 file changed, 40 insertions(+), 29 deletions(-) (limited to 'tools/mhmake/src/mhmakefileparser.cpp') diff --git a/tools/mhmake/src/mhmakefileparser.cpp b/tools/mhmake/src/mhmakefileparser.cpp index e87f46887..725312b61 100644 --- a/tools/mhmake/src/mhmakefileparser.cpp +++ b/tools/mhmake/src/mhmakefileparser.cpp @@ -484,7 +484,7 @@ void mhmakefileparser::AddRule() } /////////////////////////////////////////////////////////////////////////////// -void mhmakefileparser::GetAutoDeps(const refptr &FirstDep,set< refptr > &Autodeps) +void mhmakefileparser::GetAutoDeps(const refptr &FirstDep, deps_t &Autodeps) { /* Here we have to scan only c/c++ headers so skip certain extensions */ const char *pFullName=FirstDep->GetFullFileName().c_str(); @@ -579,11 +579,11 @@ void mhmakefileparser::GetAutoDeps(const refptr &FirstDep,set< refptr< mh_time_t Date=BuildTarget(pInclude); if (Date.DoesExist()) // Try to build the target, and add it if it exists after building { - set< refptr >::iterator pFind=Autodeps.find(pInclude); + deps_t::const_iterator pFind=Autodeps.find(pInclude); if (pFind==Autodeps.end()) { Autodeps.insert(pInclude); - GetAutoDeps(pInclude,Autodeps); + GetAutoDepsIfNeeded(pInclude,pInclude); } } } @@ -595,11 +595,11 @@ void mhmakefileparser::GetAutoDeps(const refptr &FirstDep,set< refptr< mh_time_t Date=BuildTarget(pInclude); if (Date.DoesExist()) // Try to build the target, and add it if it exists after building { - set< refptr >::iterator pFind=Autodeps.find(pInclude); + deps_t::const_iterator pFind=Autodeps.find(pInclude); if (pFind==Autodeps.end()) { Autodeps.insert(pInclude); - GetAutoDeps(pInclude,Autodeps); + GetAutoDepsIfNeeded(pInclude,pInclude); } break; } @@ -617,12 +617,30 @@ void mhmakefileparser::GetAutoDeps(const refptr &FirstDep,set< refptr< } /////////////////////////////////////////////////////////////////////////////// + +void mhmakefileparser::GetAutoDepsIfNeeded(const refptr &Target, const refptr&FirstDep) +{ + autodeps_entry_t &Autodeps=m_AutoDeps[Target]; + if (!Autodeps.first) + { + Autodeps.first=true; + /* We are going to rescan, so throw away the old. */ + Autodeps.second.clear(); + GetAutoDeps(FirstDep,Autodeps.second); + // Now add these dependencies also to the rules + deps_t::iterator It=Autodeps.second.begin(); + while (It!=Autodeps.second.end()) + { + Target->AddDep(*It); + It++; + } + } +} + +/////////////////////////////////////////////////////////////////////////////// + void mhmakefileparser::UpdateAutomaticDependencies(const refptr &Target) { - const char *pName=Target->GetFullFileName().c_str(); - const char *pExt=strrchr(pName,'.'); - if (!pExt) - return; if (Target->IsAutoDepExtention()) { // we have to search for the include files in the first dependency of Target @@ -630,17 +648,7 @@ void mhmakefileparser::UpdateAutomaticDependencies(const refptr &Targe if (!Deps.size()) return; // There is no first dep refptr FirstDep=Deps[0]; - - set< refptr > &Autodeps=m_AutoDeps[Target]; - Autodeps.clear(); // We are going to scan again, so clear the list - GetAutoDeps(FirstDep,Autodeps); - // Now add these dependencies also to the rules - set< refptr >::iterator It=Autodeps.begin(); - while (It!=Autodeps.end()) - { - Target->AddDep(*It); - It++; - } + GetAutoDepsIfNeeded(Target,FirstDep); SetAutoDepsDirty(); } } @@ -733,14 +741,14 @@ void mhmakefileparser::LoadAutoDepsFile(refptr &DepFile) while (FileName[0]) { refptr Target=GetFileInfo(FileName,m_MakeDir); - set< refptr > &Autodeps=m_AutoDeps[Target]; + autodeps_entry_t &Autodeps=m_AutoDeps[Target]; ReadStr(pIn,FileName); while (FileName[0]) { if (!g_ForceAutoDepRescan) /* If we are forcing the autodepscan we do not have to load the dependencies. */ { refptr Dep=GetFileInfo(FileName,m_MakeDir); - Autodeps.insert(Dep); + Autodeps.second.insert(Dep); Target->AddDep(Dep); } ReadStr(pIn,FileName); @@ -833,17 +841,20 @@ void mhmakefileparser::SaveAutoDepsFile() fwrite(&Md5_32,sizeof(Md5_32),1,pOut); fprintf(pOut,"%s\n",m_Variables[USED_ENVVARS].c_str()); - map< refptr, set< refptr > >::const_iterator It=m_AutoDeps.begin(); + autodeps_t::const_iterator It=m_AutoDeps.begin(); while (It!=m_AutoDeps.end()) { - fprintf(pOut,"%s\n",It->first->GetFullFileName().c_str()); - set< refptr >::const_iterator DepIt=It->second.begin(); - while (DepIt!=It->second.end()) + if (!It->second.second.empty()) { - fprintf(pOut,"%s\n",(*DepIt)->GetFullFileName().c_str()); - DepIt++; + fprintf(pOut,"%s\n",It->first->GetFullFileName().c_str()); + deps_t::const_iterator DepIt=It->second.second.begin(); + while (DepIt!=It->second.second.end()) + { + fprintf(pOut,"%s\n",(*DepIt)->GetFullFileName().c_str()); + DepIt++; + } + fprintf(pOut,"\n"); } - fprintf(pOut,"\n"); It++; } /* Now save the Md5 strings */ -- cgit v1.2.3