diff options
author | Eelco Dolstra <edolstra@gmail.com> | 2018-09-28T13·57+0200 |
---|---|---|
committer | Eelco Dolstra <edolstra@gmail.com> | 2018-09-28T14·10+0200 |
commit | 1e7b8deea7e052ed9ebf47d1411bcaf542054b41 (patch) | |
tree | 4e04f265227ac7fcd9b52940758835e576c2978a /src/libstore/parsed-derivations.cc | |
parent | 7ae7a38c9a7d0a5679e65c8213cd7b58dfdc1c52 (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.cc | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/src/libstore/parsed-derivations.cc b/src/libstore/parsed-derivations.cc index 0d7acf046afd..dc3286482736 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 |