summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Source/cmElseCommand.cxx75
-rw-r--r--Source/cmElseCommand.h2
-rw-r--r--Source/cmIfCommand.cxx78
-rw-r--r--Source/cmIfCommand.h10
4 files changed, 114 insertions, 51 deletions
diff --git a/Source/cmElseCommand.cxx b/Source/cmElseCommand.cxx
index 6f81528..4aca32a 100644
--- a/Source/cmElseCommand.cxx
+++ b/Source/cmElseCommand.cxx
@@ -49,42 +49,79 @@ bool cmElseCommand::InitialPass(std::vector<std::string>& args)
return false;
}
- // check for the NOT vale
+ // 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))
+ if(cmSystemTools::IsOff(def))
{
- // remove any function blockers for this define
- m_Makefile->RemoveFunctionBlocker("ENDIF",args);
+ 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))
{
- // 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] == "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))
{
- // create a function blocker
- cmIfFunctionBlocker *f = new cmIfFunctionBlocker();
- f->m_Define = args[0];
- m_Makefile->AddFunctionBlocker(f);
+ 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))
{
- // remove any function blockers for this define
- m_Makefile->RemoveFunctionBlocker("ENDIF",args);
+ 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);
+ }
+ else
+ {
+ // remove any function blockers for this define
+ m_Makefile->RemoveFunctionBlocker("ENDIF",args);
+ }
+
return true;
}
diff --git a/Source/cmElseCommand.h b/Source/cmElseCommand.h
index dc85cc8..f4df774 100644
--- a/Source/cmElseCommand.h
+++ b/Source/cmElseCommand.h
@@ -90,7 +90,7 @@ public:
virtual const char* GetFullDocumentation()
{
return
- "ELSE(define)";
+ "ELSE(args), Note that the args for the ELSE clause must match those of the IF clause. See the IF command for more information.";
}
cmTypeMacro(cmElseCommand, cmCommand);
diff --git a/Source/cmIfCommand.cxx b/Source/cmIfCommand.cxx
index d0bd577..0599e8f 100644
--- a/Source/cmIfCommand.cxx
+++ b/Source/cmIfCommand.cxx
@@ -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;
diff --git a/Source/cmIfCommand.h b/Source/cmIfCommand.h
index 3a2b269..5355bc0 100644
--- a/Source/cmIfCommand.h
+++ b/Source/cmIfCommand.h
@@ -53,7 +53,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
class cmIfFunctionBlocker : public cmFunctionBlocker
{
public:
- cmIfFunctionBlocker() {m_Not = false;}
+ cmIfFunctionBlocker() {}
virtual ~cmIfFunctionBlocker() {}
virtual bool IsFunctionBlocked(const char *name,
const std::vector<std::string> &args,
@@ -63,8 +63,7 @@ public:
cmMakefile &mf);
virtual void ScopeEnded(cmMakefile &mf);
- std::string m_Define;
- bool m_Not;
+ std::vector<std::string> m_Args;
};
/** \class cmIfCommand
@@ -114,8 +113,9 @@ public:
virtual const char* GetFullDocumentation()
{
return
- "IF (define) Starts an if block. Optionally there it can be invoked as\n"
- "IF (NOT Define) the matching ELSE and ENDIF require the NOT as well.";
+ "IF (define) Starts an if block. Optionally it can be invoked "
+ "using (NOT define) (def AND def2) (def OR def2) (def MATCHES def2) "
+ "MATCHES checks if def matches the regular expression def2 ";
}
cmTypeMacro(cmIfCommand, cmCommand);