Author: eelco
Date: Fri Sep  3 10:46:18 2010
New Revision: 23613
URL: https://svn.nixos.org/websvn/nix/?rev=23613&sc=1

Log:
* Added a function `applyGlobalOverrides' to return Nixpkgs with the
  specified overrides applied.  This does the same as the
  `packageOverrides' attribute in ~/.nixpkgs/config.nix, but can be
  used within all-packages.nix to do a "deep" override for some
  specific package.  For instance, to build Thunderbird with an older
  version of Glib, you can say:

    thunderbird3 =
      let
        pkgs = applyGlobalOverrides (pkgsOrig:
          { gtkLibs220 = pkgsOrig.gtkLibs220 // 
              { glib = pkgsOrig.gtkLibs218.glib; };
          });
      in
        pkgs.callPackage .../thunderbird/3.x.nix {
          inherit (pkgs.gnome) libIDL;
        };

  Note that `pkgsFun' now has an argument `pkgs' to refer to its own
  result.

* Moved callPackage etc. into pkgsFun so that it uses the right
  overriden packages, if applicable.  `defaultScope' isn't in the
  result set because that causes nix-env to go into an apparently
  infinite recursion.

* Dropped the optional pkgsOrig argument to ~/.nixpkgs/config.nix,
  because it's probably not useful or used.

Modified:
   nixpkgs/trunk/pkgs/top-level/all-packages.nix

Modified: nixpkgs/trunk/pkgs/top-level/all-packages.nix
==============================================================================
--- nixpkgs/trunk/pkgs/top-level/all-packages.nix       Fri Sep  3 09:17:54 
2010        (r23612)
+++ nixpkgs/trunk/pkgs/top-level/all-packages.nix       Fri Sep  3 10:46:18 
2010        (r23613)
@@ -65,9 +65,9 @@
     in
       # allow both:
       # { /* the config */ } and
-      # { pkgsOrig, pkgs, ... } : { /* the config */ }
+      # { pkgs, ... } : { /* the config */ }
       if builtins.isFunction configExpr
-        then configExpr { inherit pkgs pkgsOrig; }
+        then configExpr { inherit pkgs; }
         else configExpr;
 
   # Return an attribute from the Nixpkgs configuration file, or
@@ -87,21 +87,42 @@
   # Allow packages to be overriden globally via the `packageOverrides'
   # configuration option, which must be a function that takes `pkgs'
   # as an argument and returns a set of new or overriden packages.
-  # `__overrides' is a magic attribute that causes the attributes in
-  # its value to be added to the surrounding `rec'.  The
-  # `packageOverrides' function is called with the *original*
+  # The `packageOverrides' function is called with the *original*
   # (un-overriden) set of packages, allowing packageOverrides
   # attributes to refer to the original attributes (e.g. "foo =
   # ... pkgs.foo ...").
-  # We don't want stdenv overrides in the case of cross-building, or
-  # otherwise the basic overrided packages will not be built with the
-  # crossStdenv adapter.
-  overrides = (getConfig ["packageOverrides"] (pkgs: {})) pkgsOrig //
-    (if pkgsOrig.stdenv ? overrides && crossSystem == null
-     then pkgsOrig.stdenv.overrides else { });
+  pkgs = applyGlobalOverrides (getConfig ["packageOverrides"] (pkgs: {}));
+
 
-  pkgsOrig = pkgsFun { }; # the un-overriden packages, passed to 
packageOverrides
-  pkgs = pkgsFun overrides; # the overriden, final packages
+  # Return the complete set of packages, after applying the overrides
+  # returned by the `overrider' function (see above).
+  applyGlobalOverrides = overrider:
+    let
+      # Call the overrider function.  We don't want stdenv overrides
+      # in the case of cross-building, or otherwise the basic
+      # overrided packages will not be built with the crossStdenv
+      # adapter.
+      overrides = overrider pkgsOrig //
+        (lib.optionalAttrs (pkgsOrig.stdenv ? overrides && crossSystem == 
null) pkgsOrig.stdenv.overrides);
+
+      # The un-overriden packages, passed to `overrider'.
+      pkgsOrig = pkgsFun pkgs {}; 
+
+      # The overriden, final packages.
+      pkgs = pkgsFun pkgs overrides; 
+    in pkgs;
+
+
+  # The package compositions.  Yes, this isn't properly indented.
+  pkgsFun = pkgs: __overrides:
+    with helperFunctions;
+    let defaultScope = pkgs // pkgs.xorg; in
+    helperFunctions // rec {
+
+  # `__overrides' is a magic attribute that causes the attributes in
+  # its value to be added to the surrounding `rec'.  We'll remove this
+  # eventually.
+  inherit __overrides;
 
 
   # We use `callPackage' to be able to omit function arguments that
@@ -112,26 +133,19 @@
 
   newScope = extra: lib.callPackageWith (defaultScope // extra);
 
-  defaultScope = pkgs // pkgs.xorg;
-
-
-  # The package compositions.  Yes, this isn't properly indented.
-  pkgsFun = __overrides: with helperFunctions; helperFunctions // rec {
-
-
+  
   # Override system. This is useful to build i686 packages on x86_64-linux.
   forceSystem = system: (import ./all-packages.nix) {
     inherit system;
     inherit bootStdenv noSysDirs gccWithCC gccWithProfiling config;
   };
 
+  
   # Used by wine, firefox with debugging version of Flash, ...
   pkgsi686Linux = forceSystem "i686-linux";
 
   callPackage_i686 = lib.callPackageWith (pkgsi686Linux // pkgsi686Linux.xorg);
 
-  inherit __overrides;
-
 
   # For convenience, allow callers to get the path to Nixpkgs.
   path = ../..;
@@ -853,7 +867,7 @@
   nbd = callPackage ../tools/networking/nbd {
     glib = gtkLibs.glib.override {
       stdenv = makeStaticBinaries stdenv;
-  };
+    };
   };
 
   nc6 = callPackage ../tools/networking/nc6 { };
@@ -2082,7 +2096,7 @@
   python24 = lowPrio (callPackage ../development/interpreters/python/2.4 { });
 
   python26Base = lowPrio (makeOverridable (import 
../development/interpreters/python/2.6) {
-    inherit fetchurl stdenv zlib bzip2 gdbm;
+    inherit (pkgs) fetchurl stdenv zlib bzip2 gdbm;
     arch = if stdenv.isDarwin then darwinArchUtility else null;
     sw_vers = if stdenv.isDarwin then darwinSwVersUtility else null;
   });
_______________________________________________
nix-commits mailing list
[email protected]
http://mail.cs.uu.nl/mailman/listinfo/nix-commits

Reply via email to