X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fexecutable.cpp;h=cd8ceaff2040dc006cf446bc0b7ef80f9a0cd10a;hb=4f78d9f016482ce1ac7d726852e33e07c090df1b;hp=8f8c9a2dc0f2c3d35ff93b0206acc45b6befd26b;hpb=74266a6e650f019063cdcd1c9a7bd26d8f99041b;p=builder.git diff --git a/source/executable.cpp b/source/executable.cpp index 8f8c9a2..cd8ceaf 100644 --- a/source/executable.cpp +++ b/source/executable.cpp @@ -1,11 +1,16 @@ +#include +#include #include "builder.h" #include "component.h" #include "executable.h" +#include "install.h" #include "link.h" #include "objectfile.h" #include "package.h" +#include "staticlibrary.h" using namespace std; +using namespace Msp; Executable::Executable(Builder &b, const Component &c, const list &objs): Target(b, &c.get_package(), generate_target_name(c)), @@ -21,12 +26,40 @@ Finds and adds any required libraries to the dependencies. */ void Executable::find_depends() { - const list &libs=comp.get_build_info().libs; - for(list::const_iterator i=libs.begin(); i!=libs.end(); ++i) + const string &staticlibs=package->get_config().get_option("staticlibs").value; + unsigned libmode=0; + if(staticlibs=="all") + libmode=2; + else if(staticlibs=="local") + libmode=1; + + //XXX Duplicate libraries? + list queue; + queue.push_back(&comp); + while(!queue.empty()) { - Target *lib=builder.get_library(*i, comp.get_build_info().libpath); - if(lib) - add_depend(lib); + const Component *c=queue.front(); + queue.erase(queue.begin()); + + const list &libs=c->get_build_info().libs; + for(StringList::const_iterator i=libs.begin(); i!=libs.end(); ++i) + { + Target *lib=builder.get_library(*i, c->get_build_info().libpath, libmode); + if(lib) + { + if(contains(depends, lib)) + continue; + add_depend(lib); + + if(dynamic_cast(lib)) + lib=lib->get_depends().front(); + if(StaticLibrary *stlib=dynamic_cast(lib)) + queue.push_back(&stlib->get_component()); + } + else + cout<<"Couldn't find library "<<*i<<" for "<