]> git.tdb.fi Git - builder.git/blobdiff - source/sourcepackage.cpp
Recognize PowerPC architecture
[builder.git] / source / sourcepackage.cpp
index e3f11097bfd7693f8333c7c82eca5c227fc45832..ddfa00fb9bf3175eb59a7391b2e16cd38555370b 100644 (file)
@@ -4,10 +4,12 @@
 #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"
 #include "tool.h"
+#include "sourcegenerator.h"
 #include "sourcepackage.h"
 
 using namespace std;
@@ -62,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)
@@ -102,8 +92,14 @@ void SourcePackage::do_prepare()
        build_info.libpath.push_back((builder.get_prefix()/"lib").str());
 
        for(FeatureList::iterator i=features.begin(); i!=features.end(); ++i)
-               if(lexical_cast<bool>(config.get_option("with_"+i->name).value))
-                       build_info.defines["WITH_"+toupper(i->name)] = "1";
+       {
+               string ident = "WITH_"+toupper(i->name);
+               string value = config.get_option("with_"+i->name).value;
+               if(!i->choices.empty())
+                       build_info.defines[ident] = value;
+               else if(lexical_cast<bool>(value))
+                       build_info.defines[ident] = "1";
+       }
 
        bool export_paths = false;
        for(list<Component>::iterator i=components.begin(); i!=components.end(); ++i)
@@ -166,6 +162,7 @@ void SourcePackage::Loader::init(const Config::InputOptions *o)
        add("description", &SourcePackage::description);
        add("build_info",  &Loader::build_info);
        add("feature",     &Loader::feature);
+       add("generate",    &Loader::generate);
        add("if_feature",  &Loader::if_feature);
        add("program",     &Loader::component<Component::PROGRAM>);
        add("library",     &Loader::component<Component::LIBRARY>);
@@ -186,17 +183,16 @@ void SourcePackage::Loader::finish()
 void SourcePackage::Loader::feature(const string &n, const string &d)
 {
        Feature feat(n);
-       feat.descr = d;
-       feat.def_value = "no";
+       feat.description = d;
        load_sub(feat);
        obj.features.push_back(feat);
-       string config_key = "with_"+feat.name;
-       obj.config.add_option(config_key, feat.def_value, feat.descr);
+
+       const Config::Option &opt = obj.config.add_option(feat);
        if(options)
        {
-               Config::InputOptions::const_iterator i = options->find(config_key);
+               Config::InputOptions::const_iterator i = options->find(opt.name);
                if(i!=options->end())
-                       obj.config.set_option(config_key, i->second);
+                       obj.config.set_option(opt.name, i->second);
        }
 }
 
@@ -213,9 +209,17 @@ void SourcePackage::Loader::build_info()
        load_sub(obj.build_info);
 }
 
+void SourcePackage::Loader::generate(const string &tag)
+{
+       SourceGenerator *gen = new SourceGenerator(obj.builder, obj, tag);
+       load_sub(*gen);
+       obj.local_tools.add_tool(gen);
+}
+
 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);