X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fexecutable.cpp;h=ff1312205af0adf870a8ae040f271900eff5e02c;hb=7aeaa4ba965f596edad438c02e345a8843f7469a;hp=db8bd11db0b3c832790d3cbdbef4d2f717ad80fd;hpb=b6dcf65b5e1b99f6c65454358c7610f3e9c8af2b;p=builder.git diff --git a/source/executable.cpp b/source/executable.cpp index db8bd11..ff13122 100644 --- a/source/executable.cpp +++ b/source/executable.cpp @@ -1,5 +1,11 @@ +/* $Id$ + +This file is part of builder +Copyright © 2006-2007 Mikko Rasa, Mikkosoft Productions +Distributed under the LGPL +*/ + #include -#include #include "builder.h" #include "component.h" #include "executable.h" @@ -27,7 +33,7 @@ Finds and adds any required libraries to the dependencies. void Executable::find_depends() { LibMode libmode=package->get_library_mode(); - + list queue; list dep_libs; queue.push_back(&comp); @@ -35,17 +41,17 @@ void Executable::find_depends() { const Component *c=queue.front(); queue.erase(queue.begin()); - + + const StringList &libpath=c->get_build_info().libpath; + const string &arch=c->get_package().get_arch(); + 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); + Target *lib=builder.get_library(*i, arch, libpath, libmode); if(lib) { - if(contains(depends, lib)) - continue; - - dep_libs.push_front(lib); + dep_libs.push_back(lib); if(dynamic_cast(lib)) lib=lib->get_depends().front(); @@ -58,8 +64,16 @@ void Executable::find_depends() } } + /* Add only the last occurrence of each library to the actual dependencies. + This ensures that static library ordering is correct. */ for(list::iterator i=dep_libs.begin(); i!=dep_libs.end(); ++i) - add_depend(*i); + { + bool last=true; + for(list::iterator j=i; (last && j!=dep_libs.end()); ++j) + last=(j==i || *j!=*i); + if(last) + add_depend(*i); + } deps_ready=true; }