]> git.tdb.fi Git - builder.git/blobdiff - source/lib/builder.h
Make it possible to use built-in plugins
[builder.git] / source / lib / builder.h
index 62fc21494e066baee9d5e9c5517974554f549012..8ab0f941f8c482774d38d1f8aecd4b86b1234d43 100644 (file)
@@ -10,6 +10,7 @@
 #include "buildgraph.h"
 #include "buildtype.h"
 #include "config.h"
+#include "libbuilder_api.h"
 #include "logger.h"
 #include "packagemanager.h"
 #include "sourcepackage.h"
@@ -24,7 +25,7 @@ class Plugin;
 This class ties everything else together.  It also contains code for loading
 build files and supervising the build process.
 */
-class Builder
+class LIBBUILDER_API Builder
 {
 private:
        class Loader: public Msp::DataFile::ObjectLoader<Builder>
@@ -53,6 +54,7 @@ private:
 
                LoadedPlugin() = default;
                LoadedPlugin(LoadedPlugin &&);
+               LoadedPlugin &operator=(LoadedPlugin &&);
                ~LoadedPlugin();
        };
 
@@ -81,6 +83,14 @@ public:
        ~Builder();
 
        void load_plugins();
+
+       template<typename... T>
+       void load_plugins();
+
+private:
+       void add_plugins(std::vector<LoadedPlugin> &);
+
+public:
        PackageManager &get_package_manager() { return package_manager; }
        SourcePackage::ComponentRegistry &get_component_registry() { return component_registry; }
 
@@ -132,6 +142,20 @@ public:
        int do_create_makefile();
 };
 
+template<typename... T>
+void Builder::load_plugins()
+{
+       Plugin *raw_plugins[] = { new T(*this)... };
+       std::vector<LoadedPlugin> pending_plugins;
+       for(Plugin *p: raw_plugins)
+       {
+               LoadedPlugin plugin;
+               plugin.plugin = p;
+               pending_plugins.emplace_back(std::move(plugin));
+       }
+       add_plugins(pending_plugins);
+}
+
 template<typename F>
 void Builder::call_plugins(F func) const
 {