X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=plugins%2Fmsvc%2Fmsvclinker.cpp;h=8f0ac94e11dbe0e8464b8cef171b07d9111bd5fe;hb=6ce67e1469bf62156ddf64e33644851f9064c6ed;hp=19ee284e0b0a11fe3c0a9dae611e259e0a0e2f89;hpb=4d3a372eeb064d879ce82dfe4066ce8456fcce7b;p=builder.git diff --git a/plugins/msvc/msvclinker.cpp b/plugins/msvc/msvclinker.cpp index 19ee284..8f0ac94 100644 --- a/plugins/msvc/msvclinker.cpp +++ b/plugins/msvc/msvclinker.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include #include #include @@ -33,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) @@ -94,8 +109,13 @@ ExternalTask::Arguments MsvcLinker::_run(const Binary &bin, FS::Path &work_dir) argv.push_back(tool.get_executable()->get_path().str()); argv.push_back("/NOLOGO"); - if(dynamic_cast(&bin)) + string imp_fn; + if(const SharedLibrary *shlib = dynamic_cast(&bin)) + { argv.push_back("/DLL"); + if(const ImportLibrary *imp = shlib->get_import_library()) + imp_fn = relative(imp->get_path(), work_dir).str(); + } BuildInfo binfo; bin.collect_build_info(binfo); @@ -105,9 +125,20 @@ 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()) + argv.push_back("/IMPLIB:"+imp_fn); + else + argv.push_back("/NOIMPLIB"); + + argv.push_back("/NOEXP"); for(Target *d: bin.get_dependencies()) {