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