]> git.tdb.fi Git - builder.git/blobdiff - plugins/msvc/msvclinker.cpp
Place incremental link information files in the temp directory
[builder.git] / plugins / msvc / msvclinker.cpp
index 19ee284e0b0a11fe3c0a9dae611e259e0a0e2f89..d768b236cbb5d7dd7b80812af8776ed0688295e4 100644 (file)
@@ -2,6 +2,7 @@
 #include <msp/builder/component.h>
 #include <msp/builder/executable.h>
 #include <msp/builder/importlibrary.h>
+#include <msp/builder/installedfile.h>
 #include <msp/builder/objectfile.h>
 #include <msp/builder/sharedlibrary.h>
 #include <msp/builder/sourcepackage.h>
@@ -41,13 +42,34 @@ Target *MsvcLinker::create_target(const vector<Target *> &sources, const string
        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);
+               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);
+       }
        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<SharedLibrary *>(&target))
+       {
+               Tool &copy = builder.get_toolchain().get_tool("CP");
+               InstalledFile *inst_tgt = dynamic_cast<InstalledFile *>(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);
@@ -94,8 +116,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<const SharedLibrary *>(&bin))
+       string imp_fn;
+       if(const SharedLibrary *shlib = dynamic_cast<const SharedLibrary *>(&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 +132,18 @@ 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");
 
        for(Target *d: bin.get_dependencies())
        {