CMake/Source/cmIfCommand.cxx

222 lines
5.4 KiB
C++
Raw Normal View History

2001-04-20 01:39:03 +04:00
/*=========================================================================
Program: Insight Segmentation & Registration Toolkit
Module: $RCSfile$
Language: C++
Date: $Date$
Version: $Revision$
2002-01-21 23:30:43 +03:00
Copyright (c) 2002 Insight Consortium. All rights reserved.
See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details.
2001-04-20 01:39:03 +04:00
2002-01-21 23:30:43 +03:00
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notices for more information.
2001-04-20 01:39:03 +04:00
=========================================================================*/
#include "cmIfCommand.h"
#include "cmCacheManager.h"
bool cmIfFunctionBlocker::
IsFunctionBlocked(const char *name, const std::vector<std::string> &args,
2001-12-27 22:55:19 +03:00
cmMakefile &)
2001-04-20 01:39:03 +04:00
{
2001-05-02 00:27:51 +04:00
if (!strcmp(name,"ELSE") || !strcmp(name,"ENDIF"))
2001-04-20 01:39:03 +04:00
{
2001-08-07 01:01:26 +04:00
if (args == m_Args)
2001-05-01 19:16:20 +04:00
{
2001-05-02 00:27:51 +04:00
return false;
2001-05-01 19:16:20 +04:00
}
else if(args.empty())
{
std::string err = "Empty arguments for ";
err += name;
err += ". Did you mean ";
err += name;
err += "( ";
for(std::vector<std::string>::const_iterator a = m_Args.begin();
a != m_Args.end();++a)
{
err += *a;
err += " ";
}
err += ")?";
cmSystemTools::Error(err.c_str());
}
2001-04-20 01:39:03 +04:00
}
2001-05-02 00:27:51 +04:00
return true;
2001-04-20 01:39:03 +04:00
}
bool cmIfFunctionBlocker::
ShouldRemove(const char *name, const std::vector<std::string> &args,
2001-07-26 00:53:13 +04:00
cmMakefile &mf)
2001-04-20 01:39:03 +04:00
{
return !this->IsFunctionBlocked(name,args,mf);
}
2001-05-04 16:46:05 +04:00
void cmIfFunctionBlocker::
2001-07-26 00:53:13 +04:00
ScopeEnded(cmMakefile &mf)
2001-05-04 16:46:05 +04:00
{
2001-11-26 19:31:50 +03:00
std::string errmsg = "The end of a CMakeLists file was reached with an IF statement that was not closed properly.\nWithin the directory: ";
errmsg += mf.GetCurrentDirectory();
errmsg += "\nThe arguments are: ";
for(std::vector<std::string>::const_iterator j = m_Args.begin();
j != m_Args.end(); ++j)
{
errmsg += *j;
errmsg += " ";
}
cmSystemTools::Error(errmsg.c_str());
2001-05-04 16:46:05 +04:00
}
bool cmIfCommand::InitialPass(std::vector<std::string> const& args)
2001-04-20 01:39:03 +04:00
{
if(args.size() < 1 )
{
this->SetError("called with incorrect number of arguments");
return false;
}
2001-08-07 01:01:26 +04:00
// create a function blocker
cmIfFunctionBlocker *f = NULL;
// check for the different signatures
2001-05-01 19:16:20 +04:00
const char *def;
2001-08-07 01:01:26 +04:00
const char *def2;
if (args.size() == 1)
{
def = m_Makefile->GetDefinition(args[0].c_str());
if(cmSystemTools::IsOff(def))
{
f = new cmIfFunctionBlocker();
}
}
2001-05-01 19:16:20 +04:00
if (args.size() == 2 && (args[0] == "NOT"))
2001-04-20 01:39:03 +04:00
{
2001-05-01 19:16:20 +04:00
def = m_Makefile->GetDefinition(args[1].c_str());
if(!cmSystemTools::IsOff(def))
{
2001-08-07 01:01:26 +04:00
f = new cmIfFunctionBlocker();
2001-05-01 19:16:20 +04:00
}
2001-08-07 01:01:26 +04:00
}
if (args.size() == 2 && (args[0] == "COMMAND"))
{
if(!m_Makefile->CommandExists(args[1].c_str()))
{
f = new cmIfFunctionBlocker();
}
}
2002-01-03 00:46:08 +03:00
if (args.size() == 2 && (args[0] == "EXISTS"))
{
if(!cmSystemTools::FileExists(args[1].c_str()))
2002-01-03 00:46:08 +03:00
{
f = new cmIfFunctionBlocker();
}
}
2001-08-07 01:01:26 +04:00
if (args.size() == 3 && (args[1] == "AND"))
{
def = m_Makefile->GetDefinition(args[0].c_str());
def2 = m_Makefile->GetDefinition(args[2].c_str());
2001-08-09 22:58:47 +04:00
if(cmSystemTools::IsOff(def) || cmSystemTools::IsOff(def2))
2001-05-01 19:16:20 +04:00
{
2001-08-07 01:01:26 +04:00
f = new cmIfFunctionBlocker();
2001-05-01 19:16:20 +04:00
}
2001-04-20 01:39:03 +04:00
}
2001-08-07 01:01:26 +04:00
if (args.size() == 3 && (args[1] == "OR"))
2001-04-20 01:39:03 +04:00
{
2001-05-01 19:16:20 +04:00
def = m_Makefile->GetDefinition(args[0].c_str());
2001-08-07 01:01:26 +04:00
def2 = m_Makefile->GetDefinition(args[2].c_str());
2001-08-09 22:58:47 +04:00
if(cmSystemTools::IsOff(def) && cmSystemTools::IsOff(def2))
2001-05-01 19:16:20 +04:00
{
2001-08-07 01:01:26 +04:00
f = new cmIfFunctionBlocker();
2001-05-01 19:16:20 +04:00
}
2001-08-07 01:01:26 +04:00
}
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
2002-01-19 00:45:42 +03:00
if (!def || !regEntry.find(def))
2001-05-01 19:16:20 +04:00
{
2001-08-07 01:01:26 +04:00
f = new cmIfFunctionBlocker();
}
}
2002-05-23 18:32:28 +04:00
if (args.size() == 3 && (args[1] == "LESS"))
{
def = m_Makefile->GetDefinition(args[0].c_str());
def2 = m_Makefile->GetDefinition(args[2].c_str());
if (!def)
{
def = args[0].c_str();
}
if (!def2)
{
def2 = args[2].c_str();
}
if(atof(def) >= atof(def2))
{
f = new cmIfFunctionBlocker();
}
}
if (args.size() == 3 && (args[1] == "GREATER"))
{
def = m_Makefile->GetDefinition(args[0].c_str());
def2 = m_Makefile->GetDefinition(args[2].c_str());
if (!def)
{
def = args[0].c_str();
}
if (!def2)
{
def2 = args[2].c_str();
}
if(atof(def) <= atof(def2))
{
f = new cmIfFunctionBlocker();
}
}
if (args.size() == 3 && (args[1] == "STRLESS"))
{
def = m_Makefile->GetDefinition(args[0].c_str());
def2 = m_Makefile->GetDefinition(args[2].c_str());
if(strcmp(def,def2) >= 0)
{
f = new cmIfFunctionBlocker();
}
}
if (args.size() == 3 && (args[1] == "STRGREATER"))
{
def = m_Makefile->GetDefinition(args[0].c_str());
def2 = m_Makefile->GetDefinition(args[2].c_str());
if(strcmp(def,def2) <= 0)
{
f = new cmIfFunctionBlocker();
}
}
2001-08-07 01:01:26 +04:00
// if we created a function blocker then set its args
if (f)
{
for(std::vector<std::string>::const_iterator j = args.begin();
2001-08-07 01:01:26 +04:00
j != args.end(); ++j)
{
f->m_Args.push_back(*j);
2001-05-01 19:16:20 +04:00
}
2001-08-07 01:01:26 +04:00
m_Makefile->AddFunctionBlocker(f);
2001-04-20 01:39:03 +04:00
}
return true;
}