X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fexecutable.cpp;h=488dd2966a27279e1d85ac8100f1be51977fdafd;hb=4c11e2a041d2064f44b7eb3dbf1976c35fc8881c;hp=cd8ceaff2040dc006cf446bc0b7ef80f9a0cd10a;hpb=4f78d9f016482ce1ac7d726852e33e07c090df1b;p=builder.git diff --git a/source/executable.cpp b/source/executable.cpp index cd8ceaf..488dd29 100644 --- a/source/executable.cpp +++ b/source/executable.cpp @@ -1,5 +1,12 @@ -#include -#include +/* $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" @@ -7,6 +14,7 @@ #include "link.h" #include "objectfile.h" #include "package.h" +#include "sharedlibrary.h" #include "staticlibrary.h" using namespace std; @@ -26,30 +34,27 @@ Finds and adds any required libraries to the dependencies. */ void Executable::find_depends() { - 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? + LibMode libmode=comp.get_package().get_library_mode(); + if(dynamic_cast(this)) + libmode=DYNAMIC; + list queue; + list dep_libs; queue.push_back(&comp); while(!queue.empty()) { const Component *c=queue.front(); queue.erase(queue.begin()); - + + const StringList &libpath=c->get_build_info().libpath; + 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, libpath, libmode); if(lib) { - if(contains(depends, lib)) - continue; - add_depend(lib); + dep_libs.push_back(lib); if(dynamic_cast(lib)) lib=lib->get_depends().front(); @@ -57,11 +62,21 @@ void Executable::find_depends() queue.push_back(&stlib->get_component()); } else - cout<<"Couldn't find library "<<*i<<" for "<::iterator i=dep_libs.begin(); i!=dep_libs.end(); ++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; } @@ -76,13 +91,25 @@ we need to pass the value to the Target c'tor. */ string Executable::generate_target_name(const Component &c) { - string prefix,suffix; + const SourcePackage &pkg=c.get_package(); + string prefix, suffix; + const string &arch=pkg.get_builder().get_current_arch().get_name(); if(c.get_type()==Component::LIBRARY) { prefix="lib"; - suffix=".so"; + if(arch=="win32") + suffix=".dll"; + else + suffix=".so"; + } + else if(c.get_type()==Component::MODULE) + suffix=".m"; + else if(c.get_type()==Component::PROGRAM) + { + if(arch=="win32") + suffix=".exe"; } - return (c.get_package().get_source()/(prefix+c.get_name()+suffix)).str(); + return (pkg.get_out_dir()/(prefix+c.get_name()+suffix)).str(); }