aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libbpkg/manifest.cxx32
-rw-r--r--libbpkg/manifest.hxx28
-rw-r--r--tests/manifest/testscript4
3 files changed, 64 insertions, 0 deletions
diff --git a/libbpkg/manifest.cxx b/libbpkg/manifest.cxx
index 64daa11..ee71596 100644
--- a/libbpkg/manifest.cxx
+++ b/libbpkg/manifest.cxx
@@ -673,6 +673,25 @@ namespace bpkg
if (nv.value != "1")
bad_value ("unsupported format version");
+ auto add_build_constraint = [&bad_value, this] (bool e, string&& v)
+ {
+ string c (split_comment (v));
+ size_t p (v.find ('/'));
+
+ string nm (p != string::npos ? v.substr (0, p) : move (v));
+ optional<string> tg (p != string::npos
+ ? optional<string> (string (v, p + 1))
+ : nullopt);
+
+ if (nm.empty ())
+ bad_value ("empty build configuration name pattern");
+
+ if (tg && tg->empty ())
+ bad_value ("empty build target pattern");
+
+ build_constraints.emplace_back (e, move (nm), move (tg), move (c));
+ };
+
for (nv = p.next (); !nv.empty (); nv = p.next ())
{
string& n (nv.name);
@@ -915,6 +934,14 @@ namespace bpkg
requirements.push_back (move (ra));
}
+ else if (n == "build-include")
+ {
+ add_build_constraint (false, move (v));
+ }
+ else if (n == "build-exclude")
+ {
+ add_build_constraint (true, move (v));
+ }
else if (n == "depends")
{
// Allow specifying ?* in any order.
@@ -1270,6 +1297,11 @@ namespace bpkg
: (r.buildtime ? "* " : "")) +
add_comment (concatenate (r, " | "), r.comment));
+ for (const auto& c: build_constraints)
+ s.next (c.exclusion ? "build-exclude" : "build-include",
+ add_comment (!c.target ? c.config : c.config + "/" + *c.target,
+ c.comment));
+
if (location)
s.next ("location", location->posix_string ());
diff --git a/libbpkg/manifest.hxx b/libbpkg/manifest.hxx
index 1420cdb..ccc52a6 100644
--- a/libbpkg/manifest.hxx
+++ b/libbpkg/manifest.hxx
@@ -321,6 +321,33 @@ namespace bpkg
: conditional (d), buildtime (b), comment (std::move (c)) {}
};
+ class build_constraint
+ {
+ public:
+ // If true, then the package should not be built for matching
+ // configurations by automated build bots.
+ //
+ bool exclusion;
+
+ // Filesystem wildcard patterns for the build configuration name and
+ // target.
+ //
+ std::string config;
+ butl::optional<std::string> target;
+
+ std::string comment;
+
+ build_constraint () = default;
+ build_constraint (bool e,
+ std::string n,
+ butl::optional<std::string> t,
+ std::string c)
+ : exclusion (e),
+ config (std::move (n)),
+ target (std::move (t)),
+ comment (std::move (c)) {}
+ };
+
class LIBBPKG_EXPORT package_manifest
{
public:
@@ -344,6 +371,7 @@ namespace bpkg
butl::optional<email_type> build_email;
std::vector<dependency_alternatives> dependencies;
std::vector<requirement_alternatives> requirements;
+ std::vector<build_constraint> build_constraints;
// The following values are only valid in the manifest list.
//
diff --git a/tests/manifest/testscript b/tests/manifest/testscript
index 870d48d..43dfdb1 100644
--- a/tests/manifest/testscript
+++ b/tests/manifest/testscript
@@ -41,6 +41,9 @@
requires: ? ; libc++ standard library if using Clang on Mac OS X.
requires: zlib; Most Linux/UNIX systems already have one; or get it at\
www.zlib.net.
+ build-exclude: *; Only supported on Linux and FreeBSD.
+ build-include: linux*
+ build-include: freebsd*
location: libfoo-1.2.3+2.tar.bz2
sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
:
@@ -53,6 +56,7 @@
email: libbar-users@example.org
build-email:
depends: libbaz (1- 2-) | libbaz [3 4-) | libbaz (5 6] | libbaz [7 8]
+ build-exclude: *-msvc_14*/i?86-*; Linker crash.
location: bar/libbar-3.4A.5+6.tbz
sha256sum: d4b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
: