summary refs log tree commit diff
path: root/pkgs/top-level/release-lib.nix
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/top-level/release-lib.nix')
-rw-r--r--pkgs/top-level/release-lib.nix84
1 files changed, 48 insertions, 36 deletions
diff --git a/pkgs/top-level/release-lib.nix b/pkgs/top-level/release-lib.nix
index fed9a1d673ba..5052a41a96cf 100644
--- a/pkgs/top-level/release-lib.nix
+++ b/pkgs/top-level/release-lib.nix
@@ -1,3 +1,5 @@
+{ supportedSystems }:
+
 rec {
 
   # Ensure that we don't build packages marked as unfree.
@@ -5,9 +7,10 @@ rec {
     config.allowUnfree = false;
   });
 
-  pkgs = allPackages { };
+  pkgs = allPackages { system = "x86_64-linux"; };
+
 
-  /* !!! Hack: poor man's memoisation function.  Necessary for prevent
+  /* !!! Hack: poor man's memoisation function.  Necessary to prevent
      Nixpkgs from being evaluated again and again for every
      job/platform pair. */
   pkgsFor = system:
@@ -26,33 +29,42 @@ rec {
   pkgs_i686_freebsd = allPackages { system = "i686-freebsd"; };
   pkgs_i686_cygwin = allPackages { system = "i686-cygwin"; };
 
+
   /* 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 = with pkgs.lib.maintainers; [ viric ];
 
+
   /* Set the Hydra scheduling priority for a job.  The default
-     priority (10) should be used for most jobs.  A different
-     priority should only be used for a few particularly interesting
-     jobs (in terms of giving feedback to developers), such as stdenv.
-  */
+     priority (10) should be used for most jobs.  A different priority
+     should only be used for a few particularly interesting jobs (in
+     terms of giving feedback to developers), such as stdenv. */
   prio = level: job: toJob job // { schedulingPriority = level; };
 
+
   toJob = x: if builtins.isAttrs x then x else
     { type = "job"; systems = x; schedulingPriority = 10; };
 
-  /* Perform a job on the given set of platforms.  The function `f' is
-     called by Hydra for each platform, and should return some job
-     to build on that platform.  `f' is passed the Nixpkgs collection
-     for the platform in question. */
-  testOn = systems: f: {system ? builtins.currentSystem}:
-    if pkgs.lib.elem system systems then f (pkgsFor system) else {};
 
-  /* Similar to the testOn function, but with an additional 'crossSystem'
-   * parameter for allPackages, defining the target platform for cross builds */
+  /* 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: pkgs.lib.genAttrs
+    (pkgs.lib.filter (x: pkgs.lib.elem x supportedSystems) systems)
+    (system: 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: {system ? builtins.currentSystem}:
-    if pkgs.lib.elem system systems then f (allPackages {inherit system
-                crossSystem;}) else {};
+    if pkgs.lib.elem system systems
+    then f (allPackages { inherit system crossSystem; })
+    else {};
+
 
   /* Map an attribute of the form `foo = [platforms...]'  to `testOn
      [platforms...] (pkgs: pkgs.foo)'. */
@@ -82,29 +94,28 @@ rec {
           (pkgs.lib.getAttrFromPath path pkgs));
       in testOnCross crossSystem job.systems getPkg);
 
+
   /* Find all packages that have a meta.platforms field listing the
      supported platforms. */
   packagesWithMetaPlatform = attrSet:
-    if builtins ? tryEval then
-      let pairs = pkgs.lib.concatMap
-        (x:
-          let pair = builtins.tryEval
-                (let
-                   attrVal = (builtins.getAttr x attrSet);
-                 in
-                   {val=(processPackage attrVal);
-                    attrVal = attrVal;
-                    attrValIsAttrs = builtins.isAttrs attrVal;
-                    });
-              success = (builtins.tryEval pair.value.attrVal).success;
-          in
-          if success && pair.value.attrValIsAttrs &&
-              pair.value.val != [] then
-            [{name= x; value=pair.value.val;}] else [])
-        (builtins.attrNames attrSet);
-      in
-        builtins.listToAttrs pairs
-    else {};
+    let pairs = pkgs.lib.concatMap
+      (x:
+        let pair = builtins.tryEval
+              (let
+                 attrVal = (builtins.getAttr x attrSet);
+               in
+                 { val = processPackage attrVal;
+                   attrVal = attrVal;
+                   attrValIsAttrs = builtins.isAttrs attrVal;
+                 });
+            success = (builtins.tryEval pair.value.attrVal).success;
+        in
+        pkgs.lib.optional (success && pair.value.attrValIsAttrs && pair.value.val != [])
+          { name = x; value = pair.value.val; })
+      (builtins.attrNames attrSet);
+    in
+      builtins.listToAttrs pairs;
+
 
   # May fail as much as it wishes, we will catch the error.
   processPackage = attrSet:
@@ -117,6 +128,7 @@ rec {
         then attrSet.meta.platforms
         else [];
 
+
   /* Common platform groups on which to test packages. */
   inherit (pkgs.lib.platforms) linux darwin cygwin allBut all mesaPlatforms;