X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=plugins%2Fmsvc%2Fmsvclinker.cpp;h=8f0ac94e11dbe0e8464b8cef171b07d9111bd5fe;hb=17783446dddb1a60c5174031c97b13e4d1bc1f8e;hp=5ce9d32112688e36cd65768e8199ae6ade9ea315;hpb=353069077e5a35b5a7aa282fde939b1d1d7f68df;p=builder.git diff --git a/plugins/msvc/msvclinker.cpp b/plugins/msvc/msvclinker.cpp index 5ce9d32..8f0ac94 100644 --- a/plugins/msvc/msvclinker.cpp +++ b/plugins/msvc/msvclinker.cpp @@ -34,6 +34,20 @@ Target *MsvcLinker::create_target(const vector &sources, const string if(sources.empty()) throw invalid_argument("MsvcLinker::create_target"); + if(arg=="import") + { + if(sources.size()!=1) + throw invalid_argument("MsvcLinker::create_target"); + SharedLibrary &shlib = dynamic_cast(*sources.front()); + + ImportLibrary *imp = new ImportLibrary(builder, *shlib.get_component(), shlib); + for(ObjectFile *o: shlib.get_objects()) + imp->add_dependency(*o); + shlib.add_side_effect(*imp); + + return imp; + } + vector objs; objs.reserve(sources.size()); for(Target *s: sources) @@ -42,34 +56,13 @@ Target *MsvcLinker::create_target(const vector &sources, const string const Component &comp = *objs.front()->get_component(); Binary *bin = 0; if(arg=="shared") - { - SharedLibrary *shlib = new SharedLibrary(builder, comp, objs); - bin = shlib; - ImportLibrary *imp = new ImportLibrary(builder, comp, *shlib); - for(ObjectFile *o: objs) - imp->add_dependency(*o); - imp->set_tool(*this); - shlib->add_side_effect(*imp); - } + bin = new SharedLibrary(builder, comp, objs); else bin = new Executable(builder, comp, objs); bin->set_tool(*this); return bin; } -Target *MsvcLinker::create_install(Target &target) const -{ - if(SharedLibrary *shlib = dynamic_cast(&target)) - { - Tool © = builder.get_toolchain().get_tool("CP"); - InstalledFile *inst_tgt = dynamic_cast(copy.create_target(target)); - builder.get_build_graph().add_installed_target(*shlib->get_import_library()); - return inst_tgt; - } - else - return 0; -} - string MsvcLinker::create_build_signature(const BuildInfo &binfo) const { string result = Tool::create_build_signature(binfo); @@ -132,7 +125,12 @@ ExternalTask::Arguments MsvcLinker::_run(const Binary &bin, FS::Path &work_dir) if(binfo.strip) argv.push_back("/INCREMENTAL:NO"); else + { argv.push_back("/DEBUG:FULL"); + FS::Path temp_dir = bin.get_package()->get_temp_directory()/bin.get_component()->get_name(); + FS::Path ilk_path = temp_dir/(FS::basepart(FS::basename(bin.get_path()))+".ilk"); + argv.push_back("/ILK:"+relative(ilk_path, work_dir).str()); + } argv.push_back("/OUT:"+relative(bin.get_path(), work_dir).str()); if(!imp_fn.empty()) @@ -140,6 +138,8 @@ ExternalTask::Arguments MsvcLinker::_run(const Binary &bin, FS::Path &work_dir) else argv.push_back("/NOIMPLIB"); + argv.push_back("/NOEXP"); + for(Target *d: bin.get_dependencies()) { FileTarget *file = dynamic_cast(d);