cmMakeDepend: Inline into inheriting class.

Devirtualize the API.
This commit is contained in:
Stephen Kelly 2015-10-19 22:14:14 +02:00
parent 6a1e73281f
commit c0969b1033
1 changed files with 128 additions and 175 deletions

View File

@ -72,16 +72,13 @@ public:
}
};
// cmMakeDepend is used to generate dependancy information for
// the classes in a makefile
class cmMakeDepend
class cmLBDepend
{
public:
/**
* Construct the object with verbose turned off.
*/
cmMakeDepend()
cmLBDepend()
{
this->Verbose = false;
this->IncludeFileRegularExpression.compile("^.*$");
@ -91,7 +88,7 @@ public:
/**
* Destructor.
*/
virtual ~cmMakeDepend()
~cmLBDepend()
{
cmDeleteAll(this->DependInformationMap);
}
@ -99,7 +96,7 @@ public:
/**
* Set the makefile that is used as a source of classes.
*/
virtual void SetMakefile(cmMakefile* makefile)
void SetMakefile(cmMakefile* makefile)
{
this->Makefile = makefile;
@ -153,7 +150,7 @@ public:
/**
* Add a directory to the search path for include files.
*/
virtual void AddSearchPath(const std::string& path)
void AddSearchPath(const std::string& path)
{
this->IncludeDirectories.push_back(path);
}
@ -173,25 +170,48 @@ protected:
/**
* Compute the depend information for this class.
*/
virtual void DependWalk(cmDependInformation* info)
void DependWalk(cmDependInformation* info)
{
cmsys::RegularExpression includeLine
("^[ \t]*#[ \t]*include[ \t]*[<\"]([^\">]+)[\">]");
cmsys::ifstream fin(info->FullPath.c_str());
if(!fin)
{
cmSystemTools::Error("Cannot open ", info->FullPath.c_str());
cmSystemTools::Error("error can not open ", info->FullPath.c_str());
return;
}
// TODO: Write real read loop (see cmSystemTools::CopyFile).
std::string line;
while(cmSystemTools::GetLineFromStream(fin, line))
{
if(includeLine.find(line.c_str()))
if(cmHasLiteralPrefix(line.c_str(), "#include"))
{
// if it is an include line then create a string class
std::string currentline = line;
size_t qstart = currentline.find('\"', 8);
size_t qend;
// if a quote is not found look for a <
if(qstart == std::string::npos)
{
qstart = currentline.find('<', 8);
// if a < is not found then move on
if(qstart == std::string::npos)
{
cmSystemTools::Error("unknown include directive ",
currentline.c_str() );
continue;
}
else
{
qend = currentline.find('>', qstart+1);
}
}
else
{
qend = currentline.find('\"', qstart+1);
}
// extract the file being included
std::string includeFile = includeLine.match(1);
std::string includeFile =
currentline.substr(qstart+1, qend - qstart-1);
// see if the include matches the regular expression
if(!this->IncludeFileRegularExpression.find(includeFile))
{
@ -205,8 +225,99 @@ protected:
}
continue;
}
// Add this file and all its dependencies.
this->AddDependency(info, includeFile.c_str());
/// add the cxx file if it exists
std::string cxxFile = includeFile;
std::string::size_type pos = cxxFile.rfind('.');
if(pos != std::string::npos)
{
std::string root = cxxFile.substr(0, pos);
cxxFile = root + ".cxx";
bool found = false;
// try jumping to .cxx .cpp and .c in order
if(cmSystemTools::FileExists(cxxFile.c_str()))
{
found = true;
}
for(std::vector<std::string>::iterator i =
this->IncludeDirectories.begin();
i != this->IncludeDirectories.end(); ++i)
{
std::string path = *i;
path = path + "/";
path = path + cxxFile;
if(cmSystemTools::FileExists(path.c_str()))
{
found = true;
}
}
if (!found)
{
cxxFile = root + ".cpp";
if(cmSystemTools::FileExists(cxxFile.c_str()))
{
found = true;
}
for(std::vector<std::string>::iterator i =
this->IncludeDirectories.begin();
i != this->IncludeDirectories.end(); ++i)
{
std::string path = *i;
path = path + "/";
path = path + cxxFile;
if(cmSystemTools::FileExists(path.c_str()))
{
found = true;
}
}
}
if (!found)
{
cxxFile = root + ".c";
if(cmSystemTools::FileExists(cxxFile.c_str()))
{
found = true;
}
for(std::vector<std::string>::iterator i =
this->IncludeDirectories.begin();
i != this->IncludeDirectories.end(); ++i)
{
std::string path = *i;
path = path + "/";
path = path + cxxFile;
if(cmSystemTools::FileExists(path.c_str()))
{
found = true;
}
}
}
if (!found)
{
cxxFile = root + ".txx";
if(cmSystemTools::FileExists(cxxFile.c_str()))
{
found = true;
}
for(std::vector<std::string>::iterator i =
this->IncludeDirectories.begin();
i != this->IncludeDirectories.end(); ++i)
{
std::string path = *i;
path = path + "/";
path = path + cxxFile;
if(cmSystemTools::FileExists(path.c_str()))
{
found = true;
}
}
}
if (found)
{
this->AddDependency(info, cxxFile.c_str());
}
}
}
}
}
@ -214,7 +325,7 @@ protected:
/**
* Add a dependency. Possibly walk it for more dependencies.
*/
virtual void AddDependency(cmDependInformation* info, const char* file)
void AddDependency(cmDependInformation* info, const char* file)
{
cmDependInformation* dependInfo =
this->GetDependInformation(file, info->PathOnly.c_str());
@ -451,164 +562,6 @@ protected:
DirectoryToFileToPathMapType DirectoryToFileToPathMap;
};
class cmLBDepend : public cmMakeDepend
{
/**
* Compute the depend information for this class.
*/
virtual void DependWalk(cmDependInformation* info);
};
void cmLBDepend::DependWalk(cmDependInformation* info)
{
cmsys::ifstream fin(info->FullPath.c_str());
if(!fin)
{
cmSystemTools::Error("error can not open ", info->FullPath.c_str());
return;
}
std::string line;
while(cmSystemTools::GetLineFromStream(fin, line))
{
if(cmHasLiteralPrefix(line.c_str(), "#include"))
{
// if it is an include line then create a string class
std::string currentline = line;
size_t qstart = currentline.find('\"', 8);
size_t qend;
// if a quote is not found look for a <
if(qstart == std::string::npos)
{
qstart = currentline.find('<', 8);
// if a < is not found then move on
if(qstart == std::string::npos)
{
cmSystemTools::Error("unknown include directive ",
currentline.c_str() );
continue;
}
else
{
qend = currentline.find('>', qstart+1);
}
}
else
{
qend = currentline.find('\"', qstart+1);
}
// extract the file being included
std::string includeFile = currentline.substr(qstart+1, qend - qstart-1);
// see if the include matches the regular expression
if(!this->IncludeFileRegularExpression.find(includeFile))
{
if(this->Verbose)
{
std::string message = "Skipping ";
message += includeFile;
message += " for file ";
message += info->FullPath.c_str();
cmSystemTools::Error(message.c_str(), 0);
}
continue;
}
// Add this file and all its dependencies.
this->AddDependency(info, includeFile.c_str());
/// add the cxx file if it exists
std::string cxxFile = includeFile;
std::string::size_type pos = cxxFile.rfind('.');
if(pos != std::string::npos)
{
std::string root = cxxFile.substr(0, pos);
cxxFile = root + ".cxx";
bool found = false;
// try jumping to .cxx .cpp and .c in order
if(cmSystemTools::FileExists(cxxFile.c_str()))
{
found = true;
}
for(std::vector<std::string>::iterator i =
this->IncludeDirectories.begin();
i != this->IncludeDirectories.end(); ++i)
{
std::string path = *i;
path = path + "/";
path = path + cxxFile;
if(cmSystemTools::FileExists(path.c_str()))
{
found = true;
}
}
if (!found)
{
cxxFile = root + ".cpp";
if(cmSystemTools::FileExists(cxxFile.c_str()))
{
found = true;
}
for(std::vector<std::string>::iterator i =
this->IncludeDirectories.begin();
i != this->IncludeDirectories.end(); ++i)
{
std::string path = *i;
path = path + "/";
path = path + cxxFile;
if(cmSystemTools::FileExists(path.c_str()))
{
found = true;
}
}
}
if (!found)
{
cxxFile = root + ".c";
if(cmSystemTools::FileExists(cxxFile.c_str()))
{
found = true;
}
for(std::vector<std::string>::iterator i =
this->IncludeDirectories.begin();
i != this->IncludeDirectories.end(); ++i)
{
std::string path = *i;
path = path + "/";
path = path + cxxFile;
if(cmSystemTools::FileExists(path.c_str()))
{
found = true;
}
}
}
if (!found)
{
cxxFile = root + ".txx";
if(cmSystemTools::FileExists(cxxFile.c_str()))
{
found = true;
}
for(std::vector<std::string>::iterator i =
this->IncludeDirectories.begin();
i != this->IncludeDirectories.end(); ++i)
{
std::string path = *i;
path = path + "/";
path = path + cxxFile;
if(cmSystemTools::FileExists(path.c_str()))
{
found = true;
}
}
}
if (found)
{
this->AddDependency(info, cxxFile.c_str());
}
}
}
}
}
// cmOutputRequiredFilesCommand
bool cmOutputRequiredFilesCommand
::InitialPass(std::vector<std::string> const& args, cmExecutionStatus &)