]> git.tdb.fi Git - builder.git/blobdiff - source/sourcepackage.cpp
Support boolean logic in conditions
[builder.git] / source / sourcepackage.cpp
index dbb759205fe0eef45f3b0b1ded50cfe5ba80a077..ddfa00fb9bf3175eb59a7391b2e16cd38555370b 100644 (file)
@@ -4,6 +4,7 @@
 #include <msp/strings/lexicalcast.h>
 #include <msp/strings/utils.h>
 #include "binarypackage.h"
+#include "booleanevaluator.h"
 #include "builder.h"
 #include "file.h"
 #include "pkgconfigfile.h"
@@ -63,25 +64,13 @@ FS::Path SourcePackage::get_output_directory() const
                return source_dir/arch.get_name();
 }
 
-bool SourcePackage::match_feature(const string &cond) const
+bool SourcePackage::match_feature(const string &feat, const string *comp) const
 {
-       string::size_type equals = cond.find('=');
-       if(equals!=string::npos)
-       {
-               if(equals==0)
-                       throw invalid_argument("SourcePackage::match_feature");
-               bool negate = cond[equals-1]=='!';
-               string feat = cond.substr(0, equals-negate);
-               string value = config.get_option("with_"+feat).value;
-               return (value==cond.substr(equals+1))!=negate;
-       }
+       string value = config.get_option("with_"+feat).value;
+       if(comp)
+               return value==*comp;
        else
-       {
-               bool negate = (cond[0]=='!');
-               string feat = cond.substr(negate);
-               string value = config.get_option("with_"+feat).value;
-               return lexical_cast<bool>(value)!=negate;
-       }
+               return lexical_cast<bool>(value);
 }
 
 void SourcePackage::set_build_type(const BuildType &t)
@@ -229,7 +218,8 @@ void SourcePackage::Loader::generate(const string &tag)
 
 void SourcePackage::Loader::if_feature(const string &cond)
 {
-       bool match = obj.match_feature(cond);
+       BooleanEvaluator eval(sigc::mem_fun(&obj, &SourcePackage::match_feature));
+       bool match = eval.evaluate(cond);
        obj.builder.get_logger().log("configure", format("%s: feature %s %smatched", obj.name, cond, (match ? "" : "not ")));
        if(match)
                load_sub_with(*this);