X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fexecutable.cpp;h=db8bd11db0b3c832790d3cbdbef4d2f717ad80fd;hb=b6dcf65b5e1b99f6c65454358c7610f3e9c8af2b;hp=fb1edfb2f2193b34b9f46ff35d0b95817a66b8a4;hpb=4fcc283a4bb1f695bd124006906bcdaba053193f;p=builder.git diff --git a/source/executable.cpp b/source/executable.cpp index fb1edfb..db8bd11 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)), @@ -16,16 +21,46 @@ Executable::Executable(Builder &b, const Component &c, const list add_depend(*i); } +/** +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) + LibMode libmode=package->get_library_mode(); + + list queue; + list dep_libs; + 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; + + dep_libs.push_front(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 "<::iterator i=dep_libs.begin(); i!=dep_libs.end(); ++i) + add_depend(*i); + deps_ready=true; } @@ -34,15 +69,30 @@ Action *Executable::build() return Target::build(new Link(builder, *this));; } +/** +Returns the name for the executable. We can't do this in the constructor since +we need to pass the value to the Target c'tor. +*/ string Executable::generate_target_name(const Component &c) { string prefix,suffix; + const string &arch=c.get_package().get_arch(); 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 (c.get_package().get_out_dir()/(prefix+c.get_name()+suffix)).str(); }