* A quick hack to make release.nix evaluate in a reasonable amount of

time and space on the new (non-ATerm) Nix expression evaluator.  It
  turns out that release.nix relied rather heavily on maximal laziness
  for efficiency: every job calls `allPackages { inherit system; }'
  for each platform.  This causes the dependencies of the job to be
  reevaluated for every job/platform combination.  This is very slow
  and (because the evaluator doesn't have a garbage collector yet)
  eventually causes the evaluator to run out of memory and be killed.

  As a workaround, I've replaced the calls to `allPackages' with a
  quasi-memoised `pkgsFor' function.  It "caches" the result by going
  through a variable such as `pkgs_x86_64_linux', which is evaluated
  only once.  Evaluation now only takes 4.4s and 545 MiB on my
  machine.

  A cleaner solution may be to move the `system' argument outwards so
  that entire set of jobs is called only once for each value of
  `system'.

svn path=/nixpkgs/trunk/; revision=21966
This commit is contained in:
Eelco Dolstra 2010-05-25 10:35:14 +00:00
parent b6a166946d
commit 719f023f33

View File

@ -3,7 +3,26 @@ rec {
pkgs = allPackages {}; pkgs = allPackages {};
/* The working or failing letters for cross builds will be sent only to /* !!! Hack: poor man's memoisation function. Necessary for prevent
Nixpkgs from being evaluated again and again for every
job/platform pair. */
pkgsFor = system:
if system == "x86_64-linux" then pkgs_x86_64_linux
else if system == "i686-linux" then pkgs_i686_linux
else if system == "x86_64-darwin" then pkgs_x86_64_darwin
else if system == "i686-darwin" then pkgs_i686_darwin
else if system == "i686-freebsd" then pkgs_i686_freebsd
else if system == "i686-cygwin" then pkgs_i686_cygwin
else abort "unsupported system type: ${system}";
pkgs_x86_64_linux = allPackages { system = "x86_64-linux"; };
pkgs_i686_linux = allPackages { system = "i686-linux"; };
pkgs_x86_64_darwin = allPackages { system = "x86_64-darwin"; };
pkgs_i686_darwin = allPackages { system = "i686-darwin"; };
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 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 ];
@ -23,7 +42,7 @@ rec {
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: {system ? builtins.currentSystem}:
if pkgs.lib.elem system systems then f (allPackages {inherit system;}) else {}; if pkgs.lib.elem system systems then f (pkgsFor system) else {};
/* 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 */