]> git.tdb.fi Git - builder.git/blobdiff - source/sourcepackage.cpp
Don't use soname for modules
[builder.git] / source / sourcepackage.cpp
index b84b22a58f0a33ea326cfc99845e9363ade5081c..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;
@@ -37,11 +39,6 @@ SourcePackage::SourcePackage(Builder &b, const string &n, const FS::Path &f):
        source_tarball = &components.back();
 }
 
-void SourcePackage::set_build_type(const BuildType &t)
-{
-       build_type = &t;
-}
-
 FS::Path SourcePackage::get_temp_directory() const
 {
        string subdir = builder.get_current_arch().get_name();
@@ -67,25 +64,18 @@ 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)
+{
+       build_type = &t;
 }
 
 void SourcePackage::do_prepare()
@@ -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,67 +162,40 @@ void SourcePackage::Loader::init(const Config::InputOptions *o)
        add("description", &SourcePackage::description);
        add("build_info",  &Loader::build_info);
        add("feature",     &Loader::feature);
-       add("if",          &Loader::condition);
+       add("generate",    &Loader::generate);
        add("if_feature",  &Loader::if_feature);
        add("program",     &Loader::component<Component::PROGRAM>);
        add("library",     &Loader::component<Component::LIBRARY>);
        add("module",      &Loader::component<Component::MODULE>);
-       add("headers",     &Loader::headers);
        add("install",     &Loader::component<Component::INSTALL>);
        add("interface_version", &Loader::interface_version);
-       add("datafile",    &Loader::component<Component::DATAFILE>);
+       add("datapack",    &Loader::component<Component::DATAPACK>);
        add("source_tarball", &Loader::source_tarball);
        add("tarball",     &Loader::tarball);
-       add("tar_file",    &Loader::tar_file);
        add("version",     &Loader::version);
 }
 
 void SourcePackage::Loader::finish()
 {
        obj.components.sort(component_sort);
-
-       for(map<string, string>::const_iterator i=install_map.begin(); i!=install_map.end(); ++i)
-       {
-               for(ComponentList::iterator j=obj.components.begin(); j!=obj.components.end(); ++j)
-               {
-                       const Component::SourceList &sources = j->get_sources();
-                       for(Component::SourceList::const_iterator k=sources.begin(); k!=sources.end(); ++k)
-                       {
-                               string k_str = k->str();
-                               if(!i->first.compare(0, k_str.size(), k_str))
-                               {
-                                       const_cast<InstallMap &>(j->get_install_map()).add_mapping(obj.source_dir/i->first, i->second);
-                               }
-                       }
-               }
-       }
 }
 
 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);
        }
 }
 
-void SourcePackage::Loader::condition(const string &c)
-{
-       IO::print("%s: Note: Old-style conditions are deprecated\n", get_source());
-       Condition cond(obj, c);
-       if(cond.eval())
-               load_sub_with(*this);
-}
-
 template<Component::Type t>
 void SourcePackage::Loader::component(const string &n)
 {
@@ -240,19 +209,17 @@ void SourcePackage::Loader::build_info()
        load_sub(obj.build_info);
 }
 
-void SourcePackage::Loader::headers(const string &n)
+void SourcePackage::Loader::generate(const string &tag)
 {
-       IO::print("%s: Note: headers components are deprecated\n", get_source());
-       Component comp(obj, Component::LIBRARY, n);
-       load_sub(comp);
-       const Component::SourceList &sources = comp.get_sources();
-       for(Component::SourceList::const_iterator i=sources.begin(); i!=sources.end(); ++i)
-               install_map[i->str()] = "include/"+comp.get_name();
+       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);
@@ -272,24 +239,8 @@ void SourcePackage::Loader::source_tarball()
 
 void SourcePackage::Loader::tarball(const string &n)
 {
-       if(n=="@src")
-       {
-               IO::print("%s: Note: Use source_tarball instead of tarball \"@src\"\n", get_source());
-               load_sub(*obj.source_tarball);
-       }
-       else
-       {
-               Component trbl(obj, Component::TARBALL, n);
-               load_sub(trbl);
-       }
-}
-
-void SourcePackage::Loader::tar_file(const string &f)
-{
-       IO::print("%s: Note: tar_file is deprecated\n", get_source());
-       for(ComponentList::iterator i=obj.components.begin(); i!=obj.components.end(); ++i)
-               if(i->get_type()==Component::TARBALL && i->get_name()=="@src")
-                       const_cast<Component::SourceList &>(i->get_sources()).push_back((obj.source_dir/f).str());
+       Component trbl(obj, Component::TARBALL, n);
+       load_sub(trbl);
 }
 
 void SourcePackage::Loader::version(const string &v)