X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fgnulinker.cpp;h=114bf09c84404910f480a904aa952761366eb2fa;hb=82ae60a647ebb9567f7177c353245f4d72faaf5e;hp=ce51c44ae503cefb58fdefc6d026b9f7071f46ed;hpb=728b2f65fadd5fb5f000d908efa414027123f964;p=builder.git diff --git a/source/gnulinker.cpp b/source/gnulinker.cpp index ce51c44..114bf09 100644 --- a/source/gnulinker.cpp +++ b/source/gnulinker.cpp @@ -7,6 +7,7 @@ #include "builder.h" #include "component.h" #include "executable.h" +#include "exportdefinitions.h" #include "externaltask.h" #include "gnucompiler.h" #include "gnulinker.h" @@ -69,7 +70,18 @@ Target *GnuLinker::create_target(const list &sources, const string &ar const Component &comp = *objs.front()->get_component(); Binary *bin = 0; if(arg=="shared") - bin = new SharedLibrary(builder, comp, objs); + { + 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); + } + bin = shlib; + } else bin = new Executable(builder, comp, objs); bin->set_tool(*linker); @@ -82,8 +94,13 @@ Target *GnuLinker::create_install(Target &target) const { const Tool © = builder.get_toolchain().get_tool("CP"); InstalledFile *inst_tgt = dynamic_cast(copy.create_target(target)); - const Pattern &pattern = architecture->get_shared_library_patterns().front(); - inst_tgt->set_symlink(pattern.apply(shlib->get_libname())); + if(architecture->get_system()=="windows") + builder.add_installed_target(*shlib->get_import_library()); + else + { + const Pattern &pattern = architecture->get_shared_library_patterns().front(); + inst_tgt->set_symlink(pattern.apply(shlib->get_libname())); + } return inst_tgt; } else @@ -151,11 +168,19 @@ Task *GnuLinker::Linker::run(const Target &target) const const Component &comp = *bin.get_component(); + FS::Path work_dir = comp.get_package().get_source_directory(); + if(const SharedLibrary *shlib = dynamic_cast(&bin)) { argv.push_back("-shared"); argv.push_back("-fPIC"); - if(!shlib->get_soname().empty()) + 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()); } @@ -171,8 +196,6 @@ Task *GnuLinker::Linker::run(const Target &target) const 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_directory(); - argv.push_back("-o"); argv.push_back(relative(bin.get_path(), work_dir).str()); @@ -194,7 +217,11 @@ Task *GnuLinker::Linker::run(const Target &target) const } else if(ImportLibrary *imp = dynamic_cast(tgt)) { - argv.push_back(imp->get_path().str()); + shlib = imp->get_shared_library(); + if(shlib) + argv.push_back("-l"+shlib->get_libname()); + else + argv.push_back(imp->get_path().str()); static_link_ok = false; } }