ENH: Extended INCLUDE_REGULAR_EXPRESSION to allow selective complaints about missing dependencies.
This commit is contained in:
parent
8ffe832e9b
commit
cf82992964
@ -43,13 +43,18 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
// cmIncludeRegularExpressionCommand
|
// cmIncludeRegularExpressionCommand
|
||||||
bool cmIncludeRegularExpressionCommand::InitialPass(std::vector<std::string>& args)
|
bool cmIncludeRegularExpressionCommand::InitialPass(std::vector<std::string>& args)
|
||||||
{
|
{
|
||||||
if(args.size() != 1)
|
if((args.size() < 1) || (args.size() > 2))
|
||||||
{
|
{
|
||||||
this->SetError("called with incorrect number of arguments");
|
this->SetError("called with incorrect number of arguments");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
m_Makefile->SetIncludeRegularExpression(args[0].c_str());
|
m_Makefile->SetIncludeRegularExpression(args[0].c_str());
|
||||||
|
|
||||||
|
if(args.size() > 1)
|
||||||
|
{
|
||||||
|
m_Makefile->SetComplainRegularExpression(args[1].c_str());
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -96,9 +96,13 @@ public:
|
|||||||
virtual const char* GetFullDocumentation()
|
virtual const char* GetFullDocumentation()
|
||||||
{
|
{
|
||||||
return
|
return
|
||||||
"INCLUDE_REGULAR_EXPRESSION(regex)\n"
|
"INCLUDE_REGULAR_EXPRESSION(regex_match [regex_complain])\n"
|
||||||
"Sets the regular expression used in dependency checking. Only\n"
|
"Set the regular expressions used in dependency checking. Only files\n"
|
||||||
"include files matching this regular expression will be traced.";
|
"matching regex_match will be traced as dependencies. Only files\n"
|
||||||
|
"matching regex_complain will generate warnings if they cannot be found\n"
|
||||||
|
"(standard header paths are not searched). The defaults are:\n"
|
||||||
|
" regex_match = \"^.*$\" (match everything)\n"
|
||||||
|
" regex_complain = \"^$\" (match empty string only)\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
cmTypeMacro(cmIncludeRegularExpressionCommand, cmCommand);
|
cmTypeMacro(cmIncludeRegularExpressionCommand, cmCommand);
|
||||||
|
@ -45,7 +45,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
cmMakeDepend::cmMakeDepend()
|
cmMakeDepend::cmMakeDepend()
|
||||||
{
|
{
|
||||||
m_Verbose = false;
|
m_Verbose = false;
|
||||||
m_IncludeFileRegularExpression.compile("");
|
m_IncludeFileRegularExpression.compile("^.*$");
|
||||||
|
m_ComplainFileRegularExpression.compile("^$");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -71,6 +72,8 @@ void cmMakeDepend::SetMakefile(const cmMakefile* makefile)
|
|||||||
// Now extract the include file regular expression from the makefile.
|
// Now extract the include file regular expression from the makefile.
|
||||||
m_IncludeFileRegularExpression.compile(
|
m_IncludeFileRegularExpression.compile(
|
||||||
m_Makefile->m_IncludeFileRegularExpression.c_str());
|
m_Makefile->m_IncludeFileRegularExpression.c_str());
|
||||||
|
m_ComplainFileRegularExpression.compile(
|
||||||
|
m_Makefile->m_ComplainFileRegularExpression.c_str());
|
||||||
|
|
||||||
// Now extract any include paths from the makefile flags
|
// Now extract any include paths from the makefile flags
|
||||||
const std::vector<std::string>& includes = m_Makefile->GetIncludeDirectories();
|
const std::vector<std::string>& includes = m_Makefile->GetIncludeDirectories();
|
||||||
@ -200,7 +203,16 @@ void cmMakeDepend::Depend(cmDependInformation* info)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Couldn't find any dependency information.
|
// Couldn't find any dependency information.
|
||||||
|
if(m_ComplainFileRegularExpression.find(info->m_IncludeName.c_str()))
|
||||||
|
{
|
||||||
cmSystemTools::Error("error cannot find dependencies for ", path);
|
cmSystemTools::Error("error cannot find dependencies for ", path);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Destroy the name of the file so that it won't be output as a
|
||||||
|
// dependency.
|
||||||
|
info->m_FullPath = "";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -208,6 +220,7 @@ void cmMakeDepend::Depend(cmDependInformation* info)
|
|||||||
// #include directives
|
// #include directives
|
||||||
void cmMakeDepend::DependWalk(cmDependInformation* info, const char* file)
|
void cmMakeDepend::DependWalk(cmDependInformation* info, const char* file)
|
||||||
{
|
{
|
||||||
|
cmRegularExpression includeLine("^[ \t]*#[ \t]*include[ \t]*[<\"]([^\">]+)[\">]");
|
||||||
std::ifstream fin(file);
|
std::ifstream fin(file);
|
||||||
if(!fin)
|
if(!fin)
|
||||||
{
|
{
|
||||||
@ -216,37 +229,12 @@ void cmMakeDepend::DependWalk(cmDependInformation* info, const char* file)
|
|||||||
}
|
}
|
||||||
|
|
||||||
char line[255];
|
char line[255];
|
||||||
while(!fin.eof() && !fin.fail())
|
for(fin.getline(line, 255); !fin.eof()&&!fin.fail(); fin.getline(line, 255))
|
||||||
{
|
{
|
||||||
fin.getline(line, 255);
|
if(includeLine.find(line))
|
||||||
if(!strncmp(line, "#include", 8))
|
|
||||||
{
|
{
|
||||||
// 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 = currentline.substr(qstart+1, qend - qstart-1);
|
std::string includeFile = includeLine.match(1);
|
||||||
// see if the include matches the regular expression
|
// see if the include matches the regular expression
|
||||||
if(!m_IncludeFileRegularExpression.find(includeFile))
|
if(!m_IncludeFileRegularExpression.find(includeFile))
|
||||||
{
|
{
|
||||||
@ -352,6 +340,7 @@ std::string cmMakeDepend::FullPath(const char* fname)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Couldn't find the file.
|
||||||
return std::string(fname);
|
return std::string(fname);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -180,6 +180,7 @@ protected:
|
|||||||
const cmMakefile* m_Makefile;
|
const cmMakefile* m_Makefile;
|
||||||
bool m_Verbose;
|
bool m_Verbose;
|
||||||
cmRegularExpression m_IncludeFileRegularExpression;
|
cmRegularExpression m_IncludeFileRegularExpression;
|
||||||
|
cmRegularExpression m_ComplainFileRegularExpression;
|
||||||
DependArray m_DependInformation;
|
DependArray m_DependInformation;
|
||||||
std::vector<std::string> m_IncludeDirectories;
|
std::vector<std::string> m_IncludeDirectories;
|
||||||
};
|
};
|
||||||
|
@ -53,9 +53,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
// default is not to be building executables
|
// default is not to be building executables
|
||||||
cmMakefile::cmMakefile()
|
cmMakefile::cmMakefile()
|
||||||
{
|
{
|
||||||
// Setup the default include file regular expression.
|
// Setup the default include file regular expression (match everything).
|
||||||
// Should be changed to something like "\\.(h|hh|hpp|hxx)$" or "^.*$"
|
m_IncludeFileRegularExpression = "^.*$";
|
||||||
m_IncludeFileRegularExpression = "^itk|^vtk|^vnl|^vcl|^f2c";
|
// Setup the default include complaint regular expression (match nothing).
|
||||||
|
m_ComplainFileRegularExpression = "^$";
|
||||||
|
|
||||||
m_DefineFlags = " ";
|
m_DefineFlags = " ";
|
||||||
m_MakefileGenerator = 0;
|
m_MakefileGenerator = 0;
|
||||||
|
@ -346,6 +346,15 @@ public:
|
|||||||
m_IncludeFileRegularExpression = regex;
|
m_IncludeFileRegularExpression = regex;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set a regular expression that include files that are not found
|
||||||
|
* must match in order to be considered a problem.
|
||||||
|
*/
|
||||||
|
void SetComplainRegularExpression(const char* regex)
|
||||||
|
{
|
||||||
|
m_ComplainFileRegularExpression = regex;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the list of targets
|
* Get the list of targets
|
||||||
*/
|
*/
|
||||||
@ -493,6 +502,7 @@ protected:
|
|||||||
cmTarget::LinkLibraries m_LinkLibraries;
|
cmTarget::LinkLibraries m_LinkLibraries;
|
||||||
|
|
||||||
std::string m_IncludeFileRegularExpression;
|
std::string m_IncludeFileRegularExpression;
|
||||||
|
std::string m_ComplainFileRegularExpression;
|
||||||
std::string m_DefineFlags;
|
std::string m_DefineFlags;
|
||||||
std::vector<cmSourceGroup> m_SourceGroups;
|
std::vector<cmSourceGroup> m_SourceGroups;
|
||||||
typedef std::map<std::string, cmCommand*> RegisteredCommandsMap;
|
typedef std::map<std::string, cmCommand*> RegisteredCommandsMap;
|
||||||
|
@ -128,12 +128,17 @@ void cmUnixMakefileGenerator::ProcessDepends(const cmMakeDepend &md)
|
|||||||
info->m_IndexSet.begin();
|
info->m_IndexSet.begin();
|
||||||
indx != info->m_IndexSet.end(); ++indx)
|
indx != info->m_IndexSet.end(); ++indx)
|
||||||
{
|
{
|
||||||
|
// Make sure the full path is given. If not, the dependency was
|
||||||
|
// not found.
|
||||||
|
if(md.GetDependInformation()[*indx]->m_FullPath != "")
|
||||||
|
{
|
||||||
i->GetDepends().push_back(md.GetDependInformation()[*indx]->m_FullPath);
|
i->GetDepends().push_back(md.GetDependInformation()[*indx]->m_FullPath);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user