93 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			XML
		
	
	
	
	
	
			
		
		
	
	
			93 lines
		
	
	
		
			3.7 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-customising-packages">
 | 
						||
 | 
						||
<title>Customising Packages</title>
 | 
						||
 | 
						||
<para>Some packages in Nixpkgs have options to enable or disable
 | 
						||
optional functionality or change other aspects of the package.  For
 | 
						||
instance, the Firefox wrapper package (which provides Firefox with a
 | 
						||
set of plugins such as the Adobe Flash player) has an option to enable
 | 
						||
the Google Talk plugin.  It can be set in
 | 
						||
<filename>configuration.nix</filename> as follows:
 | 
						||
 | 
						||
<filename>
 | 
						||
nixpkgs.config.firefox.enableGoogleTalkPlugin = true;
 | 
						||
</filename>
 | 
						||
</para>
 | 
						||
 | 
						||
<warning><para>Unfortunately, Nixpkgs currently lacks a way to query
 | 
						||
available configuration options.</para></warning>
 | 
						||
 | 
						||
<para>Apart from high-level options, it’s possible to tweak a package
 | 
						||
in almost arbitrary ways, such as changing or disabling dependencies
 | 
						||
of a package.  For instance, the Emacs package in Nixpkgs by default
 | 
						||
has a dependency on GTK+ 2.  If you want to build it against GTK+ 3,
 | 
						||
you can specify that as follows:
 | 
						||
 | 
						||
<programlisting>
 | 
						||
environment.systemPackages = [ (pkgs.emacs.override { gtk = pkgs.gtk3; }) ];
 | 
						||
</programlisting>
 | 
						||
 | 
						||
The function <varname>override</varname> performs the call to the Nix
 | 
						||
function that produces Emacs, with the original arguments amended by
 | 
						||
the set of arguments specified by you.  So here the function argument
 | 
						||
<varname>gtk</varname> gets the value <literal>pkgs.gtk3</literal>,
 | 
						||
causing Emacs to depend on GTK+ 3.  (The parentheses are necessary
 | 
						||
because in Nix, function application binds more weakly than list
 | 
						||
construction, so without them,
 | 
						||
<literal>environment.systemPackages</literal> would be a list with two
 | 
						||
elements.)</para>
 | 
						||
 | 
						||
<para>Even greater customisation is possible using the function
 | 
						||
<varname>overrideDerivation</varname>.  While the
 | 
						||
<varname>override</varname> mechanism above overrides the arguments of
 | 
						||
a package function, <varname>overrideDerivation</varname> allows
 | 
						||
changing the <emphasis>result</emphasis> of the function.  This
 | 
						||
permits changing any aspect of the package, such as the source code.
 | 
						||
For instance, if you want to override the source code of Emacs, you
 | 
						||
can say:
 | 
						||
 | 
						||
<programlisting>
 | 
						||
environment.systemPackages =
 | 
						||
  [ (pkgs.lib.overrideDerivation pkgs.emacs (attrs: {
 | 
						||
      name = "emacs-25.0-pre";
 | 
						||
      src = /path/to/my/emacs/tree;
 | 
						||
    }))
 | 
						||
  ];
 | 
						||
</programlisting>
 | 
						||
 | 
						||
Here, <varname>overrideDerivation</varname> takes the Nix derivation
 | 
						||
specified by <varname>pkgs.emacs</varname> and produces a new
 | 
						||
derivation in which the original’s <literal>name</literal> and
 | 
						||
<literal>src</literal> attribute have been replaced by the given
 | 
						||
values.  The original attributes are accessible via
 | 
						||
<varname>attrs</varname>.</para>
 | 
						||
 | 
						||
<para>The overrides shown above are not global.  They do not affect
 | 
						||
the original package; other packages in Nixpkgs continue to depend on
 | 
						||
the original rather than the customised package.  This means that if
 | 
						||
another package in your system depends on the original package, you
 | 
						||
end up with two instances of the package.  If you want to have
 | 
						||
everything depend on your customised instance, you can apply a
 | 
						||
<emphasis>global</emphasis> override as follows:
 | 
						||
 | 
						||
<screen>
 | 
						||
nixpkgs.config.packageOverrides = pkgs:
 | 
						||
  { emacs = pkgs.emacs.override { gtk = pkgs.gtk3; };
 | 
						||
  };
 | 
						||
</screen>
 | 
						||
 | 
						||
The effect of this definition is essentially equivalent to modifying
 | 
						||
the <literal>emacs</literal> attribute in the Nixpkgs source tree.
 | 
						||
Any package in Nixpkgs that depends on <literal>emacs</literal> will
 | 
						||
be passed your customised instance.  (However, the value
 | 
						||
<literal>pkgs.emacs</literal> in
 | 
						||
<varname>nixpkgs.config.packageOverrides</varname> refers to the
 | 
						||
original rather than overridden instance, to prevent an infinite
 | 
						||
recursion.)</para>
 | 
						||
 | 
						||
</section>
 |