diff options
Diffstat (limited to 'pkgs/top-level/release-lib.nix')
-rw-r--r-- | pkgs/top-level/release-lib.nix | 84 |
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; |