2009-02-11 02:29:42 +03:00
<chapter xmlns= "http://docbook.org/ns/docbook"
xmlns:xlink="http://www.w3.org/1999/xlink"
xml:id="chap-meta">
<title > Meta-attributes</title>
<para > Nix packages can declare <emphasis > meta-attributes</emphasis>
that contain information about a package such as a description, its
homepage, its license, and so on. For instance, the GNU Hello package
has a <varname > meta</varname> declaration like this:
<programlisting >
meta = {
description = "A program that produces a familiar, friendly greeting";
longDescription = ''
GNU Hello is a program that prints "Hello, world!" when you run it.
It is fully customizable.
'';
homepage = http://www.gnu.org/software/hello/manual/;
2014-07-27 15:52:11 +04:00
license = stdenv.lib.licenses.gpl3Plus;
maintainers = [ stdenv.lib.maintainers.eelco ];
platforms = stdenv.lib.platforms.all;
2009-02-11 02:29:42 +03:00
};
</programlisting>
</para>
<para > Meta-attributes are not passed to the builder of the package.
Thus, a change to a meta-attribute doesn’ t trigger a recompilation of
the package. The value of a meta-attribute must a string.</para>
<para > The meta-attributes of a package can be queried from the
command-line using <command > nix-env</command> :
<screen >
$ nix-env -qa hello --meta --xml
2014-07-27 15:52:11 +04:00
< ?xml version=' 1.0' encoding=' utf-8' ?>
< items>
< item attrPath=" nixos.pkgs.hello" name=" hello-2.9" system=" x86_64-linux" >
< meta name=" description" type=" string" value=" A program that produces a familiar, friendly greeting" />
< meta name=" homepage" type=" string" value=" http://www.gnu.org/software/hello/manual/" />
< meta name=" license" type=" string" value=" GPLv3+" />
< meta name=" longDescription" type=" string" value=" GNU Hello is a program that prints & quot;Hello, world!& quot; when you run it.& #xA;It is fully customizable.& #xA;" />
< meta name=" maintainers" type=" strings" >
< string value=" Ludovic Courtès & lt;ludo@gnu.org& gt;" />
< /meta>
< meta name=" platforms" type=" strings" >
< string value=" i686-linux" />
< string value=" x86_64-linux" />
< string value=" armv5tel-linux" />
< string value=" armv7l-linux" />
< string value=" mips64el-linux" />
< string value=" x86_64-darwin" />
< string value=" i686-cygwin" />
< string value=" i686-freebsd" />
< string value=" x86_64-freebsd" />
< string value=" i686-openbsd" />
< string value=" x86_64-openbsd" />
< /meta>
< meta name=" position" type=" string" value=" /nix/store/cn8zjjdd9kvmp1p5d21h7ya0cr1jhkk3-nixos-14.10pre44264.12f06b3/nixos/nixpkgs/pkgs/applications/misc/hello/ex-2/default.nix:14" />
< /item>
< /items>
2009-02-11 02:29:42 +03:00
</screen>
<command > nix-env</command> knows about the
<varname > description</varname> field specifically:
<screen >
$ nix-env -qa hello --description
hello-2.3 A program that produces a familiar, friendly greeting
</screen>
</para>
<section > <title > Standard meta-attributes</title>
<para > The following meta-attributes have a standard
interpretation:</para>
<variablelist >
<varlistentry >
<term > <varname > description</varname> </term>
<listitem > <para > A short (one-line) description of the package.
2009-03-03 16:47:46 +03:00
This is shown by <command > nix-env -q --description</command> and
also on the Nixpkgs release pages.</para>
<para > Don’ t include a period at the end. Don’ t include newline
characters. Capitalise the first character. For brevity, don’ t
repeat the name of package — just describe what it does.</para>
<para > Wrong: <literal > "libpng is a library that allows you to decode PNG images."</literal> </para>
<para > Right: <literal > "A library for decoding PNG images"</literal> </para>
</listitem>
2009-02-11 02:29:42 +03:00
</varlistentry>
<varlistentry >
<term > <varname > longDescription</varname> </term>
<listitem > <para > An arbitrarily long description of the
package.</para> </listitem>
</varlistentry>
<varlistentry >
<term > <varname > homepage</varname> </term>
<listitem > <para > The package’ s homepage. Example:
<literal > http://www.gnu.org/software/hello/manual/</literal> </para> </listitem>
</varlistentry>
<varlistentry >
<term > <varname > license</varname> </term>
2014-07-27 15:52:11 +04:00
<listitem > <para > The license for the package. One from attribute set defined in
<link xlink:href= "https://github.com/NixOS/nixpkgs/blob/master/pkgs/lib/licenses.nix" >
<filename > nixpkgs/lib/licenses.nix</filename> </link> .
Example:
<literal > stdenv.lib.licenses.gpl3</literal> .</para> </listitem>
2009-02-11 02:29:42 +03:00
</varlistentry>
2009-07-08 20:08:29 +04:00
<varlistentry >
<term > <varname > maintainers</varname> </term>
<listitem > <para > A list of names and e-mail addresses of the
2014-07-27 15:52:11 +04:00
maintainers of this Nix expression. If
you would like to be a maintainer of a package, you may want to add
2009-07-08 20:08:29 +04:00
yourself to <link
2014-07-27 15:52:11 +04:00
xlink:href="https://github.com/NixOS/nixpkgs/blob/master/pkgs/lib/maintainers.nix"><filename > nixpkgs/lib/maintainers.nix</filename> </link>
and write something like <literal > [ stdenv.lib.maintainers.alice
stdenv.lib.maintainers.bob ]</literal> .</para> </listitem>
2009-07-08 20:08:29 +04:00
</varlistentry>
2009-02-11 02:29:42 +03:00
<varlistentry >
<term > <varname > priority</varname> </term>
<listitem > <para > The <emphasis > priority</emphasis> of the package,
used by <command > nix-env</command> to resolve file name conflicts
between packages. See the Nix manual page for
<command > nix-env</command> for details. Example:
<literal > "10"</literal> (a low-priority
package).</para> </listitem>
</varlistentry>
2013-11-05 02:31:08 +04:00
<varlistentry >
<term > <varname > platforms</varname> </term>
<listitem > <para > The list of Nix platform types on which the
2014-07-27 16:13:27 +04:00
package is supported. Hydra builds packages according to the
platform specified. If no platform is specified, the package does
not have prebuilt binaries. An example is:
2013-11-05 02:31:08 +04:00
<programlisting >
2014-07-27 15:52:11 +04:00
meta.platforms = stdenv.lib.platforms.linux;
2013-11-05 02:31:08 +04:00
</programlisting>
2014-07-27 15:52:11 +04:00
Attribute Set <varname > stdenv.lib.platforms</varname> in
<link xlink:href= "https://github.com/NixOS/nixpkgs/blob/master/pkgs/lib/platforms.nix" >
<filename > nixpkgs/lib/platforms.nix</filename> </link> defines various common
lists of platforms types.
2013-11-05 02:31:08 +04:00
</para> </listitem>
</varlistentry>
<varlistentry >
<term > <varname > hydraPlatforms</varname> </term>
<listitem > <para > The list of Nix platform types for which the Hydra
2014-07-27 15:52:11 +04:00
instance at <literal > hydra.nixos.org</literal> will build the
2013-11-05 02:31:08 +04:00
package. (Hydra is the Nix-based continuous build system.) It
defaults to the value of <varname > meta.platforms</varname> . Thus,
the only reason to set <varname > meta.hydraPlatforms</varname> is
if you want <literal > hydra.nixos.org</literal> to build the
package on a subset of <varname > meta.platforms</varname> , or not
at all, e.g.
<programlisting >
meta.platforms = stdenv.lib.platforms.linux;
meta.hydraPlatforms = [];
</programlisting>
</para> </listitem>
</varlistentry>
2013-11-04 23:32:49 +04:00
<varlistentry >
<term > <varname > broken</varname> </term>
<listitem > <para > If set to <literal > true</literal> , the package is
marked as “broken”, meaning that it won’ t show up in
<literal > nix-env -qa</literal> , and cannot be built or installed.
2014-04-14 09:59:36 +04:00
Such packages should be removed from Nixpkgs eventually unless
2013-11-04 23:32:49 +04:00
they are fixed.</para> </listitem>
</varlistentry>
2009-02-11 02:29:42 +03:00
</variablelist>
</section>
2009-10-29 18:28:43 +03:00
<section xml:id= "sec-meta-license" > <title > Licenses</title>
2009-02-11 02:29:42 +03:00
2014-07-27 15:53:10 +04:00
<para > The <varname > meta.license</varname> attribute could be one of the
2009-02-11 02:29:42 +03:00
following:
<variablelist >
<varlistentry >
<term > <varname > free</varname> </term>
<listitem > <para > Catch-all for free software licenses not listed
above.</para> </listitem>
</varlistentry>
<varlistentry >
<term > <varname > unfree-redistributable</varname> </term>
<listitem > <para > Unfree package that can be redistributed in binary
form. That is, it’ s legal to redistribute the
<emphasis > output</emphasis> of the derivation. This means that
the package can be included in the Nixpkgs
channel.</para>
<para > Sometimes proprietary software can only be redistributed
unmodified. Make sure the builder doesn’ t actually modify the
original binaries; otherwise we’ re breaking the license. For
instance, the NVIDIA X11 drivers can be redistributed unmodified,
but our builder applies <command > patchelf</command> to make them
work. Thus, its license is <varname > unfree</varname> and it
cannot be included in the Nixpkgs channel.</para> </listitem>
</varlistentry>
<varlistentry >
<term > <varname > unfree</varname> </term>
<listitem > <para > Unfree package that cannot be redistributed. You
can build it yourself, but you cannot redistribute the output of
the derivation. Thus it cannot be included in the Nixpkgs
channel.</para> </listitem>
</varlistentry>
<varlistentry >
<term > <varname > unfree-redistributable-firmware</varname> </term>
<listitem > <para > This package supplies unfree, redistributable
firmware. This is a separate value from
<varname > unfree-redistributable</varname> because not everybody
cares whether firmware is free.</para> </listitem>
</varlistentry>
</variablelist>
</para>
</section>
</chapter>