X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flib%2Fbuilder.cpp;h=9cf6266af8fef3d03db31b9d6d81e33310220bfc;hb=767e28373e9710720efabc0f4f9bb3e51661c1e6;hp=92924ebc0956aee33680624e97deb5cabd6638cb;hpb=c8e829c219c65ff8e93b6c7b66212ff0876441c5;p=builder.git diff --git a/source/lib/builder.cpp b/source/lib/builder.cpp index 92924eb..9cf6266 100644 --- a/source/lib/builder.cpp +++ b/source/lib/builder.cpp @@ -12,19 +12,14 @@ #include #include #include -#include "android/androidtools.h" #include "binarypackage.h" #include "builder.h" -#include "builtin/builtintools.h" -#include "clang/clangtools.h" -#include "datafile/datatool.h" -#include "gnu/gnutools.h" #include "installedfile.h" -#include "msvc/microsofttools.h" #include "package.h" +#include "plugin.h" #include "sharedlibrary.h" -#include "sourcepackage.h" #include "task.h" +#include "tool.h" #include "virtualtarget.h" using namespace std; @@ -46,6 +41,49 @@ Builder::~Builder() delete current_arch; } +void Builder::load_plugins() +{ + using CreateFunc = Plugin *(Builder &); + + FS::Path plugins_dir = FS::get_sys_lib_dir(); + logger->log("files", "Traversing %s", plugins_dir); + for(const string &f: list_filtered(plugins_dir, "\\.dlm$")) + { + LoadedPlugin plugin; + plugin.path = plugins_dir/f; + + try + { + plugin.module = new Module(plugin.path.str()); + } + catch(const exception &exc) + { + logger->log("plugins", "Failed to load plugin %s: %s", f, exc.what()); + continue; + } + + try + { + CreateFunc *create_func = reinterpret_cast(plugin.module->get_symbol("create_plugin")); + plugin.plugin = create_func(*this); + if(plugin.plugin) + { + logger->log("plugins", "Loaded plugin %s", f); + plugins.emplace_back(move(plugin)); + continue; + } + else + logger->log("plugins", "Plugin %s refused to initialize", f); + } + catch(const exception &exc) + { + logger->log("plugins", "Failed to initialize plugin %s: %s", f, exc.what()); + } + + delete plugin.module; + } +} + void Builder::set_architecture(const string &name) { if(current_arch!=&native_arch) @@ -102,14 +140,8 @@ void Builder::update_auto_prefix() void Builder::add_default_tools() { - toolchain.add_toolchain(new GnuTools(*this, *current_arch)); - toolchain.add_toolchain(new ClangTools(*this, *current_arch)); - if(current_arch->get_system()=="android") - toolchain.add_toolchain(new AndroidTools(*this, *current_arch)); - if(current_arch->get_system()=="windows") - toolchain.add_toolchain(new MicrosoftTools(*this, *current_arch)); - toolchain.add_toolchain(new BuiltinTools(*this)); - toolchain.add_tool(new DataTool(*this)); + for(const LoadedPlugin &p: plugins) + p.plugin->add_tools(toolchain, *current_arch); auto i = find_if(toolchain.get_toolchains(), [](const Toolchain *tc){ return (tc->has_tool("CC") || tc->has_tool("CXX")); }); if(i!=toolchain.get_toolchains().end()) @@ -310,6 +342,22 @@ int Builder::clean(bool all, bool dry_run) } +Builder::LoadedPlugin::LoadedPlugin(LoadedPlugin &&other): + path(move(other.path)), + module(other.module), + plugin(other.plugin) +{ + other.module = 0; + other.plugin = 0; +} + +Builder::LoadedPlugin::~LoadedPlugin() +{ + delete plugin; + delete module; +} + + Builder::Loader::Loader(Builder &b, const Config::InputOptions *o, bool a): DataFile::ObjectLoader(b), options(o),