summary refs log tree commit diff
path: root/doc/functions/overrides.xml
blob: dc81e37950656500cf50d02fb95a72c6f0e792ae (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
<section xmlns="http://docbook.org/ns/docbook"
         xmlns:xlink="http://www.w3.org/1999/xlink"
         xmlns:xi="http://www.w3.org/2001/XInclude"
         xml:id="sec-overrides">
  <title>Overriding</title>

  <para>
   Sometimes one wants to override parts of <literal>nixpkgs</literal>, e.g.
   derivation attributes, the results of derivations or even the whole package
   set.
  </para>

  <section xml:id="sec-pkg-override">
   <title>&lt;pkg&gt;.override</title>

   <para>
    The function <varname>override</varname> is usually available for all the
    derivations in the nixpkgs expression (<varname>pkgs</varname>).
   </para>

   <para>
    It is used to override the arguments passed to a function.
   </para>

   <para>
    Example usages:
<programlisting>pkgs.foo.override { arg1 = val1; arg2 = val2; ... }</programlisting>
<programlisting>
import pkgs.path { overlays = [ (self: super: {
  foo = super.foo.override { barSupport = true ; };
  })]};
</programlisting>
<programlisting>
mypkg = pkgs.callPackage ./mypkg.nix {
  mydep = pkgs.mydep.override { ... };
  }
</programlisting>
   </para>

   <para>
    In the first example, <varname>pkgs.foo</varname> is the result of a
    function call with some default arguments, usually a derivation. Using
    <varname>pkgs.foo.override</varname> will call the same function with the
    given new arguments.
   </para>
  </section>

  <section xml:id="sec-pkg-overrideAttrs">
   <title>&lt;pkg&gt;.overrideAttrs</title>

   <para>
    The function <varname>overrideAttrs</varname> allows overriding the
    attribute set passed to a <varname>stdenv.mkDerivation</varname> call,
    producing a new derivation based on the original one. This function is
    available on all derivations produced by the
    <varname>stdenv.mkDerivation</varname> function, which is most packages in
    the nixpkgs expression <varname>pkgs</varname>.
   </para>

   <para>
    Example usage:
<programlisting>
helloWithDebug = pkgs.hello.overrideAttrs (oldAttrs: rec {
  separateDebugInfo = true;
});
</programlisting>
   </para>

   <para>
    In the above example, the <varname>separateDebugInfo</varname> attribute is
    overridden to be true, thus building debug info for
    <varname>helloWithDebug</varname>, while all other attributes will be
    retained from the original <varname>hello</varname> package.
   </para>

   <para>
    The argument <varname>oldAttrs</varname> is conventionally used to refer to
    the attr set originally passed to <varname>stdenv.mkDerivation</varname>.
   </para>

   <note>
    <para>
     Note that <varname>separateDebugInfo</varname> is processed only by the
     <varname>stdenv.mkDerivation</varname> function, not the generated, raw
     Nix derivation. Thus, using <varname>overrideDerivation</varname> will not
     work in this case, as it overrides only the attributes of the final
     derivation. It is for this reason that <varname>overrideAttrs</varname>
     should be preferred in (almost) all cases to
     <varname>overrideDerivation</varname>, i.e. to allow using
     <varname>sdenv.mkDerivation</varname> to process input arguments, as well
     as the fact that it is easier to use (you can use the same attribute names
     you see in your Nix code, instead of the ones generated (e.g.
     <varname>buildInputs</varname> vs <varname>nativeBuildInputs</varname>,
     and involves less typing.
    </para>
   </note>
  </section>

  <section xml:id="sec-pkg-overrideDerivation">
   <title>&lt;pkg&gt;.overrideDerivation</title>

   <warning>
    <para>
     You should prefer <varname>overrideAttrs</varname> in almost all cases,
     see its documentation for the reasons why.
     <varname>overrideDerivation</varname> is not deprecated and will continue
     to work, but is less nice to use and does not have as many abilities as
     <varname>overrideAttrs</varname>.
    </para>
   </warning>

   <warning>
    <para>
     Do not use this function in Nixpkgs as it evaluates a Derivation before
     modifying it, which breaks package abstraction and removes error-checking
     of function arguments. In addition, this evaluation-per-function
     application incurs a performance penalty, which can become a problem if
     many overrides are used. It is only intended for ad-hoc customisation,
     such as in <filename>~/.config/nixpkgs/config.nix</filename>.
    </para>
   </warning>

   <para>
    The function <varname>overrideDerivation</varname> creates a new derivation
    based on an existing one by overriding the original's attributes with the
    attribute set produced by the specified function. This function is
    available on all derivations defined using the
    <varname>makeOverridable</varname> function. Most standard
    derivation-producing functions, such as
    <varname>stdenv.mkDerivation</varname>, are defined using this function,
    which means most packages in the nixpkgs expression,
    <varname>pkgs</varname>, have this function.
   </para>

   <para>
    Example usage:
<programlisting>
mySed = pkgs.gnused.overrideDerivation (oldAttrs: {
  name = "sed-4.2.2-pre";
  src = fetchurl {
    url = ftp://alpha.gnu.org/gnu/sed/sed-4.2.2-pre.tar.bz2;
    sha256 = "11nq06d131y4wmf3drm0yk502d2xc6n5qy82cg88rb9nqd2lj41k";
  };
  patches = [];
});
</programlisting>
   </para>

   <para>
    In the above example, the <varname>name</varname>, <varname>src</varname>,
    and <varname>patches</varname> of the derivation will be overridden, while
    all other attributes will be retained from the original derivation.
   </para>

   <para>
    The argument <varname>oldAttrs</varname> is used to refer to the attribute
    set of the original derivation.
   </para>

   <note>
    <para>
     A package's attributes are evaluated *before* being modified by the
     <varname>overrideDerivation</varname> function. For example, the
     <varname>name</varname> attribute reference in <varname>url =
     "mirror://gnu/hello/${name}.tar.gz";</varname> is filled-in *before* the
     <varname>overrideDerivation</varname> function modifies the attribute set.
     This means that overriding the <varname>name</varname> attribute, in this
     example, *will not* change the value of the <varname>url</varname>
     attribute. Instead, we need to override both the <varname>name</varname>
     *and* <varname>url</varname> attributes.
    </para>
   </note>
  </section>

  <section xml:id="sec-lib-makeOverridable">
   <title>lib.makeOverridable</title>

   <para>
    The function <varname>lib.makeOverridable</varname> is used to make the
    result of a function easily customizable. This utility only makes sense for
    functions that accept an argument set and return an attribute set.
   </para>

   <para>
    Example usage:
<programlisting>
f = { a, b }: { result = a+b; };
c = lib.makeOverridable f { a = 1; b = 2; };
</programlisting>
   </para>

   <para>
    The variable <varname>c</varname> is the value of the <varname>f</varname>
    function applied with some default arguments. Hence the value of
    <varname>c.result</varname> is <literal>3</literal>, in this example.
   </para>

   <para>
    The variable <varname>c</varname> however also has some additional
    functions, like <link linkend="sec-pkg-override">c.override</link> which
    can be used to override the default arguments. In this example the value of
    <varname>(c.override { a = 4; }).result</varname> is 6.
   </para>
  </section>
 </section>