summary refs log tree commit diff
path: root/doc/quick-start.xml
blob: 35983f0b114a1ae21ca2d5372f36ed238f4a1d5a (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
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
<chapter xmlns="http://docbook.org/ns/docbook"
         xmlns:xlink="http://www.w3.org/1999/xlink"
         xml:id="chap-quick-start">

<title>Quick Start to Adding a Package</title>

<para>To add a package to Nixpkgs:

<orderedlist>

  <listitem>
    <para>Checkout the Nixpkgs source tree:

<screen>
$ git clone git://github.com/NixOS/nixpkgs.git 
$ cd nixpkgs</screen>

    </para>
  </listitem>

  <listitem>
    <para>Find a good place in the Nixpkgs tree to add the Nix
    expression for your package.  For instance, a library package
    typically goes into
    <filename>pkgs/development/libraries/<replaceable>pkgname</replaceable></filename>,
    while a web browser goes into
    <filename>pkgs/applications/networking/browsers/<replaceable>pkgname</replaceable></filename>.
    See <xref linkend="sec-organisation" /> for some hints on the tree
    organisation.  Create a directory for your package, e.g.

<screen>
$ mkdir pkgs/development/libraries/libfoo</screen>
  
    </para>
  </listitem>

  <listitem>
    <para>In the package directory, create a Nix expression  a piece
    of code that describes how to build the package.  In this case, it
    should be a <emphasis>function</emphasis> that is called with the
    package dependencies as arguments, and returns a build of the
    package in the Nix store.  The expression should usually be called
    <filename>default.nix</filename>.

<screen>
$ emacs pkgs/development/libraries/libfoo/default.nix
$ git add pkgs/development/libraries/libfoo/default.nix</screen>

    </para>

    <para>You can have a look at the existing Nix expressions under
    <filename>pkgs/</filename> to see how it’s done.  Here are some
    good ones:

      <itemizedlist>

        <listitem>
          <para>GNU cpio: <link
          xlink:href="https://github.com/NixOS/nixpkgs/blob/master/pkgs/tools/archivers/cpio/default.nix"><filename>pkgs/tools/archivers/cpio/default.nix</filename></link>.
          The simplest possible package.  The generic builder in
          <varname>stdenv</varname> does everything for you.  It has
          no dependencies beyond <varname>stdenv</varname>.</para>
        </listitem>

        <listitem>
          <para>GNU Hello: <link
          xlink:href="https://github.com/NixOS/nixpkgs/blob/master/pkgs/applications/misc/hello/ex-2/default.nix"><filename>pkgs/applications/misc/hello/ex-2/default.nix</filename></link>.
          Also trivial, but it specifies some <varname>meta</varname>
          attributes which is good practice.</para>
        </listitem>

        <listitem>
          <para>GNU Multiple Precision arithmetic library (GMP): <link
          xlink:href="https://github.com/NixOS/nixpkgs/blob/master/pkgs/development/libraries/gmp/5.1.1.nix"><filename>pkgs/development/libraries/gmp/5.1.1.nix</filename></link>.
          Also done by the generic builder, but has a dependency on
          <varname>m4</varname>.</para>
        </listitem>

        <listitem>
          <para>Pan, a GTK-based newsreader: <link
          xlink:href="https://github.com/NixOS/nixpkgs/blob/master/pkgs/applications/networking/newsreaders/pan/default.nix"><filename>pkgs/applications/networking/newsreaders/pan/default.nix</filename></link>.
          Has an optional dependency on <varname>gtkspell</varname>,
          which is only built if <varname>spellCheck</varname> is
          <literal>true</literal>.</para>
        </listitem>

        <listitem>
          <para>Apache HTTPD: <link
          xlink:href="https://github.com/NixOS/nixpkgs/blob/master/pkgs/servers/http/apache-httpd/2.4.nix"><filename>pkgs/servers/http/apache-httpd/2.4.nix</filename></link>.
          A bunch of optional features, variable substitutions in the
          configure flags, a post-install hook, and miscellaneous
          hackery.</para>
        </listitem>

        <listitem>
          <para>BitTorrent (wxPython-based): <link
          xlink:href="https://github.com/NixOS/nixpkgs/blob/master/pkgs/tools/networking/p2p/bittorrent/default.nix"><filename>pkgs/tools/networking/p2p/bittorrent/default.nix</filename></link>.
          Uses an external <link
          xlink:href="https://github.com/NixOS/nixpkgs/blob/master/pkgs/tools/networking/p2p/bittorrent/builder.sh">build
          script</link>, which can be useful if you have lots of code
          that you don’t want cluttering up the Nix expression.  But
          external builders are mostly obsolete.
          </para>
        </listitem>

        <listitem>
          <para>Thunderbird: <link
          xlink:href="https://github.com/NixOS/nixpkgs/blob/master/pkgs/applications/networking/mailreaders/thunderbird/default.nix"><filename>pkgs/applications/networking/mailreaders/thunderbird/default.nix</filename></link>.
          Lots of dependencies.</para>
        </listitem>

        <listitem>
          <para>JDiskReport, a Java utility: <link
          xlink:href="https://github.com/NixOS/nixpkgs/blob/master/pkgs/tools/misc/jdiskreport/default.nix"><filename>pkgs/tools/misc/jdiskreport/default.nix</filename></link>
          (and the <link
          xlink:href="https://github.com/NixOS/nixpkgs/blob/master/pkgs/tools/misc/jdiskreport/builder.sh">builder</link>).
          Nixpkgs doesn’t have a decent <varname>stdenv</varname> for
          Java yet so this is pretty ad-hoc.</para>
        </listitem>

        <listitem>
          <para>XML::Simple, a Perl module: <link
          xlink:href="https://github.com/NixOS/nixpkgs/blob/master/pkgs/top-level/perl-packages.nix"><filename>pkgs/top-level/perl-packages.nix</filename></link>
          (search for the <varname>XMLSimple</varname> attribute).
          Most Perl modules are so simple to build that they are
          defined directly in <filename>perl-packages.nix</filename>;
          no need to make a separate file for them.</para>
        </listitem>

        <listitem>
          <para>Adobe Reader: <link
          xlink:href="https://github.com/NixOS/nixpkgs/blob/master/pkgs/applications/misc/adobe-reader/default.nix"><filename>pkgs/applications/misc/adobe-reader/default.nix</filename></link>.
          Shows how binary-only packages can be supported.  In
          particular the <link
          xlink:href="https://github.com/NixOS/nixpkgs/blob/master/pkgs/applications/misc/adobe-reader/builder.sh">builder</link>
          uses <command>patchelf</command> to set the RUNPATH and ELF
          interpreter of the executables so that the right libraries
          are found at runtime.</para>
        </listitem>

      </itemizedlist>

    </para>

    <para>Some notes:

      <itemizedlist>

        <listitem>
          <para>All <varname linkend="chap-meta">meta</varname>
          attributes are optional, but it’s still a good idea to
          provide at least the <varname>description</varname>,
          <varname>homepage</varname> and <varname
          linkend="sec-meta-license">license</varname>.</para>
        </listitem>

        <listitem>
          <para>You can use <command>nix-prefetch-url</command>
          <replaceable>url</replaceable> to get the SHA-256 hash of
          source distributions.</para>
        </listitem>

        <listitem>
          <para>A list of schemes for <literal>mirror://</literal>
          URLs can be found in <link
          xlink:href="https://github.com/NixOS/nixpkgs/blob/master/pkgs/build-support/fetchurl/mirrors.nix"><filename>pkgs/build-support/fetchurl/mirrors.nix</filename></link>.</para>
        </listitem>

      </itemizedlist>

    </para>

    <para>The exact syntax and semantics of the Nix expression
    language, including the built-in function, are described in the
    Nix manual in the <link
    xlink:href="http://hydra.nixos.org/job/nix/trunk/tarball/latest/download-by-type/doc/manual/#chap-writing-nix-expressions">chapter
    on writing Nix expressions</link>.</para>
    
  </listitem>

  <listitem>
    <para>Add a call to the function defined in the previous step to
    <link
    xlink:href="https://github.com/NixOS/nixpkgs/blob/master/pkgs/top-level/all-packages.nix"><filename>pkgs/top-level/all-packages.nix</filename></link>
    with some descriptive name for the variable,
    e.g. <varname>libfoo</varname>.

    <screen>
$ emacs pkgs/top-level/all-packages.nix</screen>
      
    </para>

    <para>The attributes in that file are sorted by category (like
    “Development / Libraries”) that more-or-less correspond to the
    directory structure of Nixpkgs, and then by attribute name.</para>
  </listitem>

  <listitem>
    <para>To test whether the package builds, run the following command
    from the root of the nixpkgs source tree:

    <screen>
$ nix-build -A libfoo</screen>

    where <varname>libfoo</varname> should be the variable name
    defined in the previous step.  You may want to add the flag
    <option>-K</option> to keep the temporary build directory in case
    something fails.  If the build succeeds, a symlink
    <filename>./result</filename> to the package in the Nix store is
    created.</para>
  </listitem>

  <listitem>
    <para>If you want to install the package into your profile
    (optional), do

    <screen>
$ nix-env -f . -iA libfoo</screen>

    </para>
  </listitem>

  <listitem>
    <para>Optionally commit the new package, or send a patch to
    <literal>nix-dev@cs.uu.nl</literal>.</para>
  </listitem>

  <listitem>
    <para>If you want the TU Delft build farm to build binaries of the
    package and make them available in the <link
    xlink:href="http://nixos.org/releases/nixpkgs/channels/nixpkgs-unstable/"><literal>nixpkgs</literal>
    channel</link>, add it to <link
    xlink:href="https://github.com/NixOS/nixpkgs/blob/master/pkgs/top-level/release.nix"><filename>pkgs/top-level/release.nix</filename></link>.</para>
  </listitem>

</orderedlist>

</para>

</chapter>