cmMakeDepend: Inline into inheriting class.
Devirtualize the API.
This commit is contained in:
parent
6a1e73281f
commit
c0969b1033
|
@ -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 &)
|
||||
|
|
Loading…
Reference in New Issue