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> |