diff --git a/Source/cmForEachCommand.cxx b/Source/cmForEachCommand.cxx index e4cca41d39..c95c55829e 100644 --- a/Source/cmForEachCommand.cxx +++ b/Source/cmForEachCommand.cxx @@ -21,10 +21,16 @@ bool cmForEachFunctionBlocker:: IsFunctionBlocked(const char *name, const std::vector &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 const& argsIn) std::vector args; cmSystemTools::ExpandListArguments(argsIn, args); - if(args.size() < 2 ) + if(args.size() < 1) { this->SetError("called with incorrect number of arguments"); return false; diff --git a/Source/cmForEachCommand.h b/Source/cmForEachCommand.h index 064e30bc95..910f3d557f 100644 --- a/Source/cmForEachCommand.h +++ b/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 &args, @@ -44,6 +44,7 @@ public: std::vector m_Args; std::vector m_Commands; std::vector > m_CommandArguments; + bool m_Executing; }; /** \class cmForEachCommand diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx index 496704a369..9dbf31daed 100644 --- a/Source/cmMakefile.cxx +++ b/Source/cmMakefile.cxx @@ -193,6 +193,12 @@ bool cmMakefile::CommandExists(const char* name) const void cmMakefile::ExecuteCommand(std::string &name, std::vector 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 diff --git a/Tests/Complex/CMakeLists.txt b/Tests/Complex/CMakeLists.txt index 2d6de20353..068b47eef1 100644 --- a/Tests/Complex/CMakeLists.txt +++ b/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) diff --git a/Tests/ComplexOneConfig/CMakeLists.txt b/Tests/ComplexOneConfig/CMakeLists.txt index 2d6de20353..068b47eef1 100644 --- a/Tests/ComplexOneConfig/CMakeLists.txt +++ b/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) diff --git a/Tests/ComplexRelativePaths/CMakeLists.txt b/Tests/ComplexRelativePaths/CMakeLists.txt index 2d6de20353..068b47eef1 100644 --- a/Tests/ComplexRelativePaths/CMakeLists.txt +++ b/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)