aboutsummaryrefslogtreecommitdiff
path: root/src/libstore/parsed-derivations.cc
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2018-09-28 15:57:27 +0200
committerEelco Dolstra <edolstra@gmail.com>2018-09-28 16:10:27 +0200
commit1e7b8deea7e052ed9ebf47d1411bcaf542054b41 (patch)
tree4e04f265227ac7fcd9b52940758835e576c2978a /src/libstore/parsed-derivations.cc
parent7ae7a38c9a7d0a5679e65c8213cd7b58dfdc1c52 (diff)
Check requiredSystemFeatures for local builds
For example, this prevents a "kvm" build on machines that don't have KVM. Fixes #2012.
Diffstat (limited to 'src/libstore/parsed-derivations.cc')
-rw-r--r--src/libstore/parsed-derivations.cc20
1 files changed, 17 insertions, 3 deletions
diff --git a/src/libstore/parsed-derivations.cc b/src/libstore/parsed-derivations.cc
index 0d7acf046..dc3286482 100644
--- a/src/libstore/parsed-derivations.cc
+++ b/src/libstore/parsed-derivations.cc
@@ -82,11 +82,25 @@ std::experimental::optional<Strings> ParsedDerivation::getStringsAttr(const std:
}
}
+StringSet ParsedDerivation::getRequiredSystemFeatures() const
+{
+ StringSet res;
+ for (auto & i : getStringsAttr("requiredSystemFeatures").value_or(Strings()))
+ res.insert(i);
+ return res;
+}
+
bool ParsedDerivation::canBuildLocally() const
{
- return drv.platform == settings.thisSystem
- || settings.extraPlatforms.get().count(drv.platform) > 0
- || drv.isBuiltin();
+ if (drv.platform != settings.thisSystem.get()
+ && !settings.extraPlatforms.get().count(drv.platform)
+ && !drv.isBuiltin())
+ return false;
+
+ for (auto & feature : getRequiredSystemFeatures())
+ if (!settings.systemFeatures.get().count(feature)) return false;
+
+ return true;
}
bool ParsedDerivation::willBuildLocally() const