From 719f023f33ccd35ae80ed861bf46136d5ebe1a8d Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Tue, 25 May 2010 10:35:14 +0000 Subject: * 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 --- pkgs/top-level/release-lib.nix | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) (limited to 'pkgs/top-level/release-lib.nix') diff --git a/pkgs/top-level/release-lib.nix b/pkgs/top-level/release-lib.nix index 7350c4cc1b64..ffee50b4e496 100644 --- a/pkgs/top-level/release-lib.nix +++ b/pkgs/top-level/release-lib.nix @@ -3,7 +3,26 @@ rec { 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 interested in the result of cross building a package. */ crossMaintainers = with pkgs.lib.maintainers; [ viric ]; @@ -23,7 +42,7 @@ rec { 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 (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' * parameter for allPackages, defining the target platform for cross builds */ -- cgit 1.4.1