X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fgnulinker.cpp;h=52ae0f3ea45a90a97108435f27edc573e31e5c86;hb=ca18323d45d67243773b03668e79c715aa976441;hp=45cfd7fff4fc2b98c134c57fffdda78d9d3e8b42;hpb=338eefb513953ae55e8e3614c009c242ba8ad74e;p=builder.git diff --git a/source/gnulinker.cpp b/source/gnulinker.cpp index 45cfd7f..52ae0f3 100644 --- a/source/gnulinker.cpp +++ b/source/gnulinker.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include "builder.h" #include "component.h" #include "executable.h" @@ -21,6 +22,19 @@ GnuLinker::GnuLinker(Builder &b): { input_suffixes.push_back(".o"); input_suffixes.push_back(".a"); + + const Architecture &arch = builder.get_current_arch(); + if(arch.is_native()) + { + system_path.push_back("/lib"); + system_path.push_back("/usr/lib"); + if(arch.match_name("pc-32-linux")) + system_path.push_back("/usr/lib/i386-linux-gnu"); + else if(arch.match_name("pc-64-linux")) + system_path.push_back("/usr/lib/x86_64-linux-gnu"); + } + else + system_path.push_back("/usr/"+arch.get_cross_prefix()+"/lib"); } Target *GnuLinker::create_target(const list &sources, const std::string &arg) const @@ -49,27 +63,27 @@ Target *GnuLinker::create_target(const list &sources, const std::strin Task *GnuLinker::run(const Target &target) const { const Binary &bin = dynamic_cast(target); - const SharedLibrary *shlib = dynamic_cast(&bin); string command = "gcc"; - const list &depends = target.get_depends(); - for(list::const_iterator i=depends.begin(); i!=depends.end(); ++i) + const Target::Dependencies &depends = target.get_depends(); + for(Target::Dependencies::const_iterator i=depends.begin(); i!=depends.end(); ++i) if(ObjectFile *obj = dynamic_cast(*i)) { const Tool *tool = obj->get_tool(); - if(dynamic_cast(tool)) + if(tool->get_tag()=="CXX") command = "g++"; } vector argv; argv.push_back(command); - const Component &comp = bin.get_component(); + const Component &comp = *bin.get_component(); - if(shlib) + if(const SharedLibrary *shlib = dynamic_cast(&bin)) { argv.push_back("-shared"); + argv.push_back("-fPIC"); if(!shlib->get_soname().empty()) argv.push_back("-Wl,-soname,"+shlib->get_soname()); } @@ -77,16 +91,23 @@ Task *GnuLinker::run(const Target &target) const argv.push_back("-static"); const BuildInfo &binfo = comp.get_build_info(); - for(list::const_iterator i=binfo.ldflags.begin(); i!=binfo.ldflags.end(); ++i) - argv.push_back(*i); - for(list::const_iterator i=binfo.libpath.begin(); i!=binfo.libpath.end(); ++i) - argv.push_back("-L"+*i); + for(BuildInfo::PathList::const_iterator i=binfo.libpath.begin(); i!=binfo.libpath.end(); ++i) + argv.push_back("-L"+i->str()); + if(binfo.strip) + argv.push_back("-s"); + if(binfo.threads) + argv.push_back("-pthread"); + + const Architecture &arch = builder.get_current_arch(); + const Architecture &native_arch = builder.get_native_arch(); + if(arch.get_bits()!=native_arch.get_bits()) + argv.push_back(format("-m%d", arch.get_bits())); FS::Path work_dir = comp.get_package().get_source(); argv.push_back("-o"); argv.push_back(relative(bin.get_path(), work_dir).str()); - for(TargetList::const_iterator i=depends.begin(); i!=depends.end(); ++i) + for(Target::Dependencies::const_iterator i=depends.begin(); i!=depends.end(); ++i) { Target *tgt = (*i)->get_real_target(); @@ -94,8 +115,8 @@ Task *GnuLinker::run(const Target &target) const argv.push_back(relative(obj->get_path(), work_dir).str()); else if(StaticLibrary *stlib = dynamic_cast(tgt)) argv.push_back(stlib->get_path().str()); - else if(Library *lib = dynamic_cast(tgt)) - argv.push_back("-l"+lib->get_libname()); + else if(SharedLibrary *shlib = dynamic_cast(tgt)) + argv.push_back("-l"+shlib->get_libname()); } if(!builder.get_dry_run())