BUG: When regular expression failes to compile, produce error: Fixes part of Bug #1025 - CMake silently ignores regular expression failure
This commit is contained in:
parent
1f203c2868
commit
f3e58aeb7d
|
@ -101,15 +101,15 @@ ScopeEnded(cmMakefile &mf)
|
||||||
|
|
||||||
bool cmIfCommand::InvokeInitialPass(const std::vector<cmListFileArgument>& args)
|
bool cmIfCommand::InvokeInitialPass(const std::vector<cmListFileArgument>& args)
|
||||||
{
|
{
|
||||||
bool isValid;
|
char* errorString = 0;
|
||||||
|
|
||||||
std::vector<std::string> expandedArguments;
|
std::vector<std::string> expandedArguments;
|
||||||
m_Makefile->ExpandArguments(args, expandedArguments);
|
m_Makefile->ExpandArguments(args, expandedArguments);
|
||||||
bool isTrue = cmIfCommand::IsTrue(expandedArguments,isValid,m_Makefile);
|
bool isTrue = cmIfCommand::IsTrue(expandedArguments,&errorString,m_Makefile);
|
||||||
|
|
||||||
if (!isValid)
|
if (errorString)
|
||||||
{
|
{
|
||||||
std::string err = "An IF command had incorrect arguments: ";
|
std::string err = "had incorrect arguments: ";
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
for(i =0; i < args.size(); ++i)
|
for(i =0; i < args.size(); ++i)
|
||||||
{
|
{
|
||||||
|
@ -118,6 +118,9 @@ bool cmIfCommand::InvokeInitialPass(const std::vector<cmListFileArgument>& args)
|
||||||
err += (args[i].Quoted?"\"":"");
|
err += (args[i].Quoted?"\"":"");
|
||||||
err += " ";
|
err += " ";
|
||||||
}
|
}
|
||||||
|
err += "(";
|
||||||
|
err += errorString;
|
||||||
|
err += ").";
|
||||||
this->SetError(err.c_str());
|
this->SetError(err.c_str());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -146,17 +149,17 @@ bool cmIfCommand::InvokeInitialPass(const std::vector<cmListFileArgument>& args)
|
||||||
|
|
||||||
|
|
||||||
bool cmIfCommand::IsTrue(const std::vector<std::string> &args,
|
bool cmIfCommand::IsTrue(const std::vector<std::string> &args,
|
||||||
bool &isValid, const cmMakefile *makefile)
|
char **errorString, const cmMakefile *makefile)
|
||||||
{
|
{
|
||||||
// check for the different signatures
|
// check for the different signatures
|
||||||
isValid = false;
|
*errorString = "Unknown arguments specified";
|
||||||
const char *def;
|
const char *def;
|
||||||
const char *def2;
|
const char *def2;
|
||||||
|
|
||||||
// handle empty invocation
|
// handle empty invocation
|
||||||
if (args.size() < 1)
|
if (args.size() < 1)
|
||||||
{
|
{
|
||||||
isValid = true;
|
*errorString = 0;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -171,7 +174,7 @@ bool cmIfCommand::IsTrue(const std::vector<std::string> &args,
|
||||||
args[0] == "CMAKE_MINOR_VERSION" &&
|
args[0] == "CMAKE_MINOR_VERSION" &&
|
||||||
args[1] == "MATCHES")
|
args[1] == "MATCHES")
|
||||||
{
|
{
|
||||||
isValid = true;
|
*errorString = 0;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -279,7 +282,16 @@ bool cmIfCommand::IsTrue(const std::vector<std::string> &args,
|
||||||
*(argP1) == "MATCHES")
|
*(argP1) == "MATCHES")
|
||||||
{
|
{
|
||||||
def = cmIfCommand::GetVariableOrString(arg->c_str(), makefile);
|
def = cmIfCommand::GetVariableOrString(arg->c_str(), makefile);
|
||||||
cmsys::RegularExpression regEntry((argP2)->c_str());
|
const char* rex = (argP2)->c_str();
|
||||||
|
cmsys::RegularExpression regEntry;
|
||||||
|
if ( !regEntry.compile(rex) )
|
||||||
|
{
|
||||||
|
cmOStringStream error;
|
||||||
|
error << "Regular expression \"" << rex << "\" cannot compile";
|
||||||
|
*errorString = new char[error.str().size() + 1];
|
||||||
|
strcpy(*errorString, error.str().c_str());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
if (regEntry.find(def))
|
if (regEntry.find(def))
|
||||||
{
|
{
|
||||||
*arg = "1";
|
*arg = "1";
|
||||||
|
@ -499,7 +511,7 @@ bool cmIfCommand::IsTrue(const std::vector<std::string> &args,
|
||||||
// now at the end there should only be one argument left
|
// now at the end there should only be one argument left
|
||||||
if (newArgs.size() == 1)
|
if (newArgs.size() == 1)
|
||||||
{
|
{
|
||||||
isValid = true;
|
*errorString = 0;
|
||||||
if (*newArgs.begin() == "0")
|
if (*newArgs.begin() == "0")
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -159,9 +159,10 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
// this is a shared function for both If and Else to determine if
|
// this is a shared function for both If and Else to determine if
|
||||||
// the arguments were valid, and if so, was the response true
|
// the arguments were valid, and if so, was the response true. If there is an
|
||||||
|
// error, the errorString will be set.
|
||||||
static bool IsTrue(const std::vector<std::string> &args,
|
static bool IsTrue(const std::vector<std::string> &args,
|
||||||
bool &isValid, const cmMakefile *mf);
|
char** errorString, const cmMakefile *mf);
|
||||||
|
|
||||||
// Get a definition from the makefile. If it doesn't exist,
|
// Get a definition from the makefile. If it doesn't exist,
|
||||||
// return the original string.
|
// return the original string.
|
||||||
|
|
Loading…
Reference in New Issue