#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>
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;
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 © = 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);
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);
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())
{