X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fgnulinker.cpp;h=02708cc9b68d2a2587d92691fa72d788f6e329bd;hb=c194bac9d508999c046a1f56c80b9419f77a8590;hp=7088dfb866ce9fe55be1e51024f3cc2aae9db0ba;hpb=3f1f24c02c5ef21791e5b24ff535d59969cd7625;p=builder.git diff --git a/source/gnulinker.cpp b/source/gnulinker.cpp index 7088dfb..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,7 +74,7 @@ Target *GnuLinker::create_target(const list &sources, const string &ar SharedLibrary *shlib = new SharedLibrary(builder, comp, objs); if(architecture->get_system()=="windows") { - const Tool &dlltool = builder.get_toolchain().get_tool("DLL"); + Tool &dlltool = builder.get_toolchain().get_tool("DLL"); dlltool.create_target(*shlib); } bin = shlib; @@ -89,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(); @@ -112,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); } @@ -158,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);