Merge pull request #37395 from obsidiansystems/lib-meta-platform

lib: Factor in tiny bit of `meta.platform` checking
This commit is contained in:
John Ericson 2018-03-19 20:12:50 -04:00 committed by GitHub
commit 3c331bff5b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 26 additions and 15 deletions

View file

@ -67,4 +67,23 @@ rec {
*/
hiPrioSet = set: mapDerivationAttrset hiPrio set;
/* Check to see if a platform is matched by the given `meta.platforms`
element.
A `meta.platform` pattern is either
1. (legacy) a system string.
2. (modern) a pattern for the platform `parsed` field.
We can inject these into a patten for the whole of a structured platform,
and then match that.
*/
platformMatch = platform: elem: let
pattern =
if builtins.isString elem
then { system = elem; }
else { parsed = elem; };
in lib.matchAttrs pattern platform;
}

View file

@ -173,10 +173,8 @@ let
else "key '${k}' is unrecognized; expected one of: \n\t [${lib.concatMapStringsSep ", " (x: "'${x}'") (lib.attrNames metaTypes)}]";
checkMeta = meta: if shouldCheckMeta then lib.remove null (lib.mapAttrsToList checkMetaAttr meta) else [];
checkPlatform = attrs: let
raw = attrs.meta.platforms;
uniform = map (x: if builtins.isString x then { system = x; } else { parsed = x; }) raw;
in lib.any (pat: lib.matchAttrs pat hostPlatform) uniform;
checkPlatform = attrs:
lib.any (lib.meta.platformMatch hostPlatform) attrs.meta.platforms;
# Check if a derivation is valid, that is whether it passes checks for
# e.g brokenness or license.

View file

@ -98,18 +98,12 @@ rec {
packagePlatforms = mapAttrs (name: value:
let res = builtins.tryEval (
if isDerivation value then
# TODO(@Ericson2314) deduplicate with `checkPlatform` in
# `pkgs/stdenv/generic/check-meta.nix`.
value.meta.hydraPlatforms or (let
raw = value.meta.platforms or [ "x86_64-linux" ];
toPattern = x: if builtins.isString x
then { system = x; }
else { parsed = x; };
uniform = map toPattern raw;
pred = hostPlatform:
lib.any (pat: lib.matchAttrs pat hostPlatform) uniform;
pred' = system: pred (lib.systems.elaborate { inherit system; });
in lib.filter pred' supportedSystems)
linuxDefaulted = value.meta.platforms or [ "x86_64-linux" ];
pred = system: lib.any
(lib.meta.platformMatch (lib.systems.elaborate { inherit system; }))
linuxDefaulted;
in lib.filter pred supportedSystems)
else if value.recurseForDerivations or false || value.recurseForRelease or false then
packagePlatforms value
else