|
|
@@ -47,13 +47,7 @@ IsFunctionBlocked(const char *name, const std::vector<std::string> &args,
|
|
|
{
|
|
|
if (!strcmp(name,"ELSE") || !strcmp(name,"ENDIF"))
|
|
|
{
|
|
|
- if (m_Not && (args.size() == 2) && !strcmp(args[0].c_str(),"NOT") &&
|
|
|
- !strcmp(args[1].c_str(),m_Define.c_str()))
|
|
|
- {
|
|
|
- return false;
|
|
|
- }
|
|
|
- if (!m_Not && (args.size() == 1) &&
|
|
|
- !strcmp(args[0].c_str(),m_Define.c_str()))
|
|
|
+ if (args == m_Args)
|
|
|
{
|
|
|
return false;
|
|
|
}
|
|
|
@@ -72,9 +66,7 @@ void cmIfFunctionBlocker::
|
|
|
ScopeEnded(cmMakefile &mf)
|
|
|
{
|
|
|
cmSystemTools::Error("The end of a CMakeLists file was reached with an IF statement that was not closed properly. Within the directory: ",
|
|
|
- mf.GetCurrentDirectory(),
|
|
|
- (m_Not ? " The arguments to the if were: NOT " : " The arguments to the if were: "),
|
|
|
- m_Define.c_str());
|
|
|
+ mf.GetCurrentDirectory());
|
|
|
}
|
|
|
|
|
|
bool cmIfCommand::InitialPass(std::vector<std::string>& args)
|
|
|
@@ -85,38 +77,72 @@ bool cmIfCommand::InitialPass(std::vector<std::string>& args)
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
- // check for the NOT value
|
|
|
+ // create a function blocker
|
|
|
+ cmIfFunctionBlocker *f = NULL;
|
|
|
+
|
|
|
+ // check for the different signatures
|
|
|
const char *def;
|
|
|
+ const char *def2;
|
|
|
+
|
|
|
+ if (args.size() == 1)
|
|
|
+ {
|
|
|
+ def = m_Makefile->GetDefinition(args[0].c_str());
|
|
|
+ if(cmSystemTools::IsOff(def))
|
|
|
+ {
|
|
|
+ f = new cmIfFunctionBlocker();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
if (args.size() == 2 && (args[0] == "NOT"))
|
|
|
{
|
|
|
def = m_Makefile->GetDefinition(args[1].c_str());
|
|
|
if(!cmSystemTools::IsOff(def))
|
|
|
{
|
|
|
- // create a function blocker
|
|
|
- cmIfFunctionBlocker *f = new cmIfFunctionBlocker();
|
|
|
- f->m_Define = args[1];
|
|
|
- f->m_Not = true;
|
|
|
- m_Makefile->AddFunctionBlocker(f);
|
|
|
+ f = new cmIfFunctionBlocker();
|
|
|
}
|
|
|
- else
|
|
|
+ }
|
|
|
+
|
|
|
+ if (args.size() == 3 && (args[1] == "AND"))
|
|
|
+ {
|
|
|
+ def = m_Makefile->GetDefinition(args[0].c_str());
|
|
|
+ def2 = m_Makefile->GetDefinition(args[2].c_str());
|
|
|
+ if(!cmSystemTools::IsOff(def) && !cmSystemTools::IsOff(def2))
|
|
|
{
|
|
|
- // do nothing
|
|
|
+ f = new cmIfFunctionBlocker();
|
|
|
}
|
|
|
}
|
|
|
- else
|
|
|
+
|
|
|
+ if (args.size() == 3 && (args[1] == "OR"))
|
|
|
{
|
|
|
def = m_Makefile->GetDefinition(args[0].c_str());
|
|
|
- if(!cmSystemTools::IsOff(def))
|
|
|
+ def2 = m_Makefile->GetDefinition(args[2].c_str());
|
|
|
+ if(!cmSystemTools::IsOff(def) || !cmSystemTools::IsOff(def2))
|
|
|
{
|
|
|
- // do nothing
|
|
|
+ f = new cmIfFunctionBlocker();
|
|
|
}
|
|
|
- else
|
|
|
+ }
|
|
|
+
|
|
|
+ if (args.size() == 3 && (args[1] == "MATCHES"))
|
|
|
+ {
|
|
|
+ def = m_Makefile->GetDefinition(args[0].c_str());
|
|
|
+ cmRegularExpression regEntry(args[2].c_str());
|
|
|
+
|
|
|
+ // check for black line or comment
|
|
|
+ if (regEntry.find(def))
|
|
|
{
|
|
|
- // create a function blocker
|
|
|
- cmIfFunctionBlocker *f = new cmIfFunctionBlocker();
|
|
|
- f->m_Define = args[0];
|
|
|
- m_Makefile->AddFunctionBlocker(f);
|
|
|
+ f = new cmIfFunctionBlocker();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // if we created a function blocker then set its args
|
|
|
+ if (f)
|
|
|
+ {
|
|
|
+ for(std::vector<std::string>::iterator j = args.begin();
|
|
|
+ j != args.end(); ++j)
|
|
|
+ {
|
|
|
+ f->m_Args.push_back(*j);
|
|
|
}
|
|
|
+ m_Makefile->AddFunctionBlocker(f);
|
|
|
}
|
|
|
|
|
|
return true;
|