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