2009-09-25 08:27:26 -06:00
|
|
|
|
<chapter xmlns="http://docbook.org/ns/docbook"
|
|
|
|
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
|
|
|
|
xml:id="chap-conventions">
|
2018-05-01 17:54:21 -06:00
|
|
|
|
<title>Coding conventions</title>
|
|
|
|
|
<section xml:id="sec-syntax">
|
|
|
|
|
<title>Syntax</title>
|
|
|
|
|
|
|
|
|
|
<itemizedlist>
|
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
Use 2 spaces of indentation per indentation level in Nix expressions, 4
|
|
|
|
|
spaces in shell scripts.
|
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
Do not use tab characters, i.e. configure your editor to use soft tabs.
|
|
|
|
|
For instance, use <literal>(setq-default indent-tabs-mode nil)</literal>
|
|
|
|
|
in Emacs. Everybody has different tab settings so it’s asking for
|
|
|
|
|
trouble.
|
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
Use <literal>lowerCamelCase</literal> for variable names, not
|
|
|
|
|
<literal>UpperCamelCase</literal>. Note, this rule does not apply to
|
|
|
|
|
package attribute names, which instead follow the rules in
|
|
|
|
|
<xref linkend="sec-package-naming"/>.
|
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
Function calls with attribute set arguments are written as
|
2009-09-25 08:27:26 -06:00
|
|
|
|
<programlisting>
|
|
|
|
|
foo {
|
|
|
|
|
arg = ...;
|
|
|
|
|
}
|
|
|
|
|
</programlisting>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
not
|
2009-09-25 08:27:26 -06:00
|
|
|
|
<programlisting>
|
|
|
|
|
foo
|
|
|
|
|
{
|
|
|
|
|
arg = ...;
|
|
|
|
|
}
|
|
|
|
|
</programlisting>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
Also fine is
|
2009-09-25 08:27:26 -06:00
|
|
|
|
<programlisting>
|
|
|
|
|
foo { arg = ...; }
|
|
|
|
|
</programlisting>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
if it's a short call.
|
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
In attribute sets or lists that span multiple lines, the attribute names
|
|
|
|
|
or list elements should be aligned:
|
2009-09-25 08:27:26 -06:00
|
|
|
|
<programlisting>
|
|
|
|
|
# A long list.
|
2018-11-27 14:14:41 -07:00
|
|
|
|
list = [
|
|
|
|
|
elem1
|
|
|
|
|
elem2
|
|
|
|
|
elem3
|
|
|
|
|
];
|
2009-09-25 08:27:26 -06:00
|
|
|
|
|
|
|
|
|
# A long attribute set.
|
|
|
|
|
attrs = {
|
|
|
|
|
attr1 = short_expr;
|
|
|
|
|
attr2 =
|
|
|
|
|
if true then big_expr else big_expr;
|
|
|
|
|
};
|
2018-11-27 14:14:41 -07:00
|
|
|
|
|
|
|
|
|
# Combined
|
|
|
|
|
listOfAttrs = [
|
|
|
|
|
{
|
|
|
|
|
attr1 = 3;
|
|
|
|
|
attr2 = "fff";
|
|
|
|
|
}
|
|
|
|
|
{
|
|
|
|
|
attr1 = 5;
|
|
|
|
|
attr2 = "ggg";
|
|
|
|
|
}
|
|
|
|
|
];
|
2009-09-25 08:27:26 -06:00
|
|
|
|
</programlisting>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
Short lists or attribute sets can be written on one line:
|
2009-09-25 08:27:26 -06:00
|
|
|
|
<programlisting>
|
|
|
|
|
# A short list.
|
|
|
|
|
list = [ elem1 elem2 elem3 ];
|
|
|
|
|
|
|
|
|
|
# A short set.
|
|
|
|
|
attrs = { x = 1280; y = 1024; };
|
|
|
|
|
</programlisting>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
Breaking in the middle of a function argument can give hard-to-read code,
|
|
|
|
|
like
|
2009-09-25 08:27:26 -06:00
|
|
|
|
<programlisting>
|
|
|
|
|
someFunction { x = 1280;
|
|
|
|
|
y = 1024; } otherArg
|
|
|
|
|
yetAnotherArg
|
|
|
|
|
</programlisting>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
(especially if the argument is very large, spanning multiple lines).
|
|
|
|
|
</para>
|
|
|
|
|
<para>
|
|
|
|
|
Better:
|
2009-09-25 08:27:26 -06:00
|
|
|
|
<programlisting>
|
|
|
|
|
someFunction
|
|
|
|
|
{ x = 1280; y = 1024; }
|
|
|
|
|
otherArg
|
|
|
|
|
yetAnotherArg
|
|
|
|
|
</programlisting>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
or
|
2009-09-25 08:27:26 -06:00
|
|
|
|
<programlisting>
|
|
|
|
|
let res = { x = 1280; y = 1024; };
|
|
|
|
|
in someFunction res otherArg yetAnotherArg
|
|
|
|
|
</programlisting>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
The bodies of functions, asserts, and withs are not indented to prevent a
|
|
|
|
|
lot of superfluous indentation levels, i.e.
|
2009-09-25 08:27:26 -06:00
|
|
|
|
<programlisting>
|
|
|
|
|
{ arg1, arg2 }:
|
|
|
|
|
assert system == "i686-linux";
|
|
|
|
|
stdenv.mkDerivation { ...
|
|
|
|
|
</programlisting>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
not
|
2009-09-25 08:27:26 -06:00
|
|
|
|
<programlisting>
|
|
|
|
|
{ arg1, arg2 }:
|
|
|
|
|
assert system == "i686-linux";
|
|
|
|
|
stdenv.mkDerivation { ...
|
|
|
|
|
</programlisting>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
Function formal arguments are written as:
|
2009-09-25 08:27:26 -06:00
|
|
|
|
<programlisting>
|
|
|
|
|
{ arg1, arg2, arg3 }:
|
|
|
|
|
</programlisting>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
but if they don't fit on one line they're written as:
|
2009-09-25 08:27:26 -06:00
|
|
|
|
<programlisting>
|
|
|
|
|
{ arg1, arg2, arg3
|
|
|
|
|
, arg4, ...
|
|
|
|
|
, # Some comment...
|
|
|
|
|
argN
|
|
|
|
|
}:
|
2009-11-18 03:52:37 -07:00
|
|
|
|
</programlisting>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
Functions should list their expected arguments as precisely as possible.
|
|
|
|
|
That is, write
|
2009-11-18 03:52:37 -07:00
|
|
|
|
<programlisting>
|
|
|
|
|
{ stdenv, fetchurl, perl }: <replaceable>...</replaceable>
|
|
|
|
|
</programlisting>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
instead of
|
2009-11-18 03:52:37 -07:00
|
|
|
|
<programlisting>
|
|
|
|
|
args: with args; <replaceable>...</replaceable>
|
|
|
|
|
</programlisting>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
or
|
2009-11-18 03:52:37 -07:00
|
|
|
|
<programlisting>
|
|
|
|
|
{ stdenv, fetchurl, perl, ... }: <replaceable>...</replaceable>
|
|
|
|
|
</programlisting>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
</para>
|
|
|
|
|
<para>
|
|
|
|
|
For functions that are truly generic in the number of arguments (such as
|
|
|
|
|
wrappers around <varname>mkDerivation</varname>) that have some required
|
|
|
|
|
arguments, you should write them using an <literal>@</literal>-pattern:
|
2009-11-18 03:52:37 -07:00
|
|
|
|
<programlisting>
|
|
|
|
|
{ stdenv, doCoverageAnalysis ? false, ... } @ args:
|
|
|
|
|
|
|
|
|
|
stdenv.mkDerivation (args // {
|
|
|
|
|
<replaceable>...</replaceable> if doCoverageAnalysis then "bla" else "" <replaceable>...</replaceable>
|
|
|
|
|
})
|
|
|
|
|
</programlisting>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
instead of
|
2009-11-18 03:52:37 -07:00
|
|
|
|
<programlisting>
|
|
|
|
|
args:
|
|
|
|
|
|
|
|
|
|
args.stdenv.mkDerivation (args // {
|
|
|
|
|
<replaceable>...</replaceable> if args ? doCoverageAnalysis && args.doCoverageAnalysis then "bla" else "" <replaceable>...</replaceable>
|
|
|
|
|
})
|
2009-09-25 08:27:26 -06:00
|
|
|
|
</programlisting>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
</itemizedlist>
|
|
|
|
|
</section>
|
|
|
|
|
<section xml:id="sec-package-naming">
|
|
|
|
|
<title>Package naming</title>
|
2009-09-25 08:27:26 -06:00
|
|
|
|
|
2018-11-10 11:13:00 -07:00
|
|
|
|
<para>
|
|
|
|
|
The key words
|
|
|
|
|
<emphasis>must</emphasis>,
|
|
|
|
|
<emphasis>must not</emphasis>,
|
|
|
|
|
<emphasis>required</emphasis>,
|
|
|
|
|
<emphasis>shall</emphasis>,
|
|
|
|
|
<emphasis>shall not</emphasis>,
|
|
|
|
|
<emphasis>should</emphasis>,
|
|
|
|
|
<emphasis>should not</emphasis>,
|
|
|
|
|
<emphasis>recommended</emphasis>,
|
|
|
|
|
<emphasis>may</emphasis>,
|
|
|
|
|
and <emphasis>optional</emphasis> in this section
|
|
|
|
|
are to be interpreted as described in
|
|
|
|
|
<link xlink:href="https://tools.ietf.org/html/rfc2119">RFC 2119</link>.
|
|
|
|
|
Only <emphasis>emphasized</emphasis> words are to be interpreted in this way.
|
|
|
|
|
</para>
|
|
|
|
|
|
2018-05-01 17:54:21 -06:00
|
|
|
|
<para>
|
|
|
|
|
In Nixpkgs, there are generally three different names associated with a
|
|
|
|
|
package:
|
|
|
|
|
<itemizedlist>
|
2009-11-18 06:54:20 -07:00
|
|
|
|
<listitem>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
<para>
|
|
|
|
|
The <varname>name</varname> attribute of the derivation (excluding the
|
|
|
|
|
version part). This is what most users see, in particular when using
|
|
|
|
|
<command>nix-env</command>.
|
|
|
|
|
</para>
|
2009-11-18 06:54:20 -07:00
|
|
|
|
</listitem>
|
|
|
|
|
<listitem>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
<para>
|
|
|
|
|
The variable name used for the instantiated package in
|
|
|
|
|
<filename>all-packages.nix</filename>, and when passing it as a
|
|
|
|
|
dependency to other functions. Typically this is called the
|
|
|
|
|
<emphasis>package attribute name</emphasis>. This is what Nix expression
|
|
|
|
|
authors see. It can also be used when installing using <command>nix-env
|
|
|
|
|
-iA</command>.
|
|
|
|
|
</para>
|
2009-11-18 06:54:20 -07:00
|
|
|
|
</listitem>
|
|
|
|
|
<listitem>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
<para>
|
|
|
|
|
The filename for (the directory containing) the Nix expression.
|
|
|
|
|
</para>
|
2009-11-18 06:54:20 -07:00
|
|
|
|
</listitem>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
</itemizedlist>
|
|
|
|
|
Most of the time, these are the same. For instance, the package
|
|
|
|
|
<literal>e2fsprogs</literal> has a <varname>name</varname> attribute
|
|
|
|
|
<literal>"e2fsprogs-<replaceable>version</replaceable>"</literal>, is bound
|
|
|
|
|
to the variable name <varname>e2fsprogs</varname> in
|
|
|
|
|
<filename>all-packages.nix</filename>, and the Nix expression is in
|
|
|
|
|
<filename>pkgs/os-specific/linux/e2fsprogs/default.nix</filename>.
|
|
|
|
|
</para>
|
|
|
|
|
|
|
|
|
|
<para>
|
|
|
|
|
There are a few naming guidelines:
|
|
|
|
|
<itemizedlist>
|
2009-11-18 06:54:20 -07:00
|
|
|
|
<listitem>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
<para>
|
2018-11-10 11:13:00 -07:00
|
|
|
|
The <literal>name</literal> attribute <emphasis>should</emphasis>
|
|
|
|
|
be identical to the upstream package name.
|
2018-05-01 17:54:21 -06:00
|
|
|
|
</para>
|
2009-11-18 06:54:20 -07:00
|
|
|
|
</listitem>
|
|
|
|
|
<listitem>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
<para>
|
2018-11-10 11:13:00 -07:00
|
|
|
|
The <literal>name</literal> attribute <emphasis>must not</emphasis>
|
|
|
|
|
contain uppercase letters — e.g., <literal>"mplayer-1.0rc2"</literal>
|
|
|
|
|
instead of <literal>"MPlayer-1.0rc2"</literal>.
|
2018-05-01 17:54:21 -06:00
|
|
|
|
</para>
|
2009-11-18 06:54:20 -07:00
|
|
|
|
</listitem>
|
2015-06-18 02:44:27 -06:00
|
|
|
|
<listitem>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
<para>
|
|
|
|
|
The version part of the <literal>name</literal> attribute
|
|
|
|
|
<emphasis>must</emphasis> start with a digit (following a dash) — e.g.,
|
|
|
|
|
<literal>"hello-0.3.1rc2"</literal>.
|
|
|
|
|
</para>
|
2015-06-18 02:44:27 -06:00
|
|
|
|
</listitem>
|
2009-11-18 06:54:20 -07:00
|
|
|
|
<listitem>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
<para>
|
|
|
|
|
If a package is not a release but a commit from a repository, then the
|
|
|
|
|
version part of the name <emphasis>must</emphasis> be the date of that
|
2018-11-10 11:13:00 -07:00
|
|
|
|
(fetched) commit. The date <emphasis>must</emphasis> be in <literal>"YYYY-MM-DD"</literal>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
format. Also append <literal>"unstable"</literal> to the name - e.g.,
|
|
|
|
|
<literal>"pkgname-unstable-2014-09-23"</literal>.
|
|
|
|
|
</para>
|
2009-11-18 06:54:20 -07:00
|
|
|
|
</listitem>
|
|
|
|
|
<listitem>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
<para>
|
2018-11-10 11:13:00 -07:00
|
|
|
|
Dashes in the package name <emphasis>should</emphasis> be preserved in new variable names,
|
2018-05-01 17:54:21 -06:00
|
|
|
|
rather than converted to underscores or camel cased — e.g.,
|
|
|
|
|
<varname>http-parser</varname> instead of <varname>http_parser</varname>
|
|
|
|
|
or <varname>httpParser</varname>. The hyphenated style is preferred in
|
|
|
|
|
all three package names.
|
|
|
|
|
</para>
|
2009-11-18 06:54:20 -07:00
|
|
|
|
</listitem>
|
|
|
|
|
<listitem>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
<para>
|
2018-11-10 11:13:00 -07:00
|
|
|
|
If there are multiple versions of a package, this <emphasis>should</emphasis> be reflected in
|
2018-05-01 17:54:21 -06:00
|
|
|
|
the variable names in <filename>all-packages.nix</filename>, e.g.
|
|
|
|
|
<varname>json-c-0-9</varname> and <varname>json-c-0-11</varname>. If
|
|
|
|
|
there is an obvious “default” version, make an attribute like
|
|
|
|
|
<literal>json-c = json-c-0-9;</literal>. See also
|
|
|
|
|
<xref linkend="sec-versioning" />
|
|
|
|
|
</para>
|
2009-11-18 06:54:20 -07:00
|
|
|
|
</listitem>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
</itemizedlist>
|
|
|
|
|
</para>
|
|
|
|
|
</section>
|
|
|
|
|
<section xml:id="sec-organisation">
|
|
|
|
|
<title>File naming and organisation</title>
|
2009-11-18 08:05:09 -07:00
|
|
|
|
|
2018-05-01 17:54:21 -06:00
|
|
|
|
<para>
|
|
|
|
|
Names of files and directories should be in lowercase, with dashes between
|
|
|
|
|
words — not in camel case. For instance, it should be
|
|
|
|
|
<filename>all-packages.nix</filename>, not
|
|
|
|
|
<filename>allPackages.nix</filename> or
|
|
|
|
|
<filename>AllPackages.nix</filename>.
|
|
|
|
|
</para>
|
2009-11-18 08:05:09 -07:00
|
|
|
|
|
2018-05-01 17:54:21 -06:00
|
|
|
|
<section xml:id="sec-hierarchy">
|
|
|
|
|
<title>Hierarchy</title>
|
|
|
|
|
|
|
|
|
|
<para>
|
|
|
|
|
Each package should be stored in its own directory somewhere in the
|
|
|
|
|
<filename>pkgs/</filename> tree, i.e. in
|
|
|
|
|
<filename>pkgs/<replaceable>category</replaceable>/<replaceable>subcategory</replaceable>/<replaceable>...</replaceable>/<replaceable>pkgname</replaceable></filename>.
|
|
|
|
|
Below are some rules for picking the right category for a package. Many
|
|
|
|
|
packages fall under several categories; what matters is the
|
|
|
|
|
<emphasis>primary</emphasis> purpose of a package. For example, the
|
|
|
|
|
<literal>libxml2</literal> package builds both a library and some tools;
|
|
|
|
|
but it’s a library foremost, so it goes under
|
|
|
|
|
<filename>pkgs/development/libraries</filename>.
|
|
|
|
|
</para>
|
|
|
|
|
|
|
|
|
|
<para>
|
|
|
|
|
When in doubt, consider refactoring the <filename>pkgs/</filename> tree,
|
|
|
|
|
e.g. creating new categories or splitting up an existing category.
|
|
|
|
|
</para>
|
|
|
|
|
|
|
|
|
|
<variablelist>
|
|
|
|
|
<varlistentry>
|
2018-05-31 19:03:37 -06:00
|
|
|
|
<term>
|
|
|
|
|
If it’s used to support <emphasis>software development</emphasis>:
|
|
|
|
|
</term>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
<listitem>
|
|
|
|
|
<variablelist>
|
|
|
|
|
<varlistentry>
|
2018-05-31 19:03:37 -06:00
|
|
|
|
<term>
|
|
|
|
|
If it’s a <emphasis>library</emphasis> used by other packages:
|
|
|
|
|
</term>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
<filename>development/libraries</filename> (e.g.
|
|
|
|
|
<filename>libxml2</filename>)
|
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
</varlistentry>
|
|
|
|
|
<varlistentry>
|
2018-05-31 19:03:37 -06:00
|
|
|
|
<term>
|
|
|
|
|
If it’s a <emphasis>compiler</emphasis>:
|
|
|
|
|
</term>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
<filename>development/compilers</filename> (e.g.
|
|
|
|
|
<filename>gcc</filename>)
|
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
</varlistentry>
|
|
|
|
|
<varlistentry>
|
2018-05-31 19:03:37 -06:00
|
|
|
|
<term>
|
|
|
|
|
If it’s an <emphasis>interpreter</emphasis>:
|
|
|
|
|
</term>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
<filename>development/interpreters</filename> (e.g.
|
|
|
|
|
<filename>guile</filename>)
|
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
</varlistentry>
|
|
|
|
|
<varlistentry>
|
2018-05-31 19:03:37 -06:00
|
|
|
|
<term>
|
|
|
|
|
If it’s a (set of) development <emphasis>tool(s)</emphasis>:
|
|
|
|
|
</term>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
<listitem>
|
|
|
|
|
<variablelist>
|
|
|
|
|
<varlistentry>
|
2018-05-31 19:03:37 -06:00
|
|
|
|
<term>
|
|
|
|
|
If it’s a <emphasis>parser generator</emphasis> (including lexers):
|
|
|
|
|
</term>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
<filename>development/tools/parsing</filename> (e.g.
|
|
|
|
|
<filename>bison</filename>, <filename>flex</filename>)
|
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
</varlistentry>
|
|
|
|
|
<varlistentry>
|
2018-05-31 19:03:37 -06:00
|
|
|
|
<term>
|
|
|
|
|
If it’s a <emphasis>build manager</emphasis>:
|
|
|
|
|
</term>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
<filename>development/tools/build-managers</filename> (e.g.
|
|
|
|
|
<filename>gnumake</filename>)
|
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
</varlistentry>
|
|
|
|
|
<varlistentry>
|
2018-05-31 19:03:37 -06:00
|
|
|
|
<term>
|
|
|
|
|
Else:
|
|
|
|
|
</term>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
<filename>development/tools/misc</filename> (e.g.
|
|
|
|
|
<filename>binutils</filename>)
|
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
</varlistentry>
|
|
|
|
|
</variablelist>
|
|
|
|
|
</listitem>
|
|
|
|
|
</varlistentry>
|
|
|
|
|
<varlistentry>
|
2018-05-31 19:03:37 -06:00
|
|
|
|
<term>
|
|
|
|
|
Else:
|
|
|
|
|
</term>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
<filename>development/misc</filename>
|
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
</varlistentry>
|
|
|
|
|
</variablelist>
|
|
|
|
|
</listitem>
|
|
|
|
|
</varlistentry>
|
|
|
|
|
<varlistentry>
|
2018-05-31 19:03:37 -06:00
|
|
|
|
<term>
|
|
|
|
|
If it’s a (set of) <emphasis>tool(s)</emphasis>:
|
|
|
|
|
</term>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
(A tool is a relatively small program, especially one intended to be
|
|
|
|
|
used non-interactively.)
|
|
|
|
|
</para>
|
|
|
|
|
<variablelist>
|
|
|
|
|
<varlistentry>
|
2018-05-31 19:03:37 -06:00
|
|
|
|
<term>
|
|
|
|
|
If it’s for <emphasis>networking</emphasis>:
|
|
|
|
|
</term>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
<filename>tools/networking</filename> (e.g.
|
|
|
|
|
<filename>wget</filename>)
|
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
</varlistentry>
|
|
|
|
|
<varlistentry>
|
2018-05-31 19:03:37 -06:00
|
|
|
|
<term>
|
|
|
|
|
If it’s for <emphasis>text processing</emphasis>:
|
|
|
|
|
</term>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
<filename>tools/text</filename> (e.g. <filename>diffutils</filename>)
|
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
</varlistentry>
|
|
|
|
|
<varlistentry>
|
2018-05-31 19:03:37 -06:00
|
|
|
|
<term>
|
|
|
|
|
If it’s a <emphasis>system utility</emphasis>, i.e., something related or essential to the operation of a system:
|
|
|
|
|
</term>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
<filename>tools/system</filename> (e.g. <filename>cron</filename>)
|
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
</varlistentry>
|
|
|
|
|
<varlistentry>
|
2018-05-31 19:03:37 -06:00
|
|
|
|
<term>
|
|
|
|
|
If it’s an <emphasis>archiver</emphasis> (which may include a compression function):
|
|
|
|
|
</term>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
<filename>tools/archivers</filename> (e.g. <filename>zip</filename>,
|
|
|
|
|
<filename>tar</filename>)
|
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
</varlistentry>
|
|
|
|
|
<varlistentry>
|
2018-05-31 19:03:37 -06:00
|
|
|
|
<term>
|
|
|
|
|
If it’s a <emphasis>compression</emphasis> program:
|
|
|
|
|
</term>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
<filename>tools/compression</filename> (e.g.
|
|
|
|
|
<filename>gzip</filename>, <filename>bzip2</filename>)
|
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
</varlistentry>
|
|
|
|
|
<varlistentry>
|
2018-05-31 19:03:37 -06:00
|
|
|
|
<term>
|
|
|
|
|
If it’s a <emphasis>security</emphasis>-related program:
|
|
|
|
|
</term>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
<filename>tools/security</filename> (e.g. <filename>nmap</filename>,
|
|
|
|
|
<filename>gnupg</filename>)
|
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
</varlistentry>
|
|
|
|
|
<varlistentry>
|
2018-05-31 19:03:37 -06:00
|
|
|
|
<term>
|
|
|
|
|
Else:
|
|
|
|
|
</term>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
<filename>tools/misc</filename>
|
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
</varlistentry>
|
|
|
|
|
</variablelist>
|
|
|
|
|
</listitem>
|
|
|
|
|
</varlistentry>
|
|
|
|
|
<varlistentry>
|
2018-05-31 19:03:37 -06:00
|
|
|
|
<term>
|
|
|
|
|
If it’s a <emphasis>shell</emphasis>:
|
|
|
|
|
</term>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
<filename>shells</filename> (e.g. <filename>bash</filename>)
|
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
</varlistentry>
|
|
|
|
|
<varlistentry>
|
2018-05-31 19:03:37 -06:00
|
|
|
|
<term>
|
|
|
|
|
If it’s a <emphasis>server</emphasis>:
|
|
|
|
|
</term>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
<listitem>
|
|
|
|
|
<variablelist>
|
|
|
|
|
<varlistentry>
|
2018-05-31 19:03:37 -06:00
|
|
|
|
<term>
|
|
|
|
|
If it’s a web server:
|
|
|
|
|
</term>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
<filename>servers/http</filename> (e.g.
|
|
|
|
|
<filename>apache-httpd</filename>)
|
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
</varlistentry>
|
|
|
|
|
<varlistentry>
|
2018-05-31 19:03:37 -06:00
|
|
|
|
<term>
|
|
|
|
|
If it’s an implementation of the X Windowing System:
|
|
|
|
|
</term>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
<filename>servers/x11</filename> (e.g. <filename>xorg</filename> —
|
|
|
|
|
this includes the client libraries and programs)
|
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
</varlistentry>
|
|
|
|
|
<varlistentry>
|
2018-05-31 19:03:37 -06:00
|
|
|
|
<term>
|
|
|
|
|
Else:
|
|
|
|
|
</term>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
<filename>servers/misc</filename>
|
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
</varlistentry>
|
|
|
|
|
</variablelist>
|
|
|
|
|
</listitem>
|
|
|
|
|
</varlistentry>
|
|
|
|
|
<varlistentry>
|
2018-05-31 19:03:37 -06:00
|
|
|
|
<term>
|
|
|
|
|
If it’s a <emphasis>desktop environment</emphasis>:
|
|
|
|
|
</term>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
<filename>desktops</filename> (e.g. <filename>kde</filename>,
|
|
|
|
|
<filename>gnome</filename>, <filename>enlightenment</filename>)
|
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
</varlistentry>
|
|
|
|
|
<varlistentry>
|
2018-05-31 19:03:37 -06:00
|
|
|
|
<term>
|
|
|
|
|
If it’s a <emphasis>window manager</emphasis>:
|
|
|
|
|
</term>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
<filename>applications/window-managers</filename> (e.g.
|
|
|
|
|
<filename>awesome</filename>, <filename>stumpwm</filename>)
|
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
</varlistentry>
|
|
|
|
|
<varlistentry>
|
2018-05-31 19:03:37 -06:00
|
|
|
|
<term>
|
|
|
|
|
If it’s an <emphasis>application</emphasis>:
|
|
|
|
|
</term>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
A (typically large) program with a distinct user interface, primarily
|
|
|
|
|
used interactively.
|
|
|
|
|
</para>
|
|
|
|
|
<variablelist>
|
|
|
|
|
<varlistentry>
|
2018-05-31 19:03:37 -06:00
|
|
|
|
<term>
|
|
|
|
|
If it’s a <emphasis>version management system</emphasis>:
|
|
|
|
|
</term>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
<filename>applications/version-management</filename> (e.g.
|
|
|
|
|
<filename>subversion</filename>)
|
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
</varlistentry>
|
|
|
|
|
<varlistentry>
|
2018-05-31 19:03:37 -06:00
|
|
|
|
<term>
|
|
|
|
|
If it’s for <emphasis>video playback / editing</emphasis>:
|
|
|
|
|
</term>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
<filename>applications/video</filename> (e.g.
|
|
|
|
|
<filename>vlc</filename>)
|
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
</varlistentry>
|
|
|
|
|
<varlistentry>
|
2018-05-31 19:03:37 -06:00
|
|
|
|
<term>
|
|
|
|
|
If it’s for <emphasis>graphics viewing / editing</emphasis>:
|
|
|
|
|
</term>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
<filename>applications/graphics</filename> (e.g.
|
|
|
|
|
<filename>gimp</filename>)
|
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
</varlistentry>
|
|
|
|
|
<varlistentry>
|
2018-05-31 19:03:37 -06:00
|
|
|
|
<term>
|
|
|
|
|
If it’s for <emphasis>networking</emphasis>:
|
|
|
|
|
</term>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
<listitem>
|
|
|
|
|
<variablelist>
|
|
|
|
|
<varlistentry>
|
2018-05-31 19:03:37 -06:00
|
|
|
|
<term>
|
|
|
|
|
If it’s a <emphasis>mailreader</emphasis>:
|
|
|
|
|
</term>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
<filename>applications/networking/mailreaders</filename> (e.g.
|
|
|
|
|
<filename>thunderbird</filename>)
|
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
</varlistentry>
|
|
|
|
|
<varlistentry>
|
2018-05-31 19:03:37 -06:00
|
|
|
|
<term>
|
|
|
|
|
If it’s a <emphasis>newsreader</emphasis>:
|
|
|
|
|
</term>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
<filename>applications/networking/newsreaders</filename> (e.g.
|
|
|
|
|
<filename>pan</filename>)
|
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
</varlistentry>
|
|
|
|
|
<varlistentry>
|
2018-05-31 19:03:37 -06:00
|
|
|
|
<term>
|
|
|
|
|
If it’s a <emphasis>web browser</emphasis>:
|
|
|
|
|
</term>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
<filename>applications/networking/browsers</filename> (e.g.
|
|
|
|
|
<filename>firefox</filename>)
|
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
</varlistentry>
|
|
|
|
|
<varlistentry>
|
2018-05-31 19:03:37 -06:00
|
|
|
|
<term>
|
|
|
|
|
Else:
|
|
|
|
|
</term>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
<filename>applications/networking/misc</filename>
|
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
</varlistentry>
|
|
|
|
|
</variablelist>
|
|
|
|
|
</listitem>
|
|
|
|
|
</varlistentry>
|
|
|
|
|
<varlistentry>
|
2018-05-31 19:03:37 -06:00
|
|
|
|
<term>
|
|
|
|
|
Else:
|
|
|
|
|
</term>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
<filename>applications/misc</filename>
|
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
</varlistentry>
|
|
|
|
|
</variablelist>
|
|
|
|
|
</listitem>
|
|
|
|
|
</varlistentry>
|
|
|
|
|
<varlistentry>
|
2018-05-31 19:03:37 -06:00
|
|
|
|
<term>
|
|
|
|
|
If it’s <emphasis>data</emphasis> (i.e., does not have a straight-forward executable semantics):
|
|
|
|
|
</term>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
<listitem>
|
|
|
|
|
<variablelist>
|
|
|
|
|
<varlistentry>
|
2018-05-31 19:03:37 -06:00
|
|
|
|
<term>
|
|
|
|
|
If it’s a <emphasis>font</emphasis>:
|
|
|
|
|
</term>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
<filename>data/fonts</filename>
|
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
</varlistentry>
|
|
|
|
|
<varlistentry>
|
2018-05-31 19:03:37 -06:00
|
|
|
|
<term>
|
|
|
|
|
If it’s related to <emphasis>SGML/XML processing</emphasis>:
|
|
|
|
|
</term>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
<listitem>
|
|
|
|
|
<variablelist>
|
|
|
|
|
<varlistentry>
|
2018-05-31 19:03:37 -06:00
|
|
|
|
<term>
|
|
|
|
|
If it’s an <emphasis>XML DTD</emphasis>:
|
|
|
|
|
</term>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
<filename>data/sgml+xml/schemas/xml-dtd</filename> (e.g.
|
|
|
|
|
<filename>docbook</filename>)
|
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
</varlistentry>
|
|
|
|
|
<varlistentry>
|
2018-05-31 19:03:37 -06:00
|
|
|
|
<term>
|
|
|
|
|
If it’s an <emphasis>XSLT stylesheet</emphasis>:
|
|
|
|
|
</term>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
(Okay, these are executable...)
|
|
|
|
|
</para>
|
|
|
|
|
<para>
|
|
|
|
|
<filename>data/sgml+xml/stylesheets/xslt</filename> (e.g.
|
|
|
|
|
<filename>docbook-xsl</filename>)
|
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
</varlistentry>
|
|
|
|
|
</variablelist>
|
|
|
|
|
</listitem>
|
|
|
|
|
</varlistentry>
|
|
|
|
|
</variablelist>
|
|
|
|
|
</listitem>
|
|
|
|
|
</varlistentry>
|
|
|
|
|
<varlistentry>
|
2018-05-31 19:03:37 -06:00
|
|
|
|
<term>
|
|
|
|
|
If it’s a <emphasis>game</emphasis>:
|
|
|
|
|
</term>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
<filename>games</filename>
|
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
</varlistentry>
|
|
|
|
|
<varlistentry>
|
2018-05-31 19:03:37 -06:00
|
|
|
|
<term>
|
|
|
|
|
Else:
|
|
|
|
|
</term>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
<filename>misc</filename>
|
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
</varlistentry>
|
|
|
|
|
</variablelist>
|
|
|
|
|
</section>
|
|
|
|
|
|
|
|
|
|
<section xml:id="sec-versioning">
|
|
|
|
|
<title>Versioning</title>
|
|
|
|
|
|
|
|
|
|
<para>
|
|
|
|
|
Because every version of a package in Nixpkgs creates a potential
|
|
|
|
|
maintenance burden, old versions of a package should not be kept unless
|
|
|
|
|
there is a good reason to do so. For instance, Nixpkgs contains several
|
|
|
|
|
versions of GCC because other packages don’t build with the latest
|
|
|
|
|
version of GCC. Other examples are having both the latest stable and latest
|
|
|
|
|
pre-release version of a package, or to keep several major releases of an
|
|
|
|
|
application that differ significantly in functionality.
|
|
|
|
|
</para>
|
|
|
|
|
|
|
|
|
|
<para>
|
|
|
|
|
If there is only one version of a package, its Nix expression should be
|
|
|
|
|
named <filename>e2fsprogs/default.nix</filename>. If there are multiple
|
|
|
|
|
versions, this should be reflected in the filename, e.g.
|
|
|
|
|
<filename>e2fsprogs/1.41.8.nix</filename> and
|
|
|
|
|
<filename>e2fsprogs/1.41.9.nix</filename>. The version in the filename
|
|
|
|
|
should leave out unnecessary detail. For instance, if we keep the latest
|
|
|
|
|
Firefox 2.0.x and 3.5.x versions in Nixpkgs, they should be named
|
|
|
|
|
<filename>firefox/2.0.nix</filename> and
|
|
|
|
|
<filename>firefox/3.5.nix</filename>, respectively (which, at a given
|
|
|
|
|
point, might contain versions <literal>2.0.0.20</literal> and
|
|
|
|
|
<literal>3.5.4</literal>). If a version requires many auxiliary files, you
|
|
|
|
|
can use a subdirectory for each version, e.g.
|
|
|
|
|
<filename>firefox/2.0/default.nix</filename> and
|
|
|
|
|
<filename>firefox/3.5/default.nix</filename>.
|
|
|
|
|
</para>
|
|
|
|
|
|
|
|
|
|
<para>
|
|
|
|
|
All versions of a package <emphasis>must</emphasis> be included in
|
|
|
|
|
<filename>all-packages.nix</filename> to make sure that they evaluate
|
|
|
|
|
correctly.
|
|
|
|
|
</para>
|
|
|
|
|
</section>
|
|
|
|
|
</section>
|
|
|
|
|
<section xml:id="sec-sources">
|
|
|
|
|
<title>Fetching Sources</title>
|
2009-11-18 08:05:09 -07:00
|
|
|
|
|
2018-05-01 17:54:21 -06:00
|
|
|
|
<para>
|
|
|
|
|
There are multiple ways to fetch a package source in nixpkgs. The general
|
2019-01-17 03:32:08 -07:00
|
|
|
|
guideline is that you should package reproducible sources with a high degree of
|
2018-05-01 17:54:21 -06:00
|
|
|
|
availability. Right now there is only one fetcher which has mirroring
|
|
|
|
|
support and that is <literal>fetchurl</literal>. Note that you should also
|
|
|
|
|
prefer protocols which have a corresponding proxy environment variable.
|
2015-04-29 14:02:13 -06:00
|
|
|
|
</para>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
|
|
|
|
|
<para>
|
|
|
|
|
You can find many source fetch helpers in
|
|
|
|
|
<literal>pkgs/build-support/fetch*</literal>.
|
2015-04-29 14:02:13 -06:00
|
|
|
|
</para>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
|
|
|
|
|
<para>
|
|
|
|
|
In the file <literal>pkgs/top-level/all-packages.nix</literal> you can find
|
|
|
|
|
fetch helpers, these have names on the form <literal>fetchFrom*</literal>.
|
|
|
|
|
The intention of these are to provide snapshot fetches but using the same
|
|
|
|
|
api as some of the version controlled fetchers from
|
|
|
|
|
<literal>pkgs/build-support/</literal>. As an example going from bad to
|
|
|
|
|
good:
|
|
|
|
|
<itemizedlist>
|
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
Bad: Uses <literal>git://</literal> which won't be proxied.
|
2015-06-03 09:04:26 -06:00
|
|
|
|
<programlisting>
|
|
|
|
|
src = fetchgit {
|
|
|
|
|
url = "git://github.com/NixOS/nix.git";
|
|
|
|
|
rev = "1f795f9f44607cc5bec70d1300150bfefcef2aae";
|
|
|
|
|
sha256 = "1cw5fszffl5pkpa6s6wjnkiv6lm5k618s32sp60kvmvpy7a2v9kg";
|
|
|
|
|
}
|
|
|
|
|
</programlisting>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
Better: This is ok, but an archive fetch will still be faster.
|
2015-06-03 09:04:26 -06:00
|
|
|
|
<programlisting>
|
|
|
|
|
src = fetchgit {
|
|
|
|
|
url = "https://github.com/NixOS/nix.git";
|
|
|
|
|
rev = "1f795f9f44607cc5bec70d1300150bfefcef2aae";
|
|
|
|
|
sha256 = "1cw5fszffl5pkpa6s6wjnkiv6lm5k618s32sp60kvmvpy7a2v9kg";
|
|
|
|
|
}
|
|
|
|
|
</programlisting>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
Best: Fetches a snapshot archive and you get the rev you want.
|
2015-06-03 09:04:26 -06:00
|
|
|
|
<programlisting>
|
|
|
|
|
src = fetchFromGitHub {
|
|
|
|
|
owner = "NixOS";
|
|
|
|
|
repo = "nix";
|
|
|
|
|
rev = "1f795f9f44607cc5bec70d1300150bfefcef2aae";
|
2018-10-29 18:24:07 -06:00
|
|
|
|
sha256 = "1i2yxndxb6yc9l6c99pypbd92lfq5aac4klq7y2v93c9qvx2cgpc";
|
2015-06-03 09:04:26 -06:00
|
|
|
|
}
|
|
|
|
|
</programlisting>
|
2018-10-29 18:24:07 -06:00
|
|
|
|
Find the value to put as <literal>sha256</literal> by running
|
|
|
|
|
<literal>nix run -f '<nixpkgs>' nix-prefetch-github -c nix-prefetch-github --rev 1f795f9f44607cc5bec70d1300150bfefcef2aae NixOS nix</literal>
|
|
|
|
|
or <literal>nix-prefetch-url --unpack https://github.com/NixOS/nix/archive/1f795f9f44607cc5bec70d1300150bfefcef2aae.tar.gz</literal>.
|
2018-05-01 17:54:21 -06:00
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
</itemizedlist>
|
|
|
|
|
</para>
|
|
|
|
|
</section>
|
2019-01-10 14:15:23 -07:00
|
|
|
|
<section xml:id="sec-source-hashes">
|
|
|
|
|
<title>Obtaining source hash</title>
|
|
|
|
|
|
|
|
|
|
<para>
|
|
|
|
|
Preferred source hash type is sha256. There are several ways to get it.
|
|
|
|
|
</para>
|
|
|
|
|
|
2019-01-17 03:32:08 -07:00
|
|
|
|
<orderedlist>
|
2019-01-10 14:15:23 -07:00
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
Prefetch URL (with <literal>nix-prefetch-<replaceable>XXX</replaceable>
|
|
|
|
|
<replaceable>URL</replaceable></literal>, where
|
|
|
|
|
<replaceable>XXX</replaceable> is one of <literal>url</literal>,
|
|
|
|
|
<literal>git</literal>, <literal>hg</literal>, <literal>cvs</literal>,
|
|
|
|
|
<literal>bzr</literal>, <literal>svn</literal>). Hash is printed to
|
|
|
|
|
stdout.
|
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
Prefetch by package source (with <literal>nix-prefetch-url
|
|
|
|
|
'<nixpkgs>' -A <replaceable>PACKAGE</replaceable>.src</literal>,
|
|
|
|
|
where <replaceable>PACKAGE</replaceable> is package attribute name). Hash
|
|
|
|
|
is printed to stdout.
|
|
|
|
|
</para>
|
|
|
|
|
<para>
|
|
|
|
|
This works well when you've upgraded existing package version and want to
|
2019-01-17 03:32:08 -07:00
|
|
|
|
find out new hash, but is useless if package can't be accessed by
|
2019-01-10 14:15:23 -07:00
|
|
|
|
attribute or package has multiple sources (<literal>.srcs</literal>,
|
|
|
|
|
architecture-dependent sources, etc).
|
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
Upstream provided hash: use it when upstream provides
|
|
|
|
|
<literal>sha256</literal> or <literal>sha512</literal> (when upstream
|
|
|
|
|
provides <literal>md5</literal>, don't use it, compute
|
|
|
|
|
<literal>sha256</literal> instead).
|
|
|
|
|
</para>
|
|
|
|
|
<para>
|
|
|
|
|
A little nuance is that <literal>nix-prefetch-*</literal> tools produce
|
|
|
|
|
hash encoded with <literal>base32</literal>, but upstream usually provides
|
|
|
|
|
hexadecimal (<literal>base16</literal>) encoding. Fetchers understand both
|
2019-01-17 03:32:08 -07:00
|
|
|
|
formats. Nixpkgs does not standardize on any one format.
|
2019-01-10 14:15:23 -07:00
|
|
|
|
</para>
|
|
|
|
|
<para>
|
|
|
|
|
You can convert between formats with nix-hash, for example:
|
|
|
|
|
<screen>
|
|
|
|
|
$ nix-hash --type sha256 --to-base32 <replaceable>HASH</replaceable>
|
|
|
|
|
</screen>
|
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
Extracting hash from local source tarball can be done with
|
|
|
|
|
<literal>sha256sum</literal>. Use <literal>nix-prefetch-url
|
|
|
|
|
file:///path/to/tarball </literal> if you want base32 hash.
|
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
Fake hash: set fake hash in package expression, perform build and extract
|
|
|
|
|
correct hash from error Nix prints.
|
|
|
|
|
</para>
|
|
|
|
|
<para>
|
2019-01-17 03:32:08 -07:00
|
|
|
|
For package updates it is enough to change one symbol to make hash fake.
|
|
|
|
|
For new packages, you can use <literal>lib.fakeSha256</literal>,
|
|
|
|
|
<literal>lib.fakeSha512</literal> or any other fake hash.
|
|
|
|
|
</para>
|
|
|
|
|
<para>
|
2019-01-10 14:15:23 -07:00
|
|
|
|
This is last resort method when reconstructing source URL is non-trivial
|
|
|
|
|
and <literal>nix-prefetch-url -A</literal> isn't applicable (for example,
|
|
|
|
|
<link xlink:href="https://github.com/NixOS/nixpkgs/blob/d2ab091dd308b99e4912b805a5eb088dd536adb9/pkgs/applications/video/kodi/default.nix#L73">
|
|
|
|
|
one of <literal>kodi</literal> dependencies</link>). The easiest way then
|
|
|
|
|
would be replace hash with a fake one and rebuild. Nix build will fail and
|
2019-01-17 03:32:08 -07:00
|
|
|
|
error message will contain desired hash.
|
2019-01-10 14:15:23 -07:00
|
|
|
|
</para>
|
2019-01-17 03:32:08 -07:00
|
|
|
|
<warning><para>This method has security problems. Check below for details.</para></warning>
|
2019-01-10 14:15:23 -07:00
|
|
|
|
</listitem>
|
2019-01-17 03:32:08 -07:00
|
|
|
|
</orderedlist>
|
2019-01-10 14:15:23 -07:00
|
|
|
|
|
|
|
|
|
<section xml:id="sec-source-hashes-security">
|
|
|
|
|
<title>Obtaining hashes securely</title>
|
|
|
|
|
<para>
|
2019-01-17 03:32:08 -07:00
|
|
|
|
Let's say Man-in-the-Middle (MITM) sits close to your network. Then instead of fetching
|
|
|
|
|
source you can fetch malware, and instead of source hash you get hash of malware. Here are
|
|
|
|
|
security considerations for this scenario:
|
2019-01-10 14:15:23 -07:00
|
|
|
|
</para>
|
2019-01-17 03:32:08 -07:00
|
|
|
|
<itemizedlist>
|
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
<literal>http://</literal> URLs are not secure to prefetch hash from;
|
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
hashes from upstream (in method 3) should be obtained via secure protocol;
|
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
<literal>https://</literal> URLs are secure in methods 1, 2, 3;
|
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
<literal>https://</literal> URLs are not secure in method 5. When obtaining hashes
|
|
|
|
|
with fake hash method, TLS checks are disabled. So
|
|
|
|
|
refetch source hash from several different networks to exclude MITM scenario.
|
|
|
|
|
Alternatively, use fake hash method to make Nix error, but instead of extracting
|
|
|
|
|
hash from error, extract <literal>https://</literal> URL and prefetch it
|
|
|
|
|
with method 1.
|
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
</itemizedlist>
|
2019-01-10 14:15:23 -07:00
|
|
|
|
</section>
|
|
|
|
|
</section>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
<section xml:id="sec-patches">
|
|
|
|
|
<title>Patches</title>
|
|
|
|
|
|
|
|
|
|
<para>
|
|
|
|
|
Patches available online should be retrieved using
|
|
|
|
|
<literal>fetchpatch</literal>.
|
2015-04-29 14:02:13 -06:00
|
|
|
|
</para>
|
2016-08-05 18:05:23 -06:00
|
|
|
|
|
|
|
|
|
<para>
|
|
|
|
|
<programlisting>
|
|
|
|
|
patches = [
|
|
|
|
|
(fetchpatch {
|
|
|
|
|
name = "fix-check-for-using-shared-freetype-lib.patch";
|
|
|
|
|
url = "http://git.ghostscript.com/?p=ghostpdl.git;a=patch;h=8f5d285";
|
|
|
|
|
sha256 = "1f0k043rng7f0rfl9hhb89qzvvksqmkrikmm38p61yfx51l325xr";
|
|
|
|
|
})
|
|
|
|
|
];
|
|
|
|
|
</programlisting>
|
|
|
|
|
</para>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
|
|
|
|
|
<para>
|
|
|
|
|
Otherwise, you can add a <literal>.patch</literal> file to the
|
|
|
|
|
<literal>nixpkgs</literal> repository. In the interest of keeping our
|
|
|
|
|
maintenance burden to a minimum, only patches that are unique to
|
|
|
|
|
<literal>nixpkgs</literal> should be added in this way.
|
|
|
|
|
</para>
|
|
|
|
|
|
|
|
|
|
<para>
|
|
|
|
|
<programlisting>
|
2017-11-17 15:11:40 -07:00
|
|
|
|
patches = [ ./0001-changes.patch ];
|
2018-05-01 17:54:21 -06:00
|
|
|
|
</programlisting>
|
|
|
|
|
</para>
|
|
|
|
|
|
|
|
|
|
<para>
|
|
|
|
|
If you do need to do create this sort of patch file, one way to do so is
|
|
|
|
|
with git:
|
|
|
|
|
<orderedlist>
|
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
Move to the root directory of the source code you're patching.
|
|
|
|
|
<screen>
|
|
|
|
|
$ cd the/program/source</screen>
|
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
If a git repository is not already present, create one and stage all of
|
|
|
|
|
the source files.
|
|
|
|
|
<screen>
|
2017-11-17 15:11:40 -07:00
|
|
|
|
$ git init
|
2018-05-01 17:54:21 -06:00
|
|
|
|
$ git add .</screen>
|
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
Edit some files to make whatever changes need to be included in the
|
|
|
|
|
patch.
|
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
Use git to create a diff, and pipe the output to a patch file:
|
|
|
|
|
<screen>
|
2017-11-17 15:11:40 -07:00
|
|
|
|
$ git diff > nixpkgs/pkgs/the/package/0001-changes.patch</screen>
|
2018-05-01 17:54:21 -06:00
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
</orderedlist>
|
|
|
|
|
</para>
|
|
|
|
|
</section>
|
2009-11-18 06:54:20 -07:00
|
|
|
|
</chapter>
|