#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;
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)
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");
+
+ argv.push_back("/NOEXP");
for(Target *d: bin.get_dependencies())
{