X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=plugins%2Fmsvc%2Fmsvclinker.cpp;h=8f0ac94e11dbe0e8464b8cef171b07d9111bd5fe;hb=ccc68e3d1097f5e4f9fc17e84901986a77aa6cb2;hp=8008791569a37d2c57816d0e68a8199b6124eddf;hpb=c8e829c219c65ff8e93b6c7b66212ff0876441c5;p=builder.git diff --git a/plugins/msvc/msvclinker.cpp b/plugins/msvc/msvclinker.cpp index 8008791..8f0ac94 100644 --- a/plugins/msvc/msvclinker.cpp +++ b/plugins/msvc/msvclinker.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include #include #include @@ -19,8 +20,8 @@ MsvcLinker::MsvcLinker(Builder &b, const Architecture &a, const MicrosoftTools & Tool(b, &a, "LINK"), ms_tools(m) { - input_suffixes.push_back(".o"); - input_suffixes.push_back(".a"); + input_suffixes.push_back(".obj"); + input_suffixes.push_back(".lib"); processing_unit = COMPONENT; @@ -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()) {