Make Nixpkgs jobs unique

That is, there are now distinct jobs like ‘coreutils.x86_64-linux’ and
‘coreutils.x86_64-darwin’, rather than a single job ‘coreutils’ with
multiple builds.  This means that testing a job is simpler:

  $ nix-build pkgs/top-level/release.nix -A coreutils.x86_64-linux

See https://github.com/NixOS/hydra/issues/60 for the motivation.
This commit is contained in:
Eelco Dolstra 2013-03-26 11:02:29 +01:00
parent b38647766d
commit cffc126e14
3 changed files with 51 additions and 43 deletions

View File

@ -25,5 +25,6 @@ stdenv.mkDerivation {
homepage = http://www.cwi.nl/htbin/sen1/twiki/bin/view/SEN1/ATerm; homepage = http://www.cwi.nl/htbin/sen1/twiki/bin/view/SEN1/ATerm;
license = "LGPL"; license = "LGPL";
description = "Library for manipulation of term data structures in C"; description = "Library for manipulation of term data structures in C";
platforms = stdenv.lib.platforms.all;
}; };
} }

View File

@ -7,7 +7,8 @@ rec {
pkgs = allPackages { }; pkgs = allPackages { };
/* !!! 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 Nixpkgs from being evaluated again and again for every
job/platform pair. */ job/platform pair. */
pkgsFor = system: pkgsFor = system:
@ -26,33 +27,39 @@ rec {
pkgs_i686_freebsd = allPackages { system = "i686-freebsd"; }; pkgs_i686_freebsd = allPackages { system = "i686-freebsd"; };
pkgs_i686_cygwin = allPackages { system = "i686-cygwin"; }; pkgs_i686_cygwin = allPackages { system = "i686-cygwin"; };
/* 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 = with pkgs.lib.maintainers; [ viric ]; crossMaintainers = with pkgs.lib.maintainers; [ viric ];
/* Set the Hydra scheduling priority for a job. The default /* Set the Hydra scheduling priority for a job. The default
priority (10) should be used for most jobs. A different priority (10) should be used for most jobs. A different priority
priority should only be used for a few particularly interesting should only be used for a few particularly interesting jobs (in
jobs (in terms of giving feedback to developers), such as stdenv. terms of giving feedback to developers), such as stdenv. */
*/
prio = level: job: toJob job // { schedulingPriority = level; }; prio = level: job: toJob job // { schedulingPriority = level; };
toJob = x: if builtins.isAttrs x then x else toJob = x: if builtins.isAttrs x then x else
{ type = "job"; systems = x; schedulingPriority = 10; }; { type = "job"; systems = x; schedulingPriority = 10; };
/* Perform a job on the given set of platforms. The function `f' is /* Perform a job on the given set of platforms. The function `f' is
called by Hydra for each platform, and should return some job called by Hydra for each platform, and should return some job
to build on that platform. `f' is passed the Nixpkgs collection to build on that platform. `f' is passed the Nixpkgs collection
for the platform in question. */ for the platform in question. */
testOn = systems: f: {system ? builtins.currentSystem}: testOn = systems: f: pkgs.lib.genAttrs systems (system: f (pkgsFor system));
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 */ /* 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}: testOnCross = crossSystem: systems: f: {system ? builtins.currentSystem}:
if pkgs.lib.elem system systems then f (allPackages {inherit system if pkgs.lib.elem system systems
crossSystem;}) else {}; then f (allPackages { inherit system crossSystem; })
else {};
/* Map an attribute of the form `foo = [platforms...]' to `testOn /* Map an attribute of the form `foo = [platforms...]' to `testOn
[platforms...] (pkgs: pkgs.foo)'. */ [platforms...] (pkgs: pkgs.foo)'. */
@ -82,29 +89,28 @@ rec {
(pkgs.lib.getAttrFromPath path pkgs)); (pkgs.lib.getAttrFromPath path pkgs));
in testOnCross crossSystem job.systems getPkg); in testOnCross crossSystem job.systems getPkg);
/* Find all packages that have a meta.platforms field listing the /* Find all packages that have a meta.platforms field listing the
supported platforms. */ supported platforms. */
packagesWithMetaPlatform = attrSet: packagesWithMetaPlatform = attrSet:
if builtins ? tryEval then
let pairs = pkgs.lib.concatMap let pairs = pkgs.lib.concatMap
(x: (x:
let pair = builtins.tryEval let pair = builtins.tryEval
(let (let
attrVal = (builtins.getAttr x attrSet); attrVal = (builtins.getAttr x attrSet);
in in
{val=(processPackage attrVal); { val = processPackage attrVal;
attrVal = attrVal; attrVal = attrVal;
attrValIsAttrs = builtins.isAttrs attrVal; attrValIsAttrs = builtins.isAttrs attrVal;
}); });
success = (builtins.tryEval pair.value.attrVal).success; success = (builtins.tryEval pair.value.attrVal).success;
in in
if success && pair.value.attrValIsAttrs && pkgs.lib.optional (success && pair.value.attrValIsAttrs && pair.value.val != [])
pair.value.val != [] then { name = x; value = pair.value.val; })
[{name= x; value=pair.value.val;}] else [])
(builtins.attrNames attrSet); (builtins.attrNames attrSet);
in in
builtins.listToAttrs pairs builtins.listToAttrs pairs;
else {};
# May fail as much as it wishes, we will catch the error. # May fail as much as it wishes, we will catch the error.
processPackage = attrSet: processPackage = attrSet:
@ -117,6 +123,7 @@ rec {
then attrSet.meta.platforms then attrSet.meta.platforms
else []; else [];
/* Common platform groups on which to test packages. */ /* Common platform groups on which to test packages. */
inherit (pkgs.lib.platforms) linux darwin cygwin allBut all mesaPlatforms; inherit (pkgs.lib.platforms) linux darwin cygwin allBut all mesaPlatforms;

View File

@ -1,13 +1,15 @@
/* /* This file defines the builds that constitute the Nixpkgs.
This file will be evaluated by hydra with a call like this: Everything defined here ends up in the Nixpkgs channel. Individual
hydra_eval_jobs --gc-roots-dir \ jobs can be tested by running:
/nix/var/nix/gcroots/per-user/hydra/hydra-roots --argstr \
system i686-linux --argstr system x86_64-linux --arg \
nixpkgs "{outPath = ./}" .... release.nix
Hydra can be installed with "nix-env -i hydra". $ nix-build pkgs/top-level/release.nix -A <jobname>.<system>
e.g.
$ nix-build pkgs/top-level/release.nix -A coreutils.x86_64-linux
*/ */
with (import ./release-lib.nix);
with import ./release-lib.nix;
{ {
@ -20,8 +22,6 @@ with (import ./release-lib.nix);
apacheHttpd = linux; apacheHttpd = linux;
aspell = all; aspell = all;
at = linux; at = linux;
aterm25 = all;
aterm28 = all;
audacious = linux; audacious = linux;
autoconf = all; autoconf = all;
automake110x = all; automake110x = all;