]> git.tdb.fi Git - builder.git/blob - source/condition.cpp
Adjust requires to library changes
[builder.git] / source / condition.cpp
1 #include <msp/strings/utils.h>
2 #include "condition.h"
3 #include "package.h"
4
5 using namespace std;
6 using namespace Msp;
7
8 #include <iostream>
9
10 Condition::Condition(Package &p, const string &expr):
11         pkg(p)
12 {
13         vector<string> parts=split(expr);
14
15         for(vector<string>::iterator i=parts.begin(); i!=parts.end(); ++i)
16         {
17                 if(*i=="and")
18                         continue;
19                 
20                 unsigned token=i->find_first_of("=!");
21                 if(token==string::npos)
22                         expression.insert(StringMap::value_type(*i, "!0"));
23                 else if(token==0 && (*i)[0]=='!')
24                         expression.insert(StringMap::value_type(*i, "=0"));
25                 else
26                         expression.insert(StringMap::value_type(i->substr(0, token), i->substr(token)));
27         }
28 }
29
30 void Condition::resolve_refs()
31 {
32         for(PkgRefList::iterator i=requires.begin(); i!=requires.end(); ++i)
33                 i->resolve();
34 }
35
36 bool Condition::eval()
37 {
38         const Config &conf=pkg.get_config();
39
40         bool result=true;
41         for(StringMap::iterator i=expression.begin(); i!=expression.end(); ++i)
42         {
43                 bool neg=(i->second[0]=='!');
44                 unsigned start=1;
45                 if(i->second[1]=='=')
46                         ++start;
47
48                 if((conf.get_option(i->first).value==i->second.substr(start))==neg)
49                         result=false;
50         }
51
52         return result;
53 }
54
55
56 Condition::Loader::Loader(Condition &c):
57         cond(c)
58 {
59         add("require",    &Loader::require);
60         add("build_info", &Loader::build_info);
61 }
62
63 void Condition::Loader::require(const string &pkg)
64 {
65         cond.requires.push_back(PackageRef(cond.pkg.get_builder(), pkg));
66 }
67
68 void Condition::Loader::build_info()
69 {
70         load_sub(cond.build_info);
71 }