]> git.tdb.fi Git - builder.git/blobdiff - plugins/msvc/msvclinker.cpp
Explicitly create import libraries from BinaryComponent
[builder.git] / plugins / msvc / msvclinker.cpp
index 5ce9d32112688e36cd65768e8199ae6ade9ea315..31f9a4f8189f8ff9be0549edbb88751e7767b72e 100644 (file)
@@ -34,6 +34,20 @@ Target *MsvcLinker::create_target(const vector<Target *> &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<SharedLibrary &>(*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<ObjectFile *> objs;
        objs.reserve(sources.size());
        for(Target *s: sources)
@@ -42,34 +56,13 @@ Target *MsvcLinker::create_target(const vector<Target *> &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<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);
@@ -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())