using namespace std;
using namespace Msp;
-GnuLinker::GnuLinker(Builder &b):
- Tool(b, "LINK")
+GnuLinker::GnuLinker(Builder &b, const Architecture &a):
+ Tool(b, a, "LINK")
{
input_suffixes.push_back(".o");
input_suffixes.push_back(".a");
- const Architecture &arch = builder.get_current_arch();
- if(arch.is_native())
+ if(architecture->is_native())
{
system_path.push_back("/lib");
system_path.push_back("/usr/lib");
- if(arch.match_name("pc-32-linux"))
+ if(architecture->match_name("pc-32-linux"))
system_path.push_back("/usr/lib/i386-linux-gnu");
- else if(arch.match_name("pc-64-linux"))
+ else if(architecture->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");
+ system_path.push_back("/usr/"+architecture->get_cross_prefix()+"/lib");
default_linker = new Linker(*this, "CC");
cxx_linker = new Linker(*this, "CXX");
delete cxx_linker;
}
-Target *GnuLinker::create_target(const list<Target *> &sources, const std::string &arg) const
+Target *GnuLinker::create_target(const list<Target *> &sources, const string &arg) const
{
if(sources.empty())
throw invalid_argument("GnuLinker::create_target");
throw invalid_argument("GnuLinker::create_target");
}
- const Component &comp = objs.front()->get_component();
+ const Component &comp = *objs.front()->get_component();
Binary *bin = 0;
if(arg=="shared")
bin = new SharedLibrary(builder, comp, objs);
command = "g++";
else
throw invalid_argument("GnuLinker::Linker::Linker");
+ if(architecture->is_cross())
+ command = format("%s-%s", architecture->get_cross_prefix(), command);
executable = builder.get_vfs().find_binary(command);
}
}
if(!shlib->get_soname().empty())
argv.push_back("-Wl,-soname,"+shlib->get_soname());
}
- else if(comp.get_package().get_library_mode()==ALL_STATIC)
- argv.push_back("-static");
const BuildInfo &binfo = comp.get_build_info();
for(BuildInfo::PathList::const_iterator i=binfo.libpath.begin(); i!=binfo.libpath.end(); ++i)
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()));
+ if(architecture->get_bits()!=native_arch.get_bits())
+ argv.push_back(format("-m%d", architecture->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());
+ bool static_link_ok = (comp.get_package().get_library_mode()<=STATIC);
+
const Target::Dependencies &depends = target.get_depends();
for(Target::Dependencies::const_iterator i=depends.begin(); i!=depends.end(); ++i)
{
else if(StaticLibrary *stlib = dynamic_cast<StaticLibrary *>(tgt))
argv.push_back(stlib->get_path().str());
else if(SharedLibrary *shlib = dynamic_cast<SharedLibrary *>(tgt))
+ {
argv.push_back("-l"+shlib->get_libname());
+ static_link_ok = false;
+ }
}
+ if(static_link_ok)
+ argv.push_back("-static");
+
if(!builder.get_dry_run())
FS::mkpath(FS::dirname(bin.get_path()), 0755);