X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcomponent.cpp;h=fdc0a6d02d572d945dbeb376e6f4a2d63dd217fc;hb=445edbc3c42bbd7880cc414cf153ddfd196bfc1c;hp=97fdacd66ac8f221871052be29e1727ba424b337;hpb=74266a6e650f019063cdcd1c9a7bd26d8f99041b;p=builder.git diff --git a/source/component.cpp b/source/component.cpp index 97fdacd..fdc0a6d 100644 --- a/source/component.cpp +++ b/source/component.cpp @@ -1,3 +1,4 @@ +#include #include "component.h" #include "package.h" @@ -7,7 +8,9 @@ Component::Component(Package &p, Type t, const string &n): pkg(p), type(t), name(n), - install(false) + install(false), + module_host(0), + modular(false) { } /** @@ -30,10 +33,22 @@ void Component::create_build_info() { if(!i->get_package()) continue; - i->get_package()->create_build_info(); + //i->get_package()->create_build_info(); build_info.add(i->get_package()->get_exported_binfo()); } + if(modular) + { + build_info.ldflags.push_back("-rdynamic"); + build_info.libs.push_back("dl"); + } + else if(module_host) + { + const PathList &host_src=module_host->get_sources(); + for(PathList::const_iterator i=host_src.begin(); i!=host_src.end(); ++i) + build_info.incpath.push_back(i->str()); + } + build_info.unique(); } @@ -45,6 +60,8 @@ Component::Loader::Loader(Component &c): add("install_headers", &Component::install_headers); add("build_info", &Loader::build_info); add("require", &Loader::require); + add("modular", &Loader::modular); + add("host", &Loader::host); } void Component::Loader::source(const string &s) @@ -57,6 +74,28 @@ void Component::Loader::require(const string &n) comp.requires.push_back(PackageRef(comp.pkg.get_builder(), n)); } +void Component::Loader::modular() +{ + if(comp.type!=PROGRAM) + throw Msp::Exception("Only programs can be modular"); + comp.modular=true; +} + +void Component::Loader::host(const string &n) +{ + const ComponentList &comps=comp.pkg.get_components(); + for(ComponentList::const_iterator i=comps.begin(); i!=comps.end(); ++i) + if(i->get_name()==n) + { + if(i->get_type()!=PROGRAM || !i->get_modular()) + throw Msp::Exception("Module host must be a modular program"); + comp.module_host=&*i; + return; + } + + throw Msp::Exception("Unknown component"); +} + void Component::Loader::build_info() { load_sub(comp.build_info);