-/* $Id$
-
-This file is part of builder
-Copyright © 2006-2007 Mikko Rasa, Mikkosoft Productions
-Distributed under the LGPL
-*/
-
#include <msp/strings/utils.h>
+#include "builder.h"
#include "condition.h"
-#include "package.h"
+#include "sourcepackage.h"
using namespace std;
using namespace Msp;
-#include <iostream>
-
-Condition::Condition(Package &p, const string &expr):
+Condition::Condition(SourcePackage &p, const string &expr):
pkg(p)
{
- vector<string> parts=split(expr);
+ vector<string> parts = split(expr);
for(vector<string>::iterator i=parts.begin(); i!=parts.end(); ++i)
{
if(*i=="and")
continue;
-
- unsigned token=i->find_first_of("=!");
+
+ string::size_type token = i->find_first_of("=!");
if(token==string::npos)
- expression.insert(StringMap::value_type(*i, "!0"));
+ expression.insert(StringMap::value_type(*i, "="));
else if(token==0 && (*i)[0]=='!')
- expression.insert(StringMap::value_type(*i, "=0"));
+ expression.insert(StringMap::value_type(i->substr(1), "!"));
else
expression.insert(StringMap::value_type(i->substr(0, token), i->substr(token)));
}
}
-void Condition::resolve_refs()
-{
- for(PkgRefList::iterator i=requires.begin(); i!=requires.end(); ++i)
- i->resolve();
-}
-
bool Condition::eval()
{
- const Config &conf=pkg.get_config();
+ const Config &conf = pkg.get_config();
- bool result=true;
+ bool result = true;
for(StringMap::iterator i=expression.begin(); i!=expression.end(); ++i)
{
- bool neg=(i->second[0]=='!');
- unsigned start=1;
+ bool neg = (i->second[0]=='!');
+ unsigned start = 1;
if(i->second[1]=='=')
++start;
+ string value = i->second.substr(start);
+
+ bool match = false;
+ if(conf.is_option(i->first))
+ {
+ if(value.empty())
+ match = lexical_cast<bool>(conf.get_option(i->first).value);
+ else
+ match = (conf.get_option(i->first).value==value);
+ }
+ else if(i->first=="arch")
+ match = pkg.get_builder().get_current_arch().match_name(value);
- if((conf.get_option(i->first).value==i->second.substr(start))==neg)
- result=false;
+ if(match==neg)
+ result = false;
}
return result;
Condition::Loader::Loader(Condition &c):
- cond(c)
+ DataFile::ObjectLoader<Condition>(c)
{
add("require", &Loader::require);
add("build_info", &Loader::build_info);
void Condition::Loader::require(const string &pkg)
{
- cond.requires.push_back(PackageRef(cond.pkg.get_builder(), pkg));
+ obj.requires.push_back(pkg);
}
void Condition::Loader::build_info()
{
- load_sub(cond.build_info);
+ load_sub(obj.build_info);
}