瀏覽代碼

fixed if statements inside a foreach

Ken Martin 23 年之前
父節點
當前提交
fcc410de44

+ 7 - 1
Source/cmForEachCommand.cxx

@@ -21,10 +21,16 @@ bool cmForEachFunctionBlocker::
 IsFunctionBlocked(const char *name, const std::vector<std::string> &args, 
                   cmMakefile &mf) 
 {
+  // prevent recusion and don't let this blobker blobk its own commands
+  if (m_Executing)
+    {
+    return false;
+    }
   
   // at end of for each execute recorded commands
   if (!strcmp(name,"ENDFOREACH") && args[0] == m_Args[0])
     {
+    m_Executing = true;
     std::string variable = "${";
     variable += m_Args[0];
     variable += "}"; 
@@ -90,7 +96,7 @@ bool cmForEachCommand::InitialPass(std::vector<std::string> const& argsIn)
   std::vector<std::string> args;
   cmSystemTools::ExpandListArguments(argsIn, args);
 
-  if(args.size() < 2 )
+  if(args.size() < 1)
     {
     this->SetError("called with incorrect number of arguments");
     return false;

+ 2 - 1
Source/cmForEachCommand.h

@@ -29,7 +29,7 @@
 class cmForEachFunctionBlocker : public cmFunctionBlocker
 {
 public:
-  cmForEachFunctionBlocker() {}
+  cmForEachFunctionBlocker() {m_Executing = false;}
   virtual ~cmForEachFunctionBlocker() {}
   virtual bool IsFunctionBlocked(const char *name, 
                                  const std::vector<std::string> &args, 
@@ -44,6 +44,7 @@ public:
   std::vector<std::string> m_Args;
   std::vector<std::string> m_Commands;
   std::vector<std::vector<std::string> > m_CommandArguments;
+  bool m_Executing;
 };
 
 /** \class cmForEachCommand

+ 8 - 6
Source/cmMakefile.cxx

@@ -193,6 +193,12 @@ bool cmMakefile::CommandExists(const char* name) const
 void cmMakefile::ExecuteCommand(std::string &name,
                                 std::vector<std::string> const& arguments)
 {
+  // quick return if blocked
+  if(this->IsFunctionBlocked(name.c_str(), arguments))
+    {
+    return;
+    }
+  // execute the command
   RegisteredCommandsMap::iterator pos = m_Commands.find(name);
   if(pos != m_Commands.end())
     {
@@ -342,12 +348,8 @@ bool cmMakefile::ReadListFile(const char* filename, const char* external)
   for(size_t i =0; i < numberFunctions; ++i)
     {
     cmListFileFunction& curFunction = lf->m_Functions[i];
-    if(!this->IsFunctionBlocked(curFunction.m_Name.c_str(),
-                                curFunction.m_Arguments))
-      {
-      this->ExecuteCommand(curFunction.m_Name,
-                           curFunction.m_Arguments);
-      }
+    this->ExecuteCommand(curFunction.m_Name,
+                         curFunction.m_Arguments);
     }
 
   // send scope ended to and funciton blockers

+ 3 - 3
Tests/Complex/CMakeLists.txt

@@ -164,13 +164,13 @@ REMOVE(REMOVE_STRING ${removeVar1} f)
 # Test an IF inside a FOREACH.
 #
 FOREACH(x "a")
-  IF(1)
+  IF(${x} MATCHES "a")
     # Should always execute.
     SET(IF_INSIDE_FOREACH_THEN_EXECUTED 1)
-  ELSE(1)
+  ELSE(${x} MATCHES "a")
     # Should never execute.
     SET(IF_INSIDE_FOREACH_ELSE_EXECUTED 1)
-  ENDIF(1)
+  ENDIF(${x} MATCHES "a")
 ENDFOREACH(x)
 
 

+ 3 - 3
Tests/ComplexOneConfig/CMakeLists.txt

@@ -164,13 +164,13 @@ REMOVE(REMOVE_STRING ${removeVar1} f)
 # Test an IF inside a FOREACH.
 #
 FOREACH(x "a")
-  IF(1)
+  IF(${x} MATCHES "a")
     # Should always execute.
     SET(IF_INSIDE_FOREACH_THEN_EXECUTED 1)
-  ELSE(1)
+  ELSE(${x} MATCHES "a")
     # Should never execute.
     SET(IF_INSIDE_FOREACH_ELSE_EXECUTED 1)
-  ENDIF(1)
+  ENDIF(${x} MATCHES "a")
 ENDFOREACH(x)
 
 

+ 3 - 3
Tests/ComplexRelativePaths/CMakeLists.txt

@@ -164,13 +164,13 @@ REMOVE(REMOVE_STRING ${removeVar1} f)
 # Test an IF inside a FOREACH.
 #
 FOREACH(x "a")
-  IF(1)
+  IF(${x} MATCHES "a")
     # Should always execute.
     SET(IF_INSIDE_FOREACH_THEN_EXECUTED 1)
-  ELSE(1)
+  ELSE(${x} MATCHES "a")
     # Should never execute.
     SET(IF_INSIDE_FOREACH_ELSE_EXECUTED 1)
-  ENDIF(1)
+  ENDIF(${x} MATCHES "a")
 ENDFOREACH(x)