From cffc126e140eea1a0bc01a1419c5609c619f5326 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Tue, 26 Mar 2013 11:02:29 +0100 Subject: [PATCH] Make Nixpkgs jobs unique MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- pkgs/development/libraries/aterm/2.5.nix | 5 +- pkgs/top-level/release-lib.nix | 69 +++++++++++++----------- pkgs/top-level/release.nix | 20 +++---- 3 files changed, 51 insertions(+), 43 deletions(-) diff --git a/pkgs/development/libraries/aterm/2.5.nix b/pkgs/development/libraries/aterm/2.5.nix index daaf6fdd584d..f116da12643e 100644 --- a/pkgs/development/libraries/aterm/2.5.nix +++ b/pkgs/development/libraries/aterm/2.5.nix @@ -16,14 +16,15 @@ stdenv.mkDerivation { # SIZEOF_LONG, SIZEOF_INT and SIZEOF_VOID_P being set. ./sizeof.patch ]; - + doCheck = true; - dontDisableStatic = true; + dontDisableStatic = true; meta = { homepage = http://www.cwi.nl/htbin/sen1/twiki/bin/view/SEN1/ATerm; license = "LGPL"; description = "Library for manipulation of term data structures in C"; + platforms = stdenv.lib.platforms.all; }; } diff --git a/pkgs/top-level/release-lib.nix b/pkgs/top-level/release-lib.nix index fed9a1d673ba..ed523d235b8a 100644 --- a/pkgs/top-level/release-lib.nix +++ b/pkgs/top-level/release-lib.nix @@ -7,7 +7,8 @@ rec { 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 job/platform pair. */ pkgsFor = system: @@ -26,33 +27,39 @@ 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 {}; + testOn = systems: f: pkgs.lib.genAttrs 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 */ + + /* 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 +89,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 +123,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; diff --git a/pkgs/top-level/release.nix b/pkgs/top-level/release.nix index 595c6b427a2d..d1b5d8254c4c 100644 --- a/pkgs/top-level/release.nix +++ b/pkgs/top-level/release.nix @@ -1,13 +1,15 @@ -/* - This file will be evaluated by hydra with a call like this: - hydra_eval_jobs --gc-roots-dir \ - /nix/var/nix/gcroots/per-user/hydra/hydra-roots --argstr \ - system i686-linux --argstr system x86_64-linux --arg \ - nixpkgs "{outPath = ./}" .... release.nix +/* This file defines the builds that constitute the Nixpkgs. + Everything defined here ends up in the Nixpkgs channel. Individual + jobs can be tested by running: - Hydra can be installed with "nix-env -i hydra". + $ nix-build pkgs/top-level/release.nix -A . + + 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; aspell = all; at = linux; - aterm25 = all; - aterm28 = all; audacious = linux; autoconf = all; automake110x = all;