They are required to compile some third-party libraries with Builder.
#include <stdexcept>
#include <msp/builder/builder.h>
#include <msp/builder/component.h>
+#include <msp/builder/exportdefinitions.h>
#include <msp/builder/objectfile.h>
#include <msp/builder/sourcepackage.h>
#include <msp/builder/staticlibrary.h>
Target *GnuArchiver::create_target(const vector<Target *> &sources, const string &)
{
vector<ObjectFile *> objs;
- extract_sources(sources, required(objs));
+ ExportDefinitions *exp = 0; // Unused, for compatibility with LINK
+ if(architecture->get_system()=="windows")
+ extract_sources(sources, required(objs), exp);
+ else
+ extract_sources(sources, required(objs));
const Component &comp = *objs.front()->get_component();
StaticLibrary *lib = new StaticLibrary(builder, comp, objs);
{
input_suffixes.push_back(".o");
input_suffixes.push_back(".a");
+ if(architecture->get_system()=="windows")
+ input_suffixes.push_back(".def");
processing_unit = COMPONENT;
set_run_external(_run);
}
+Target *GnuLinker::create_source(const Component &comp, const FS::Path &path) const
+{
+ if(FS::extpart(FS::basename(path))==".def")
+ return new ExportDefinitions(builder, comp, path);
+ else
+ return 0;
+}
+
Target *GnuLinker::create_target(const vector<Target *> &sources, const string &arg)
{
if(arg=="import")
}
vector<ObjectFile *> objs;
- extract_sources(sources, required(objs));
+ ExportDefinitions *exp = 0;
+ if(architecture->get_system()=="windows")
+ extract_sources(sources, required(objs), exp);
+ else
+ extract_sources(sources, required(objs));
const Component &comp = *objs.front()->get_component();
Binary *bin = 0;
if(arg=="shared")
+ {
bin = new SharedLibrary(builder, comp, objs);
+ if(exp)
+ bin->add_dependency(*exp);
+ }
else
bin = new Executable(builder, comp, objs);
bin->set_tool(*this);
public:
GnuLinker(Builder &, const Architecture &);
+ Target *create_source(const Component &, const Msp::FS::Path &) const override;
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;
#include <msp/builder/component.h>
+#include <msp/builder/exportdefinitions.h>
#include <msp/builder/objectfile.h>
#include <msp/builder/sourcepackage.h>
#include <msp/builder/staticlibrary.h>
Target *MsvcArchiver::create_target(const vector<Target *> &sources, const string &)
{
vector<ObjectFile *> objs;
- extract_sources(sources, required(objs));
+ ExportDefinitions *exp = 0; // Unused, for compatibility with LINK
+ extract_sources(sources, required(objs), exp);
const Component &comp = *objs.front()->get_component();
StaticLibrary *lib = new StaticLibrary(builder, comp, objs);
#include <msp/builder/builder.h>
#include <msp/builder/component.h>
#include <msp/builder/executable.h>
+#include <msp/builder/exportdefinitions.h>
#include <msp/builder/importlibrary.h>
#include <msp/builder/installedfile.h>
#include <msp/builder/objectfile.h>
{
input_suffixes.push_back(".obj");
input_suffixes.push_back(".lib");
+ input_suffixes.push_back(".def");
processing_unit = COMPONENT;
set_run_external(_run);
}
+Target *MsvcLinker::create_source(const Component &comp, const FS::Path &path) const
+{
+ if(FS::extpart(FS::basename(path))==".def")
+ return new ExportDefinitions(builder, comp, path);
+ else
+ return 0;
+}
+
Target *MsvcLinker::create_target(const vector<Target *> &sources, const string &arg)
{
if(arg=="import")
}
vector<ObjectFile *> objs;
- extract_sources(sources, required(objs));
+ ExportDefinitions *exp = 0;
+ extract_sources(sources, required(objs), exp);
const Component &comp = *objs.front()->get_component();
Binary *bin = 0;
if(arg=="shared")
+ {
bin = new SharedLibrary(builder, comp, objs);
+ if(exp)
+ bin->add_dependency(*exp);
+ }
else
bin = new Executable(builder, comp, objs);
bin->set_tool(*this);
if(ObjectFile *obj = dynamic_cast<ObjectFile *>(tgt))
argv.push_back(relative(obj->get_path(), work_dir).str());
+ else if(ExportDefinitions *exp = dynamic_cast<ExportDefinitions *>(tgt))
+ argv.push_back("/DEF:"+relative(exp->get_path(), work_dir).str());
else if(StaticLibrary *stlib = dynamic_cast<StaticLibrary *>(tgt))
argv.push_back((file?file:stlib)->get_path().str());
else if(ImportLibrary *imp = dynamic_cast<ImportLibrary *>(tgt))
public:
MsvcLinker(Builder &, const Architecture &, const MicrosoftTools &);
+ Target *create_source(const Component &, const Msp::FS::Path &) const override;
Target *create_target(const std::vector<Target *> &, const std::string &) override;
std::string create_build_signature(const BuildInfo &) const override;
using namespace std;
using namespace Msp;
-ExportDefinitions::ExportDefinitions(Builder &b, const Component &c, const vector<ObjectFile *> &objs):
- FileTarget(b, c.get_package(), generate_target_path(c))
+ExportDefinitions::ExportDefinitions(Builder &b, const Component &c, const FS::Path &p):
+ FileTarget(b, c.get_package(), p)
{
component = &c;
+}
+
+ExportDefinitions::ExportDefinitions(Builder &b, const Component &c, const vector<ObjectFile *> &objs):
+ ExportDefinitions(b, c, generate_target_path(c))
+{
for(ObjectFile *o: objs)
add_dependency(*o);
}
class LIBBUILDER_API ExportDefinitions: public FileTarget
{
public:
+ ExportDefinitions(Builder &, const Component &, const Msp::FS::Path &);
ExportDefinitions(Builder &, const Component &, const std::vector<ObjectFile *> &);
private:
static Msp::FS::Path generate_target_path(const Component &);