Selaa lähdekoodia

added new if commands

Ken Martin 24 vuotta sitten
vanhempi
sitoutus
d7702b4c30
4 muutettua tiedostoa jossa 114 lisäystä ja 51 poistoa
  1. 56 19
      Source/cmElseCommand.cxx
  2. 1 1
      Source/cmElseCommand.h
  3. 52 26
      Source/cmIfCommand.cxx
  4. 5 5
      Source/cmIfCommand.h

+ 56 - 19
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;
 }
 

+ 1 - 1
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);

+ 52 - 26
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;

+ 5 - 5
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);