]> git.tdb.fi Git - builder.git/blobdiff - source/lib/package.h
Rearrange sources into subdirectories
[builder.git] / source / lib / package.h
diff --git a/source/lib/package.h b/source/lib/package.h
new file mode 100644 (file)
index 0000000..d13aa73
--- /dev/null
@@ -0,0 +1,74 @@
+#ifndef PACKAGE_H_
+#define PACKAGE_H_
+
+#include <string>
+#include <vector>
+#include <msp/datafile/objectloader.h>
+#include "buildinfo.h"
+#include "conditionalloader.h"
+#include "config.h"
+
+class Builder;
+class Package;
+
+/**
+A package is a distributable piece of software.  Package information may be
+obtained in several ways: Build files of source packages, pkg-config for binary
+packages and the builderrc file for binary packages with no pkg-config support.
+*/
+class Package
+{
+public:
+       class Loader: public Msp::DataFile::ObjectLoader<Package>, public ArchitectureConditional
+       {
+       public:
+               Loader(Package &);
+       private:
+               void require(const std::string &);
+       };
+
+       using Requirements = std::vector<Package *>;
+
+protected:
+       Builder &builder;
+
+       std::string name;
+       std::string label;
+
+       Requirements requires;
+       BuildInfo export_binfo;
+       bool prepared = false;
+       std::vector<std::string> problems;
+
+       bool use_pkgconfig = true;
+
+       Package(Builder &, const std::string &);
+public:
+       virtual ~Package() { }
+
+       Builder &get_builder() const { return builder; }
+       const std::string &get_name() const { return name; }
+       const std::string &get_label() const { return label; }
+       const Requirements &get_required_packages() const { return requires; }
+
+       const BuildInfo &get_exported_build_info() const { return export_binfo; }
+
+       /// Indicates whether or not this package supports pkg-config
+       bool uses_pkgconfig() const { return use_pkgconfig; }
+
+       /** Prepares the package for building.  Recursively prepares all required
+       packages, populates build info and creates targets. */
+       void prepare();
+
+protected:
+       virtual void do_prepare() { }
+
+public:
+       bool is_prepared() const { return prepared; }
+
+       const std::vector<std::string> &get_problems() const { return problems; }
+
+       virtual void save_caches() { }
+};
+
+#endif