From 192f4144b282a7f04695fcb79d84e8278ee6af8c Mon Sep 17 00:00:00 2001 From: John Ericson Date: Mon, 19 Mar 2018 21:29:48 -0400 Subject: [PATCH] release-lib: Filter supportedSystems with `meta.platforms`-style patterns Instead of intersecting system strings, we filter with the sort of patterns used in `meta.platforms`. Indicating this change `forTheseSystems` has been renamed to `forMatchingSystems`, since the given list is now patterns to match, and not the systems themselves. [Just as with `meta.platforms`, systems strings are also supported for backwards compatibility.] This is more flexible, and makes the `forMatchingSystems` and packagePlatforms` cases more analogous. --- nixos/release.nix | 10 ++++---- pkgs/top-level/release-cross.nix | 2 +- pkgs/top-level/release-lib.nix | 43 +++++++++++++++++++++++--------- 3 files changed, 37 insertions(+), 18 deletions(-) diff --git a/nixos/release.nix b/nixos/release.nix index 1db2da511441..a7d373d1f7cd 100644 --- a/nixos/release.nix +++ b/nixos/release.nix @@ -16,7 +16,7 @@ let inherit system; } // args); - callTestOnTheseSystems = systems: fn: args: forTheseSystems systems (system: hydraJob (importTest fn args system)); + callTestOnTheseSystems = systems: fn: args: forMatchingSystems systems (system: hydraJob (importTest fn args system)); callTest = callTestOnTheseSystems supportedSystems; callSubTests = callSubTestsOnTheseSystems supportedSystems; @@ -123,7 +123,7 @@ in rec { # Build the initial ramdisk so Hydra can keep track of its size over time. initialRamdisk = buildFromConfig ({ pkgs, ... }: { }) (config: config.system.build.initialRamdisk); - netboot = forTheseSystems [ "x86_64-linux" "aarch64-linux" ] (system: makeNetboot { + netboot = forMatchingSystems [ "x86_64-linux" "aarch64-linux" ] (system: makeNetboot { inherit system; modules = [ ./modules/installer/netboot/netboot-minimal.nix @@ -137,7 +137,7 @@ in rec { inherit system; }); - iso_graphical = forTheseSystems [ "x86_64-linux" ] (system: makeIso { + iso_graphical = forMatchingSystems [ "x86_64-linux" ] (system: makeIso { module = ./modules/installer/cd-dvd/installation-cd-graphical-kde.nix; type = "graphical"; inherit system; @@ -145,7 +145,7 @@ in rec { # A variant with a more recent (but possibly less stable) kernel # that might support more hardware. - iso_minimal_new_kernel = forTheseSystems [ "x86_64-linux" ] (system: makeIso { + iso_minimal_new_kernel = forMatchingSystems [ "x86_64-linux" ] (system: makeIso { module = ./modules/installer/cd-dvd/installation-cd-minimal-new-kernel.nix; type = "minimal-new-kernel"; inherit system; @@ -153,7 +153,7 @@ in rec { # A bootable VirtualBox virtual appliance as an OVA file (i.e. packaged OVF). - ova = forTheseSystems [ "x86_64-linux" ] (system: + ova = forMatchingSystems [ "x86_64-linux" ] (system: with import nixpkgs { inherit system; }; diff --git a/pkgs/top-level/release-cross.nix b/pkgs/top-level/release-cross.nix index ef99dbd619e4..0d15d817a66c 100644 --- a/pkgs/top-level/release-cross.nix +++ b/pkgs/top-level/release-cross.nix @@ -88,7 +88,7 @@ in f (["buildPackages"] ++ path) { inherit system crossSystem; } ); - testEqual = path: systems: forTheseSystems systems (testEqualOne path); + testEqual = path: systems: forMatchingSystems systems (testEqualOne path); mapTestEqual = lib.mapAttrsRecursive testEqual; diff --git a/pkgs/top-level/release-lib.nix b/pkgs/top-level/release-lib.nix index dbeb13d4bd31..b410348d1e89 100644 --- a/pkgs/top-level/release-lib.nix +++ b/pkgs/top-level/release-lib.nix @@ -48,33 +48,56 @@ rec { pkgs_x86_64_cygwin = allPackages { system = "x86_64-cygwin"; }; + # Given a list of 'meta.platforms'-style patterns, return the sublist of + # `supportedSystems` containing systems that matches at least one of the given + # patterns. + # + # This is written in a funny way so that we only elaborate the systems once. + supportedMatches = let + supportedPlatforms = map + (system: lib.systems.elaborate { inherit system; }) + supportedSystems; + in metaPatterns: let + anyMatch = platform: + lib.any (lib.meta.platformMatch platform) metaPatterns; + matchingPlatforms = lib.filter anyMatch supportedPlatforms; + in map ({ system, ...}: system) matchingPlatforms; + + assertTrue = bool: if bool then pkgs.runCommand "evaluated-to-true" {} "touch $out" else pkgs.runCommand "evaluated-to-false" {} "false"; + /* The working or failing mails for cross builds will be sent only to the following maintainers, as most package maintainers will not be interested in the result of cross building a package. */ crossMaintainers = [ maintainers.viric ]; + + # Generate attributes for all supported systems. forAllSystems = genAttrs supportedSystems; - forTheseSystems = systems: f: - genAttrs (filter (x: elem x supportedSystems) systems) f; + + + # Generate attributes for all sytems matching at least one of the given + # patterns + forMatchingSystems = metaPatterns: genAttrs (supportedMatches metaPatterns); + /* Build a package on the given set of platforms. The function `f' is called for each supported platform with Nixpkgs for that platform as an argument . We return an attribute set containing a derivation for each supported platform, i.e. ‘{ x86_64-linux = f pkgs_x86_64_linux; i686-linux = f pkgs_i686_linux; ... }’. */ - testOn = systems: f: forTheseSystems systems + testOn = metaPatterns: f: forMatchingSystems metaPatterns (system: hydraJob' (f (pkgsFor system))); /* Similar to the testOn function, but with an additional 'crossSystem' parameter for allPackages, defining the target platform for cross builds. */ - testOnCross = crossSystem: systems: f: forTheseSystems systems + testOnCross = crossSystem: metaPatterns: f: forMatchingSystems metaPatterns (system: hydraJob' (f (allPackages { inherit system crossSystem; }))); @@ -82,14 +105,14 @@ rec { map each leaf node to `testOn [platforms...] (pkgs: pkgs.)'. */ mapTestOn = mapAttrsRecursive - (path: systems: testOn systems (pkgs: getAttrFromPath path pkgs)); + (path: metaPatterns: testOn metaPatterns (pkgs: getAttrFromPath path pkgs)); /* Similar to the testOn function, but with an additional 'crossSystem' * parameter for allPackages, defining the target platform for cross builds, * and triggering the build of the host derivation (cross built - crossDrv). */ mapTestOnCross = crossSystem: mapAttrsRecursive - (path: systems: testOnCross crossSystem systems + (path: metaPatterns: testOnCross crossSystem metaPatterns (pkgs: addMetaAttrs { maintainers = crossMaintainers; } (getAttrFromPath path pkgs))); @@ -98,12 +121,8 @@ rec { packagePlatforms = mapAttrs (name: value: let res = builtins.tryEval ( if isDerivation value then - value.meta.hydraPlatforms or (let - 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) + value.meta.hydraPlatforms + or supportedMatches (value.meta.platforms or [ "x86_64-linux" ]) else if value.recurseForDerivations or false || value.recurseForRelease or false then packagePlatforms value else