[Nix-dev] (newbie) nix-env custom package installation

Kevin Quick quick at sparq.org
Sun Dec 4 17:03:08 CET 2011


On Sat, 03 Dec 2011 23:43:14 -0700, Иван Левашев <octagram at bluebottle.com>  
wrote:

> Hello!
>
> I'm running in circles. I can't install a self-written derivation that I
> haven't written into all-packages.nix. Manual only has samples where a
> package is present in all-packages.nix. I don't want to touch this file  
> yet.

Ivan,

One trick that I use is that your $HOME/.nix-defexpr will be scanned for  
.nix files.  It may be possible to put your rhash expression file there  
directly, but the setup I use is to have a $HOME/my_nixexprs directory  
with a subdirectory for each local package+nix expression file I want, and  
a $HOME/my_nixexprs/default.nix that acts similarly to all-packages.nix  
and is invoked by a local.nix file in my $HOME/.nix-defexpr.

For example:

$ cat $HOME/.nix-defexpr/local/nix:
{}:

let
   toplevel = import  /etc/nixos/nixpkgs/pkgs/top-level/all-packages.nix{};

   empkgs = toplevel.emacsPackages { emacs = toplevel.emacs; };
   evempkgs = empkgs { self = toplevel; };
   haskellMode = evempkgs.haskellMode;

   getEnv = x: if builtins ? getEnv then builtins.getEnv x else "";
   homeDir = getEnv "HOME";
   myNix = homeDir + "/my_nixexprs";

in
    import myNix { inherit toplevel; }
$

Note here that I have a couple of local definitions for various  
environments or settings from all-packages.nix that I may need in my local  
expressions.  You may need to update this periodically and as appropriate  
for your needs.

$ cat $HOME/my_nixexprs/default.nix
{ toplevel }:

let

   empkgs = toplevel.emacsPackages { emacs = toplevel.emacs; };

in
rec {

   haskellmodedarcs = import ./haskell-mode-darcs {
     inherit (toplevel) stdenv fetchurl fetchdarcs emacs;
     inherit empkgs;
   };

   smg = import ./smg { inherit (toplevel) fetchurl python  
buildPythonPackage; };

   pylibpcap = import ./pylibpcap { inherit (toplevel) fetchurl python  
stdenv libpcap; };

# Done.  Requires autoconf/automake though which causes lots of needed  
updates.
# Better to just use configureFlags for overrides?
   lnav = import ./lnav {
     inherit (toplevel) zlib stdenv fetchurl ncurses;
     inherit (toplevel) pcre readline sqlite binutils;
     autoconf = toplevel.autoconf;
     automake = toplevel.automake110x;
   };

   trowser = import ./trowser {
     inherit (toplevel) stdenv fetchurl tcl tk;
   };
}
$

The above default.nix functions as my local all-packages.nix and I add or  
remove packages (local subdirectories) as they are ready or retired.  This  
default.nix (plus my local.nix) provide all the tweaking so that the nix  
expression for the local packages is not aware that is it not part of the  
/etc/nixos/nixpkgs/ tree.

$ cat $HOME/my_nixexprs/pylibpcap/default.nix
{stdenv, fetchurl, python, libpcap}:

let
   version="0.6.2";
in

stdenv.mkDerivation rec {
   name = "pylibpcap-" + version;
   src = fetchurl {
     url = "mirror://sourceforge/pylibpcap/${name}.tar.gz";
     sha256 =  
"0cdb507eaf27e7d6f4e3ee74a5986e14728fd8161785350d201a12198c19fcc6";
   };
   buildInputs = [python libpcap];
   buildPhase = "python ./setup.py build";
   installPhase = ''
     python ./setup.py install --prefix="$out" || exit 1
   '';

   meta = {
     description = "Python module for the libpcap packet capture library";
     homepage = http://pylibpcap.sourceforge.net/;
   };
}
$

Hope this helps and that it's not too far from normal Nix practices.


-- 
-KQ


More information about the nix-dev mailing list