ENH: Added support for finding dependencies for files that don't exist. Dependency recursion begins with hints provided in the cmClassFile for a file if it doesn't exist.
This commit is contained in:
parent
353f6c3261
commit
02fe911803
|
@ -114,8 +114,7 @@ void cmMakeDepend::DoDepends()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// This function actually reads the file
|
|
||||||
// and scans it for #include directives
|
|
||||||
void cmMakeDepend::Depend(cmDependInformation* info)
|
void cmMakeDepend::Depend(cmDependInformation* info)
|
||||||
{
|
{
|
||||||
const char* path = info->m_FullPath.c_str();
|
const char* path = info->m_FullPath.c_str();
|
||||||
|
@ -125,12 +124,66 @@ void cmMakeDepend::Depend(cmDependInformation* info)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::ifstream fin(path);
|
// If the file exists, use it to find dependency information.
|
||||||
if(!fin)
|
if(cmSystemTools::FileExists(path))
|
||||||
{
|
{
|
||||||
cmSystemTools::Error("error can not open ", info->m_FullPath.c_str());
|
// 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;
|
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 ", file);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
char line[255];
|
char line[255];
|
||||||
while(!fin.eof() && !fin.fail())
|
while(!fin.eof() && !fin.fail())
|
||||||
{
|
{
|
||||||
|
@ -171,33 +224,40 @@ void cmMakeDepend::Depend(cmDependInformation* info)
|
||||||
std::string message = "Skipping ";
|
std::string message = "Skipping ";
|
||||||
message += includeFile;
|
message += includeFile;
|
||||||
message += " for file ";
|
message += " for file ";
|
||||||
message += path;
|
message += file;
|
||||||
cmSystemTools::Error(message.c_str(), 0);
|
cmSystemTools::Error(message.c_str(), 0);
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
// find the index of the include file in the
|
|
||||||
// m_DependInformation array, if it is not
|
// Add this file and all its dependencies.
|
||||||
// there then FindInformation will create it
|
this->AddDependency(info, includeFile.c_str());
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
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;
|
return path;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
cmSystemTools::Error("Depend: File not found ", fname);
|
|
||||||
return std::string(fname);
|
return std::string(fname);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -131,6 +131,16 @@ private:
|
||||||
*/
|
*/
|
||||||
void Depend(cmDependInformation* info);
|
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.
|
* Find the full path name for the given file name.
|
||||||
* This uses the include directories.
|
* This uses the include directories.
|
||||||
|
|
Loading…
Reference in New Issue