Adding Custom PackagesIt’s possible that a package you need is not available in NixOS.
In that case, you can do two things. First, you can clone the Nixpkgs
repository, add the package to your clone, and (optionally) submit a
patch or pull request to have it accepted into the main Nixpkgs
repository. This is described in detail in the Nixpkgs manual.
In short, you clone Nixpkgs:
$ git clone git://github.com/NixOS/nixpkgs.git
$ cd nixpkgs
Then you write and test the package as described in the Nixpkgs
manual. Finally, you add it to
environment.systemPackages, e.g.
environment.systemPackages = [ pkgs.my-package ];
and you run nixos-rebuild, specifying your own
Nixpkgs tree:
$ nixos-rebuild switch -I nixpkgs=/path/to/my/nixpkgsThe second possibility is to add the package outside of the
Nixpkgs tree. For instance, here is how you specify a build of the
GNU Hello
package directly in configuration.nix:
environment.systemPackages =
let
my-hello = with pkgs; stdenv.mkDerivation rec {
name = "hello-2.8";
src = fetchurl {
url = "mirror://gnu/hello/${name}.tar.gz";
sha256 = "0wqd8sjmxfskrflaxywc7gqw7sfawrfvdxd9skxawzfgyy0pzdz6";
};
};
in
[ my-hello ];
Of course, you can also move the definition of
my-hello into a separate Nix expression, e.g.
environment.systemPackages = [ (import ./my-hello.nix) ];
where my-hello.nix contains:
with import <nixpkgs> {}; # bring all of Nixpkgs into scope
stdenv.mkDerivation rec {
name = "hello-2.8";
src = fetchurl {
url = "mirror://gnu/hello/${name}.tar.gz";
sha256 = "0wqd8sjmxfskrflaxywc7gqw7sfawrfvdxd9skxawzfgyy0pzdz6";
};
}
This allows testing the package easily:
$ nix-build my-hello.nix
$ ./result/bin/hello
Hello, world!