diff --git a/Source/cmLocalUnixMakefileGenerator.cxx b/Source/cmLocalUnixMakefileGenerator.cxx index 55d87ebc71..f71a464e87 100644 --- a/Source/cmLocalUnixMakefileGenerator.cxx +++ b/Source/cmLocalUnixMakefileGenerator.cxx @@ -91,6 +91,31 @@ void cmLocalUnixMakefileGenerator::Generate(bool fromTheTop) this->OutputMakefile(dest.c_str(), !fromTheTop); } +void +cmLocalUnixMakefileGenerator::AddDependenciesToSourceFile(cmDependInformation const *info, + cmSourceFile *i, + std::set *visited) +{ + // add info to the visited set + visited->insert(info); + + // add this dependency and the recurse + if(info->m_FullPath != "") + { + // now recurse with info's dependencies + for(cmDependInformation::DependencySet::const_iterator d = + info->m_DependencySet.begin(); + d != info->m_DependencySet.end(); ++d) + { + if (visited->find(*d) == visited->end()) + { + i->GetDepends().push_back((*d)->m_FullPath); + this->AddDependenciesToSourceFile(*d,i,visited); + } + } + } +} + void cmLocalUnixMakefileGenerator::ProcessDepends(const cmMakeDepend &md) { // Now create cmDependInformation objects for files in the directory @@ -109,21 +134,14 @@ void cmLocalUnixMakefileGenerator::ProcessDepends(const cmMakeDepend &md) // Delete any hints from the source file's dependencies. (*i)->GetDepends().erase((*i)->GetDepends().begin(), (*i)->GetDepends().end()); - + std::cerr << "get depends for " << (*i)->GetFullPath() << "\n"; + // Now add the real dependencies for the file. if (info) { - for(cmDependInformation::DependencySet::const_iterator d = - info->m_DependencySet.begin(); - d != info->m_DependencySet.end(); ++d) - { - // Make sure the full path is given. If not, the dependency was - // not found. - if((*d)->m_FullPath != "") - { - (*i)->GetDepends().push_back((*d)->m_FullPath); - } - } + // create visited set + std::set visited; + this->AddDependenciesToSourceFile(info,*i, &visited); } } } diff --git a/Source/cmLocalUnixMakefileGenerator.h b/Source/cmLocalUnixMakefileGenerator.h index c2604f0da0..c8fcd18028 100644 --- a/Source/cmLocalUnixMakefileGenerator.h +++ b/Source/cmLocalUnixMakefileGenerator.h @@ -19,6 +19,7 @@ #include "cmLocalGenerator.h" +class cmDependInformation; class cmMakeDepend; class cmTarget; class cmSourceFile; @@ -77,6 +78,9 @@ public: void SetMakefileVariableSize(int s) { m_MakefileVariableSize = s; } protected: + void AddDependenciesToSourceFile(cmDependInformation const*info, + cmSourceFile *i, + std::set *visited); virtual const char* GetSafeDefinition(const char*); virtual void ProcessDepends(const cmMakeDepend &md); virtual void OutputMakefile(const char* file, bool withDepends); diff --git a/Source/cmMakeDepend.cxx b/Source/cmMakeDepend.cxx index a5ba60b9e5..61354b5d36 100644 --- a/Source/cmMakeDepend.cxx +++ b/Source/cmMakeDepend.cxx @@ -24,12 +24,6 @@ void cmDependInformation::AddDependencies(cmDependInformation* info) if(this != info) { m_DependencySet.insert(info); - for (cmDependInformation::DependencySet::const_iterator - d = info->m_DependencySet.begin(); - d != info->m_DependencySet.end(); ++d) - { - m_DependencySet.insert(*d); - } } }