85 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			XML
		
	
	
	
	
	
			
		
		
	
	
			85 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			XML
		
	
	
	
	
	
| <section xmlns="http://docbook.org/ns/docbook"
 | ||
|          xmlns:xlink="http://www.w3.org/1999/xlink"
 | ||
|          xmlns:xi="http://www.w3.org/2001/XInclude"
 | ||
|          version="5.0"
 | ||
|          xml:id="sec-custom-packages">
 | ||
| 
 | ||
| <title>Adding Custom Packages</title>
 | ||
| 
 | ||
| <para>It’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 <link
 | ||
| xlink:href="http://nixos.org/nixpkgs/manual">Nixpkgs manual</link>.
 | ||
| In short, you clone Nixpkgs:
 | ||
| 
 | ||
| <screen>
 | ||
| $ git clone git://github.com/NixOS/nixpkgs.git
 | ||
| $ cd nixpkgs
 | ||
| </screen>
 | ||
| 
 | ||
| Then you write and test the package as described in the Nixpkgs
 | ||
| manual.  Finally, you add it to
 | ||
| <literal>environment.systemPackages</literal>, e.g.
 | ||
| 
 | ||
| <programlisting>
 | ||
| environment.systemPackages = [ pkgs.my-package ];
 | ||
| </programlisting>
 | ||
| 
 | ||
| and you run <command>nixos-rebuild</command>, specifying your own
 | ||
| Nixpkgs tree:
 | ||
| 
 | ||
| <screen>
 | ||
| $ nixos-rebuild switch -I nixpkgs=/path/to/my/nixpkgs</screen>
 | ||
| 
 | ||
| </para>
 | ||
| 
 | ||
| <para>The second possibility is to add the package outside of the
 | ||
| Nixpkgs tree.  For instance, here is how you specify a build of the
 | ||
| <link xlink:href="http://www.gnu.org/software/hello/">GNU Hello</link>
 | ||
| package directly in <filename>configuration.nix</filename>:
 | ||
| 
 | ||
| <programlisting>
 | ||
| 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 ];
 | ||
| </programlisting>
 | ||
| 
 | ||
| Of course, you can also move the definition of
 | ||
| <literal>my-hello</literal> into a separate Nix expression, e.g.
 | ||
| <programlisting>
 | ||
| environment.systemPackages = [ (import ./my-hello.nix) ];
 | ||
| </programlisting>
 | ||
| where <filename>my-hello.nix</filename> contains:
 | ||
| <programlisting>
 | ||
| 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";
 | ||
|   };
 | ||
| }
 | ||
| </programlisting>
 | ||
| 
 | ||
| This allows testing the package easily:
 | ||
| <screen>
 | ||
| $ nix-build my-hello.nix
 | ||
| $ ./result/bin/hello
 | ||
| Hello, world!
 | ||
| </screen>
 | ||
| 
 | ||
| </para>
 | ||
| 
 | ||
| </section>
 | 
