]> git.tdb.fi Git - builder.git/blobdiff - source/condition.cpp
Adjust requires to library changes
[builder.git] / source / condition.cpp
diff --git a/source/condition.cpp b/source/condition.cpp
new file mode 100644 (file)
index 0000000..97e93f1
--- /dev/null
@@ -0,0 +1,71 @@
+#include <msp/strings/utils.h>
+#include "condition.h"
+#include "package.h"
+
+using namespace std;
+using namespace Msp;
+
+#include <iostream>
+
+Condition::Condition(Package &p, const string &expr):
+       pkg(p)
+{
+       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("=!");
+               if(token==string::npos)
+                       expression.insert(StringMap::value_type(*i, "!0"));
+               else if(token==0 && (*i)[0]=='!')
+                       expression.insert(StringMap::value_type(*i, "=0"));
+               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();
+
+       bool result=true;
+       for(StringMap::iterator i=expression.begin(); i!=expression.end(); ++i)
+       {
+               bool neg=(i->second[0]=='!');
+               unsigned start=1;
+               if(i->second[1]=='=')
+                       ++start;
+
+               if((conf.get_option(i->first).value==i->second.substr(start))==neg)
+                       result=false;
+       }
+
+       return result;
+}
+
+
+Condition::Loader::Loader(Condition &c):
+       cond(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));
+}
+
+void Condition::Loader::build_info()
+{
+       load_sub(cond.build_info);
+}