diff options
-rw-r--r-- | Source/cmMakeDepend.cxx | 112 | ||||
-rw-r--r-- | Source/cmMakeDepend.h | 10 |
2 files changed, 96 insertions, 26 deletions
diff --git a/Source/cmMakeDepend.cxx b/Source/cmMakeDepend.cxx index 3150d8c..4280442 100644 --- a/Source/cmMakeDepend.cxx +++ b/Source/cmMakeDepend.cxx @@ -114,8 +114,7 @@ void cmMakeDepend::DoDepends() } } -// This function actually reads the file -// and scans it for #include directives + void cmMakeDepend::Depend(cmDependInformation* info) { const char* path = info->m_FullPath.c_str(); @@ -125,12 +124,66 @@ void cmMakeDepend::Depend(cmDependInformation* info) return; } - std::ifstream fin(path); + // If the file exists, use it to find dependency information. + if(cmSystemTools::FileExists(path)) + { + // The cmClassFile may have had hints for dependencies. Delete any that + // exist since we can find the dependencies for real. + if(info->m_ClassFileIndex != -1) + { + cmClassFile& cFile = m_Makefile->m_Classes[info->m_ClassFileIndex]; + cFile.m_Depends.erase(cFile.m_Depends.begin(), cFile.m_Depends.end()); + } + + // Use the real file to find its dependencies. + this->DependWalk(info, path); + info->m_DependDone = true; + return; + } + + // The file doesn't exist. See if the cmClassFile for it has any files + // specified as dependency hints. + if(info->m_ClassFileIndex != -1) + { + // Get the cmClassFile corresponding to this. + cmClassFile& cFile = m_Makefile->m_Classes[info->m_ClassFileIndex]; + // See if there are any hints for finding dependencies for the missing + // file. + if(!cFile.m_Depends.empty()) + { + // Initial dependencies have been given. Use them to begin the + // recursion. + for(std::vector<std::string>::iterator file = + cFile.m_Depends.begin(); file != cFile.m_Depends.end(); ++file) + { + this->AddDependency(info, file->c_str()); + } + + // Erase the dependency hints from the cmClassFile. They will be + // put in again as real dependencies later. + cFile.m_Depends.erase(cFile.m_Depends.begin(), cFile.m_Depends.end()); + + // Found dependency information. We are done. + return; + } + } + + // Couldn't find any dependency information. + cmSystemTools::Error("error cannot find dependencies for ", path); +} + + +// This function actually reads the file specified and scans it for +// #include directives +void cmMakeDepend::DependWalk(cmDependInformation* info, const char* file) +{ + std::ifstream fin(file); if(!fin) { - cmSystemTools::Error("error can not open ", info->m_FullPath.c_str()); + cmSystemTools::Error("error can not open ", file); return; } + char line[255]; while(!fin.eof() && !fin.fail()) { @@ -171,33 +224,40 @@ void cmMakeDepend::Depend(cmDependInformation* info) std::string message = "Skipping "; message += includeFile; message += " for file "; - message += path; + message += file; cmSystemTools::Error(message.c_str(), 0); } continue; } - // find the index of the include file in the - // m_DependInformation array, if it is not - // there then FindInformation will create it - int index = this->FindInformation(includeFile.c_str()); - // add the index to the depends of the current - // depend info object - info->m_Indices.push_back(index); - // Get the depend information object for the include file - cmDependInformation* dependInfo = m_DependInformation[index]; - // if the depends are not known for an include file, then compute them - // recursively - if(!dependInfo->m_DependDone) - { - // stop the recursion here - dependInfo->m_DependDone = true; - this->Depend(dependInfo); - } - // add the depends of the included file to the includer - info->MergeInfo(dependInfo); + + // Add this file and all its dependencies. + this->AddDependency(info, includeFile.c_str()); } } - info->m_DependDone = true; +} + + +void cmMakeDepend::AddDependency(cmDependInformation* info, const char* file) +{ + // find the index of the include file in the + // m_DependInformation array, if it is not + // there then FindInformation will create it + int index = this->FindInformation(file); + // add the index to the depends of the current + // depend info object + info->m_Indices.push_back(index); + // Get the depend information object for the include file + cmDependInformation* dependInfo = m_DependInformation[index]; + // if the depends are not known for an include file, then compute them + // recursively + if(!dependInfo->m_DependDone) + { + // stop the recursion here + dependInfo->m_DependDone = true; + this->Depend(dependInfo); + } + // add the depends of the included file to the includer + info->MergeInfo(dependInfo); } @@ -271,7 +331,7 @@ std::string cmMakeDepend::FullPath(const char* fname) return path; } } - cmSystemTools::Error("Depend: File not found ", fname); + return std::string(fname); } diff --git a/Source/cmMakeDepend.h b/Source/cmMakeDepend.h index 041fc18..5965889 100644 --- a/Source/cmMakeDepend.h +++ b/Source/cmMakeDepend.h @@ -131,6 +131,16 @@ private: */ void Depend(cmDependInformation* info); + /** + * Compute the depend information for this class. + */ + void DependWalk(cmDependInformation* info, const char* file); + + /** + * Add a dependency. Possibly walk it for more dependencies. + */ + void AddDependency(cmDependInformation* info, const char* file); + /** * Find the full path name for the given file name. * This uses the include directories. |