X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcomponent.cpp;h=fdc0a6d02d572d945dbeb376e6f4a2d63dd217fc;hb=55b6c1dba6f02a399d98080c23a75098e8a080f7;hp=bab7ba1e264a3e80e6ebfba74133e2c3fd7a843f;hpb=4dc31cca056ea293d320928f61fef0558089d32d;p=builder.git diff --git a/source/component.cpp b/source/component.cpp index bab7ba1..fdc0a6d 100644 --- a/source/component.cpp +++ b/source/component.cpp @@ -1,3 +1,4 @@ +#include #include "component.h" #include "package.h" @@ -6,18 +7,96 @@ using namespace std; Component::Component(Package &p, Type t, const string &n): pkg(p), type(t), - name(n) + name(n), + install(false), + module_host(0), + modular(false) { } +/** +Tries to resolve all references to packages. +*/ +void Component::resolve_refs() +{ + for(PkgRefList::iterator i=requires.begin(); i!=requires.end(); ++i) + i->resolve(); +} + +/** +Prepares the build information for building. +*/ +void Component::create_build_info() +{ + build_info.add(pkg.get_build_info()); + + for(PkgRefList::iterator i=requires.begin(); i!=requires.end(); ++i) + { + if(!i->get_package()) + continue; + //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(); +} + Component::Loader::Loader(Component &c): comp(c) { add("source", &Loader::source); add("install", &Component::install); 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) { - comp.source=comp.pkg.get_source()/s; + comp.sources.push_back(comp.pkg.get_source()/s); +} + +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); }