diff options
-rw-r--r-- | Source/cmElseCommand.cxx | 75 | ||||
-rw-r--r-- | Source/cmElseCommand.h | 2 | ||||
-rw-r--r-- | Source/cmIfCommand.cxx | 78 | ||||
-rw-r--r-- | Source/cmIfCommand.h | 10 |
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); |