X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fgnulinker.cpp;h=02708cc9b68d2a2587d92691fa72d788f6e329bd;hb=7ed7c30ee0ceb734f17fe0c6d4bc6d37fb2ab5a7;hp=cd40a853cac56ffe8d06295c4bb9c96650e9c7cf;hpb=98ad5711a0c56d9783a0d22b932e9b55ddd30ba2;p=builder.git diff --git a/source/gnulinker.cpp b/source/gnulinker.cpp index cd40a85..02708cc 100644 --- a/source/gnulinker.cpp +++ b/source/gnulinker.cpp @@ -49,7 +49,7 @@ GnuLinker::~GnuLinker() delete cxx_linker; } -Target *GnuLinker::create_target(const list &sources, const string &arg) const +Target *GnuLinker::create_target(const list &sources, const string &arg) { if(sources.empty()) throw invalid_argument("GnuLinker::create_target"); @@ -74,11 +74,8 @@ Target *GnuLinker::create_target(const list &sources, const string &ar SharedLibrary *shlib = new SharedLibrary(builder, comp, objs); if(architecture->get_system()=="windows") { - ExportDefinitions *exp = new ExportDefinitions(builder, comp, *shlib); - shlib->add_side_effect(*exp); - const Tool &dlltool = builder.get_toolchain().get_tool("DLL"); - ImportLibrary *imp = dynamic_cast(dlltool.create_target(*exp)); - shlib->set_import_library(imp); + Tool &dlltool = builder.get_toolchain().get_tool("DLL"); + dlltool.create_target(*shlib); } bin = shlib; } @@ -92,10 +89,10 @@ Target *GnuLinker::create_install(Target &target) const { if(SharedLibrary *shlib = dynamic_cast(&target)) { - const Tool © = builder.get_toolchain().get_tool("CP"); + Tool © = builder.get_toolchain().get_tool("CP"); InstalledFile *inst_tgt = dynamic_cast(copy.create_target(target)); if(architecture->get_system()=="windows") - builder.add_installed_target(*shlib->get_import_library()); + builder.get_build_graph().add_installed_target(*shlib->get_import_library()); else { const Pattern &pattern = architecture->get_shared_library_patterns().front(); @@ -115,28 +112,12 @@ Task *GnuLinker::run(const Target &) const } -GnuLinker::Linker::Linker(GnuLinker &p, const string &compiler_tag): - SubTool(p) -{ - const Tool &compiler = builder.get_toolchain().get_tool(compiler_tag); - if(dynamic_cast(&compiler)) - executable = compiler.get_executable(); - else - { - string command; - if(compiler_tag=="CC") - command = "gcc"; - else if(compiler_tag=="CXX") - 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); - } -} +GnuLinker::Linker::Linker(GnuLinker &p, const string &ct): + SubTool(p), + compiler_tag(ct) +{ } -Target *GnuLinker::Linker::create_target(const list &sources, const string &arg) const +Target *GnuLinker::Linker::create_target(const list &sources, const string &arg) { return parent.create_target(sources, arg); } @@ -161,6 +142,28 @@ string GnuLinker::Linker::create_build_signature(const BuildInfo &binfo) const return result; } +void GnuLinker::Linker::do_prepare() +{ + Tool &compiler = builder.get_toolchain().get_tool(compiler_tag); + if(dynamic_cast(&compiler)) + { + compiler.prepare(); + executable = compiler.get_executable(); + } + else + { + string command; + if(compiler_tag=="CC") + command = "gcc"; + else if(compiler_tag=="CXX") + command = "g++"; + else + throw invalid_argument("GnuLinker::Linker::Linker"); + + set_executable(command, true); + } +} + Task *GnuLinker::Linker::run(const Target &target) const { const Binary &bin = dynamic_cast(target); @@ -176,12 +179,6 @@ Task *GnuLinker::Linker::run(const Target &target) const { argv.push_back("-shared"); argv.push_back("-fPIC"); - const Target::Dependencies &side_eff = target.get_side_effects(); - for(Target::Dependencies::const_iterator i=side_eff.begin(); i!=side_eff.end(); ++i) - { - if(ExportDefinitions *exp = dynamic_cast(*i)) - argv.push_back("-Wl,--output-def,"+relative(exp->get_path(), work_dir).str()); - } if(architecture->get_system()!="windows" && !shlib->get_soname().empty()) argv.push_back("-Wl,-soname,"+shlib->get_soname()); } @@ -206,12 +203,13 @@ Task *GnuLinker::Linker::run(const Target &target) const const Target::Dependencies &depends = target.get_dependencies(); for(Target::Dependencies::const_iterator i=depends.begin(); i!=depends.end(); ++i) { + FileTarget *file = dynamic_cast(*i); Target *tgt = (*i)->get_real_target(); if(ObjectFile *obj = dynamic_cast(tgt)) argv.push_back(relative(obj->get_path(), work_dir).str()); else if(StaticLibrary *stlib = dynamic_cast(tgt)) - argv.push_back(stlib->get_path().str()); + argv.push_back((file?file:stlib)->get_path().str()); else if(SharedLibrary *shlib = dynamic_cast(tgt)) { argv.push_back("-l"+shlib->get_libname()); @@ -223,7 +221,7 @@ Task *GnuLinker::Linker::run(const Target &target) const if(shlib) argv.push_back("-l"+shlib->get_libname()); else - argv.push_back(imp->get_path().str()); + argv.push_back((file?file:imp)->get_path().str()); static_link_ok = false; } }