]> git.tdb.fi Git - builder.git/blobdiff - source/lib/sourcepackage.h
Install headers of non-installed components in a staging directory
[builder.git] / source / lib / sourcepackage.h
index 8be8ada63d654f68a963feb55cdec9f8c7544d77..c311c210e86431f06fffd6a2932ffa49604deaea 100644 (file)
@@ -1,18 +1,20 @@
 #ifndef SOURCEPACKAGE_H_
 #define SOURCEPACKAGE_H_
 
+#include <algorithm>
 #include <stdexcept>
 #include <string>
+#include <msp/core/typeregistry.h>
 #include "buildinfo.h"
 #include "cache.h"
 #include "component.h"
 #include "conditionalloader.h"
 #include "config.h"
 #include "feature.h"
+#include "libbuilder_api.h"
 #include "package.h"
 #include "toolchain.h"
 
-class Builder;
 class BuildType;
 class FileTarget;
 class SourceArchiveComponent;
@@ -20,12 +22,20 @@ class SourceArchiveComponent;
 /**
 A package that can be built by Builder.
 */
-class SourcePackage: public Package
+class LIBBUILDER_API SourcePackage: public Package
 {
 public:
        class Loader: public Msp::DataFile::DerivedObjectLoader<SourcePackage, Package::Loader>, public FeatureConditional
        {
+               friend class SourcePackage;
+
        private:
+               template<typename T>
+               struct AddComponent
+               {
+                       void operator()(const std::string &n, Loader &l) const { l.add(n, &Loader::component<T>); }
+               };
+
                const Config::InputOptions *options;
 
        public:
@@ -33,11 +43,10 @@ public:
        private:
                void finish() override;
 
+               void exported();
                void feature(const std::string &, const std::string &);
-               template<typename C>
-               void component(const std::string &);
-               template<typename C, typename A>
-               void component_arg(A, const std::string &);
+               template<typename C, typename... Args>
+               void component(Args..., const std::string &);
                void build_info();
                void generate(const std::string &);
                void interface_version(const std::string &);
@@ -46,7 +55,18 @@ public:
                void version(const std::string &);
        };
 
+       using ComponentRegistry = Msp::TypeRegistry<Loader::AddComponent, Loader &>;
+
 private:
+       class ExportLoader: public Msp::DataFile::ObjectLoader<SourcePackage>
+       {
+       public:
+               ExportLoader(SourcePackage &);
+
+       private:
+               void build_info();
+       };
+
        std::string version;
        std::string interface_version;
        std::string description;
@@ -74,6 +94,7 @@ public:
        const Msp::FS::Path &get_source_directory() const { return source_dir; }
        Msp::FS::Path get_temp_directory() const;
        Msp::FS::Path get_output_directory() const;
+       Msp::FS::Path get_staging_directory() const;
 
        const Toolchain &get_toolchain() const { return local_tools; }
        const Component &get_component(const std::string &) const;
@@ -90,4 +111,15 @@ private:
        void save_caches() override;
 };
 
+
+template<typename C, typename... Args>
+void SourcePackage::Loader::component(Args... args, const std::string &n)
+{
+       if(std::any_of(obj.components.begin(), obj.components.end(), [&n](const Component *c){ return c->get_name()==n; }))
+               throw Msp::key_error(n);
+       C *comp = new C(obj, n, args...);
+       load_sub(*comp);
+       obj.components.push_back(comp);
+}
+
 #endif