cmMakeDepend: Inline into inheriting class.
Devirtualize the API.
This commit is contained in:
parent
6a1e73281f
commit
c0969b1033
|
@ -72,16 +72,13 @@ public:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class cmLBDepend
|
||||||
// cmMakeDepend is used to generate dependancy information for
|
|
||||||
// the classes in a makefile
|
|
||||||
class cmMakeDepend
|
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
* Construct the object with verbose turned off.
|
* Construct the object with verbose turned off.
|
||||||
*/
|
*/
|
||||||
cmMakeDepend()
|
cmLBDepend()
|
||||||
{
|
{
|
||||||
this->Verbose = false;
|
this->Verbose = false;
|
||||||
this->IncludeFileRegularExpression.compile("^.*$");
|
this->IncludeFileRegularExpression.compile("^.*$");
|
||||||
|
@ -91,7 +88,7 @@ public:
|
||||||
/**
|
/**
|
||||||
* Destructor.
|
* Destructor.
|
||||||
*/
|
*/
|
||||||
virtual ~cmMakeDepend()
|
~cmLBDepend()
|
||||||
{
|
{
|
||||||
cmDeleteAll(this->DependInformationMap);
|
cmDeleteAll(this->DependInformationMap);
|
||||||
}
|
}
|
||||||
|
@ -99,7 +96,7 @@ public:
|
||||||
/**
|
/**
|
||||||
* Set the makefile that is used as a source of classes.
|
* Set the makefile that is used as a source of classes.
|
||||||
*/
|
*/
|
||||||
virtual void SetMakefile(cmMakefile* makefile)
|
void SetMakefile(cmMakefile* makefile)
|
||||||
{
|
{
|
||||||
this->Makefile = makefile;
|
this->Makefile = makefile;
|
||||||
|
|
||||||
|
@ -153,7 +150,7 @@ public:
|
||||||
/**
|
/**
|
||||||
* Add a directory to the search path for include files.
|
* 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);
|
this->IncludeDirectories.push_back(path);
|
||||||
}
|
}
|
||||||
|
@ -173,25 +170,48 @@ protected:
|
||||||
/**
|
/**
|
||||||
* Compute the depend information for this class.
|
* 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());
|
cmsys::ifstream fin(info->FullPath.c_str());
|
||||||
if(!fin)
|
if(!fin)
|
||||||
{
|
{
|
||||||
cmSystemTools::Error("Cannot open ", info->FullPath.c_str());
|
cmSystemTools::Error("error can not open ", info->FullPath.c_str());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Write real read loop (see cmSystemTools::CopyFile).
|
|
||||||
std::string line;
|
std::string line;
|
||||||
while( cmSystemTools::GetLineFromStream(fin, 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
|
// 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
|
// see if the include matches the regular expression
|
||||||
if(!this->IncludeFileRegularExpression.find(includeFile))
|
if(!this->IncludeFileRegularExpression.find(includeFile))
|
||||||
{
|
{
|
||||||
|
@ -205,8 +225,99 @@ protected:
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add this file and all its dependencies.
|
// Add this file and all its dependencies.
|
||||||
this->AddDependency(info, includeFile.c_str());
|
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.
|
* 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 =
|
cmDependInformation* dependInfo =
|
||||||
this->GetDependInformation(file, info->PathOnly.c_str());
|
this->GetDependInformation(file, info->PathOnly.c_str());
|
||||||
|
@ -451,164 +562,6 @@ protected:
|
||||||
DirectoryToFileToPathMapType DirectoryToFileToPathMap;
|
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
|
// cmOutputRequiredFilesCommand
|
||||||
bool cmOutputRequiredFilesCommand
|
bool cmOutputRequiredFilesCommand
|
||||||
::InitialPass(std::vector<std::string> const& args, cmExecutionStatus &)
|
::InitialPass(std::vector<std::string> const& args, cmExecutionStatus &)
|
||||||
|
|
Loading…
Reference in New Issue