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.
wip/yesman
John Ericson 6 years ago
parent e547bd0dc4
commit 192f4144b2
  1. 10
      nixos/release.nix
  2. 2
      pkgs/top-level/release-cross.nix
  3. 43
      pkgs/top-level/release-lib.nix

@ -16,7 +16,7 @@ let
inherit system; inherit system;
} // args); } // 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; callTest = callTestOnTheseSystems supportedSystems;
callSubTests = callSubTestsOnTheseSystems supportedSystems; callSubTests = callSubTestsOnTheseSystems supportedSystems;
@ -123,7 +123,7 @@ in rec {
# Build the initial ramdisk so Hydra can keep track of its size over time. # Build the initial ramdisk so Hydra can keep track of its size over time.
initialRamdisk = buildFromConfig ({ pkgs, ... }: { }) (config: config.system.build.initialRamdisk); 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; inherit system;
modules = [ modules = [
./modules/installer/netboot/netboot-minimal.nix ./modules/installer/netboot/netboot-minimal.nix
@ -137,7 +137,7 @@ in rec {
inherit system; 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; module = ./modules/installer/cd-dvd/installation-cd-graphical-kde.nix;
type = "graphical"; type = "graphical";
inherit system; inherit system;
@ -145,7 +145,7 @@ in rec {
# A variant with a more recent (but possibly less stable) kernel # A variant with a more recent (but possibly less stable) kernel
# that might support more hardware. # 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; module = ./modules/installer/cd-dvd/installation-cd-minimal-new-kernel.nix;
type = "minimal-new-kernel"; type = "minimal-new-kernel";
inherit system; inherit system;
@ -153,7 +153,7 @@ in rec {
# A bootable VirtualBox virtual appliance as an OVA file (i.e. packaged OVF). # 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; }; with import nixpkgs { inherit system; };

@ -88,7 +88,7 @@ in
f (["buildPackages"] ++ path) { inherit system crossSystem; } f (["buildPackages"] ++ path) { inherit system crossSystem; }
); );
testEqual = path: systems: forTheseSystems systems (testEqualOne path); testEqual = path: systems: forMatchingSystems systems (testEqualOne path);
mapTestEqual = lib.mapAttrsRecursive testEqual; mapTestEqual = lib.mapAttrsRecursive testEqual;

@ -48,33 +48,56 @@ rec {
pkgs_x86_64_cygwin = allPackages { system = "x86_64-cygwin"; }; 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: assertTrue = bool:
if bool if bool
then pkgs.runCommand "evaluated-to-true" {} "touch $out" then pkgs.runCommand "evaluated-to-true" {} "touch $out"
else pkgs.runCommand "evaluated-to-false" {} "false"; else pkgs.runCommand "evaluated-to-false" {} "false";
/* The working or failing mails for cross builds will be sent only to /* The working or failing mails for cross builds will be sent only to
the following maintainers, as most package maintainers will not be the following maintainers, as most package maintainers will not be
interested in the result of cross building a package. */ interested in the result of cross building a package. */
crossMaintainers = [ maintainers.viric ]; crossMaintainers = [ maintainers.viric ];
# Generate attributes for all supported systems.
forAllSystems = genAttrs supportedSystems; 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' /* Build a package on the given set of platforms. The function `f'
is called for each supported platform with Nixpkgs for that is called for each supported platform with Nixpkgs for that
platform as an argument . We return an attribute set containing platform as an argument . We return an attribute set containing
a derivation for each supported platform, i.e. { x86_64-linux = a derivation for each supported platform, i.e. { x86_64-linux =
f pkgs_x86_64_linux; i686-linux = f pkgs_i686_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))); (system: hydraJob' (f (pkgsFor system)));
/* Similar to the testOn function, but with an additional /* Similar to the testOn function, but with an additional
'crossSystem' parameter for allPackages, defining the target 'crossSystem' parameter for allPackages, defining the target
platform for cross builds. */ platform for cross builds. */
testOnCross = crossSystem: systems: f: forTheseSystems systems testOnCross = crossSystem: metaPatterns: f: forMatchingSystems metaPatterns
(system: hydraJob' (f (allPackages { inherit system crossSystem; }))); (system: hydraJob' (f (allPackages { inherit system crossSystem; })));
@ -82,14 +105,14 @@ rec {
map each leaf node to `testOn [platforms...] (pkgs: map each leaf node to `testOn [platforms...] (pkgs:
pkgs.<attrPath>)'. */ pkgs.<attrPath>)'. */
mapTestOn = mapAttrsRecursive 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' /* Similar to the testOn function, but with an additional 'crossSystem'
* parameter for allPackages, defining the target platform for cross builds, * parameter for allPackages, defining the target platform for cross builds,
* and triggering the build of the host derivation (cross built - crossDrv). */ * and triggering the build of the host derivation (cross built - crossDrv). */
mapTestOnCross = crossSystem: mapAttrsRecursive mapTestOnCross = crossSystem: mapAttrsRecursive
(path: systems: testOnCross crossSystem systems (path: metaPatterns: testOnCross crossSystem metaPatterns
(pkgs: addMetaAttrs { maintainers = crossMaintainers; } (getAttrFromPath path pkgs))); (pkgs: addMetaAttrs { maintainers = crossMaintainers; } (getAttrFromPath path pkgs)));
@ -98,12 +121,8 @@ rec {
packagePlatforms = mapAttrs (name: value: packagePlatforms = mapAttrs (name: value:
let res = builtins.tryEval ( let res = builtins.tryEval (
if isDerivation value then if isDerivation value then
value.meta.hydraPlatforms or (let value.meta.hydraPlatforms
linuxDefaulted = value.meta.platforms or [ "x86_64-linux" ]; or supportedMatches (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 else if value.recurseForDerivations or false || value.recurseForRelease or false then
packagePlatforms value packagePlatforms value
else else

Loading…
Cancel
Save