They should not be created for modules. The linker is still used to
create them since the process is quite different between toolchains.
{
if(sources.empty())
throw invalid_argument("GnuLinker::create_target");
{
if(sources.empty())
throw invalid_argument("GnuLinker::create_target");
+
+ if(arg=="import")
+ {
+ if(sources.size()!=1)
+ throw invalid_argument("GnuLinker::create_target");
+ SharedLibrary &shlib = dynamic_cast<SharedLibrary &>(*sources.front());
+ if(architecture->get_system()!="windows")
+ return 0;
+
+ Tool &dlltool = builder.get_toolchain().get_tool("DLL");
+ return dlltool.create_target(shlib);
+ }
+
vector<ObjectFile *> objs;
objs.reserve(sources.size());
for(Target *s: sources)
vector<ObjectFile *> objs;
objs.reserve(sources.size());
for(Target *s: sources)
const Component &comp = *objs.front()->get_component();
Binary *bin = 0;
if(arg=="shared")
const Component &comp = *objs.front()->get_component();
Binary *bin = 0;
if(arg=="shared")
- {
- SharedLibrary *shlib = new SharedLibrary(builder, comp, objs);
- if(architecture->get_system()=="windows")
- {
- Tool &dlltool = builder.get_toolchain().get_tool("DLL");
- dlltool.create_target(*shlib);
- }
- bin = shlib;
- }
+ bin = new SharedLibrary(builder, comp, objs);
else
bin = new Executable(builder, comp, objs);
bin->set_tool(*this);
else
bin = new Executable(builder, comp, objs);
bin->set_tool(*this);
{
Tool © = builder.get_toolchain().get_tool("CP");
InstalledFile *inst_tgt = dynamic_cast<InstalledFile *>(copy.create_target(target));
{
Tool © = builder.get_toolchain().get_tool("CP");
InstalledFile *inst_tgt = dynamic_cast<InstalledFile *>(copy.create_target(target));
- if(architecture->get_system()=="windows")
- builder.get_build_graph().add_installed_target(*shlib->get_import_library());
- else
+ if(architecture->get_system()!="windows")
{
string link_name = architecture->create_filename<SharedLibrary>(shlib->get_libname());
if(link_name!=FS::basename(inst_tgt->get_path()))
{
string link_name = architecture->create_filename<SharedLibrary>(shlib->get_libname());
if(link_name!=FS::basename(inst_tgt->get_path()))
if(sources.empty())
throw invalid_argument("MsvcLinker::create_target");
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)
vector<ObjectFile *> objs;
objs.reserve(sources.size());
for(Target *s: sources)
const Component &comp = *objs.front()->get_component();
Binary *bin = 0;
if(arg=="shared")
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;
}
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);
string MsvcLinker::create_build_signature(const BuildInfo &binfo) const
{
string result = Tool::create_build_signature(binfo);
MsvcLinker(Builder &, const Architecture &, const MicrosoftTools &);
Target *create_target(const std::vector<Target *> &, const std::string &) override;
MsvcLinker(Builder &, const Architecture &, const MicrosoftTools &);
Target *create_target(const std::vector<Target *> &, const std::string &) override;
- Target *create_install(Target &) const override;
std::string create_build_signature(const BuildInfo &) const override;
protected:
std::string create_build_signature(const BuildInfo &) const override;
protected:
Binary(Builder &, const Component &, const std::string &, const std::vector<ObjectFile *> &);
public:
Binary(Builder &, const Component &, const std::string &, const std::vector<ObjectFile *> &);
public:
+ const std::vector<ObjectFile *> &get_objects() const { return objects; }
void collect_build_info(BuildInfo &) const override;
protected:
void collect_build_info(BuildInfo &) const override;
protected:
}
vector<Target *> results;
}
vector<Target *> results;
if(type==LIBRARY)
{
Tool &archiver = toolchain.get_tool("AR");
if(type==LIBRARY)
{
Tool &archiver = toolchain.get_tool("AR");
- results.push_back(linker.create_target(objs, "shared"));
+ Target *shlib = linker.create_target(objs, "shared");
+ results.push_back(shlib);
+ if(Target *imp = linker.create_target(*shlib, "import"))
+ results.push_back(imp);
results.push_back(archiver.create_target(objs));
}
else if(type==MODULE)
results.push_back(archiver.create_target(objs));
}
else if(type==MODULE)