mirror of
https://github.com/NixOS/nixpkgs.git
synced 2024-12-16 18:53:17 +00:00
9587693abb
docs: document that nix will not support derivations in meta
443 lines
15 KiB
XML
443 lines
15 KiB
XML
<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 = with stdenv.lib; {
|
||
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 = https://www.gnu.org/software/hello/manual/;
|
||
license = licenses.gpl3Plus;
|
||
maintainers = [ maintainers.eelco ];
|
||
platforms = platforms.all;
|
||
};
|
||
</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 be a string.
|
||
</para>
|
||
<para>
|
||
The meta-attributes of a package can be queried from the command-line using
|
||
<command>nix-env</command>:
|
||
<screen>
|
||
<prompt>$ </prompt>nix-env -qa hello --json
|
||
{
|
||
"hello": {
|
||
"meta": {
|
||
"description": "A program that produces a familiar, friendly greeting",
|
||
"homepage": "https://www.gnu.org/software/hello/manual/",
|
||
"license": {
|
||
"fullName": "GNU General Public License version 3 or later",
|
||
"shortName": "GPLv3+",
|
||
"url": "http://www.fsf.org/licensing/licenses/gpl.html"
|
||
},
|
||
"longDescription": "GNU Hello is a program that prints \"Hello, world!\" when you run it.\nIt is fully customizable.\n",
|
||
"maintainers": [
|
||
"Ludovic Court\u00e8s <ludo@gnu.org>"
|
||
],
|
||
"platforms": [
|
||
"i686-linux",
|
||
"x86_64-linux",
|
||
"armv5tel-linux",
|
||
"armv7l-linux",
|
||
"mips32-linux",
|
||
"x86_64-darwin",
|
||
"i686-cygwin",
|
||
"i686-freebsd",
|
||
"x86_64-freebsd",
|
||
"i686-openbsd",
|
||
"x86_64-openbsd"
|
||
],
|
||
"position": "/home/user/dev/nixpkgs/pkgs/applications/misc/hello/default.nix:14"
|
||
},
|
||
"name": "hello-2.9",
|
||
"system": "x86_64-linux"
|
||
}
|
||
}
|
||
|
||
|
||
</screen>
|
||
<command>nix-env</command> knows about the <varname>description</varname>
|
||
field specifically:
|
||
<screen>
|
||
<prompt>$ </prompt>nix-env -qa hello --description
|
||
hello-2.3 A program that produces a familiar, friendly greeting
|
||
</screen>
|
||
</para>
|
||
<section xml:id="sec-standard-meta-attributes">
|
||
<title>Standard meta-attributes</title>
|
||
|
||
<para>
|
||
It is expected that each meta-attribute is one of the following:
|
||
</para>
|
||
|
||
<variablelist>
|
||
<varlistentry>
|
||
<term>
|
||
<varname>description</varname>
|
||
</term>
|
||
<listitem>
|
||
<para>
|
||
A short (one-line) description of the package. 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>
|
||
</varlistentry>
|
||
<varlistentry>
|
||
<term>
|
||
<varname>longDescription</varname>
|
||
</term>
|
||
<listitem>
|
||
<para>
|
||
An arbitrarily long description of the package.
|
||
</para>
|
||
</listitem>
|
||
</varlistentry>
|
||
<varlistentry>
|
||
<term>
|
||
<varname>branch</varname>
|
||
</term>
|
||
<listitem>
|
||
<para>
|
||
Release branch. Used to specify that a package is not going to receive
|
||
updates that are not in this branch; for example, Linux kernel 3.0 is
|
||
supposed to be updated to 3.0.X, not 3.1.
|
||
</para>
|
||
</listitem>
|
||
</varlistentry>
|
||
<varlistentry>
|
||
<term>
|
||
<varname>homepage</varname>
|
||
</term>
|
||
<listitem>
|
||
<para>
|
||
The package’s homepage. Example:
|
||
<literal>https://www.gnu.org/software/hello/manual/</literal>
|
||
</para>
|
||
</listitem>
|
||
</varlistentry>
|
||
<varlistentry>
|
||
<term>
|
||
<varname>downloadPage</varname>
|
||
</term>
|
||
<listitem>
|
||
<para>
|
||
The page where a link to the current version can be found. Example:
|
||
<literal>https://ftp.gnu.org/gnu/hello/</literal>
|
||
</para>
|
||
</listitem>
|
||
</varlistentry>
|
||
<varlistentry>
|
||
<term>
|
||
<varname>changelog</varname>
|
||
</term>
|
||
<listitem>
|
||
<para>
|
||
A link or a list of links to the location of Changelog for a package.
|
||
A link may use expansion to refer to the correct changelog version.
|
||
Example:
|
||
<literal>"https://git.savannah.gnu.org/cgit/hello.git/plain/NEWS?h=v${version}"</literal>
|
||
</para>
|
||
</listitem>
|
||
</varlistentry>
|
||
<varlistentry>
|
||
<term>
|
||
<varname>license</varname>
|
||
</term>
|
||
<listitem>
|
||
<para>
|
||
The license, or licenses, for the package. One from the attribute set
|
||
defined in
|
||
<link
|
||
xlink:href="https://github.com/NixOS/nixpkgs/blob/master/lib/licenses.nix">
|
||
<filename>nixpkgs/lib/licenses.nix</filename></link>. At this moment
|
||
using both a list of licenses and a single license is valid. If the
|
||
license field is in the form of a list representation, then it means that
|
||
parts of the package are licensed differently. Each license should
|
||
preferably be referenced by their attribute. The non-list attribute value
|
||
can also be a space delimited string representation of the contained
|
||
attribute shortNames or spdxIds. The following are all valid examples:
|
||
<itemizedlist>
|
||
<listitem>
|
||
<para>
|
||
Single license referenced by attribute (preferred)
|
||
<literal>stdenv.lib.licenses.gpl3</literal>.
|
||
</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para>
|
||
Single license referenced by its attribute shortName (frowned upon)
|
||
<literal>"gpl3"</literal>.
|
||
</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para>
|
||
Single license referenced by its attribute spdxId (frowned upon)
|
||
<literal>"GPL-3.0"</literal>.
|
||
</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para>
|
||
Multiple licenses referenced by attribute (preferred) <literal>with
|
||
stdenv.lib.licenses; [ asl20 free ofl ]</literal>.
|
||
</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para>
|
||
Multiple licenses referenced as a space delimited string of attribute
|
||
shortNames (frowned upon) <literal>"asl20 free ofl"</literal>.
|
||
</para>
|
||
</listitem>
|
||
</itemizedlist>
|
||
For details, see <xref linkend='sec-meta-license'/>.
|
||
</para>
|
||
</listitem>
|
||
</varlistentry>
|
||
<varlistentry>
|
||
<term>
|
||
<varname>maintainers</varname>
|
||
</term>
|
||
<listitem>
|
||
<para>
|
||
A list of names and e-mail addresses of the maintainers of this Nix
|
||
expression. If you would like to be a maintainer of a package, you may
|
||
want to add yourself to
|
||
<link
|
||
xlink:href="https://github.com/NixOS/nixpkgs/blob/master/maintainers/maintainer-list.nix"><filename>nixpkgs/maintainers/maintainer-list.nix</filename></link>
|
||
and write something like <literal>[ stdenv.lib.maintainers.alice
|
||
stdenv.lib.maintainers.bob ]</literal>.
|
||
</para>
|
||
</listitem>
|
||
</varlistentry>
|
||
<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>
|
||
<varlistentry>
|
||
<term>
|
||
<varname>platforms</varname>
|
||
</term>
|
||
<listitem>
|
||
<para>
|
||
The list of Nix platform types on which the 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:
|
||
<programlisting>
|
||
meta.platforms = stdenv.lib.platforms.linux;
|
||
</programlisting>
|
||
Attribute Set <varname>stdenv.lib.platforms</varname> defines
|
||
<link xlink:href="https://github.com/NixOS/nixpkgs/blob/master/lib/systems/doubles.nix">
|
||
various common lists</link> of platforms types.
|
||
</para>
|
||
</listitem>
|
||
</varlistentry>
|
||
<varlistentry>
|
||
<term>
|
||
<varname>tests</varname>
|
||
</term>
|
||
<listitem>
|
||
<warning>
|
||
<para>
|
||
This attribute is special in that it is not actually under the
|
||
<literal>meta</literal> attribute set but rather under the
|
||
<literal>passthru</literal> attribute set. This is due to how
|
||
<literal>meta</literal> attributes work, and the fact that they
|
||
are supposed to contain only metadata, not derivations.
|
||
</para>
|
||
</warning>
|
||
<para>
|
||
An attribute set with as values tests. A test is a derivation, which
|
||
builds successfully when the test passes, and fails to build otherwise. A
|
||
derivation that is a test needs to have <literal>meta.timeout</literal>
|
||
defined.
|
||
</para>
|
||
<para>
|
||
The NixOS tests are available as <literal>nixosTests</literal> in
|
||
parameters of derivations. For instance, the OpenSMTPD derivation
|
||
includes lines similar to:
|
||
<programlisting>
|
||
{ /* ... */, nixosTests }:
|
||
{
|
||
# ...
|
||
passthru.tests = {
|
||
basic-functionality-and-dovecot-integration = nixosTests.opensmtpd;
|
||
};
|
||
}
|
||
</programlisting>
|
||
</para>
|
||
</listitem>
|
||
</varlistentry>
|
||
<varlistentry>
|
||
<term>
|
||
<varname>timeout</varname>
|
||
</term>
|
||
<listitem>
|
||
<para>
|
||
A timeout (in seconds) for building the derivation. If the derivation
|
||
takes longer than this time to build, it can fail due to breaking the
|
||
timeout. However, all computers do not have the same computing power,
|
||
hence some builders may decide to apply a multiplicative factor to this
|
||
value. When filling this value in, try to keep it approximately
|
||
consistent with other values already present in
|
||
<literal>nixpkgs</literal>.
|
||
</para>
|
||
</listitem>
|
||
</varlistentry>
|
||
<varlistentry>
|
||
<term>
|
||
<varname>hydraPlatforms</varname>
|
||
</term>
|
||
<listitem>
|
||
<para>
|
||
The list of Nix platform types for which the Hydra instance at
|
||
<literal>hydra.nixos.org</literal> will build the 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>
|
||
<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. Such packages should be removed from
|
||
Nixpkgs eventually unless they are fixed.
|
||
</para>
|
||
</listitem>
|
||
</varlistentry>
|
||
<varlistentry>
|
||
<term>
|
||
<varname>updateWalker</varname>
|
||
</term>
|
||
<listitem>
|
||
<para>
|
||
If set to <literal>true</literal>, the package is tested to be updated
|
||
correctly by the <literal>update-walker.sh</literal> script without
|
||
additional settings. Such packages have <varname>meta.version</varname>
|
||
set and their homepage (or the page specified by
|
||
<varname>meta.downloadPage</varname>) contains a direct link to the
|
||
package tarball.
|
||
</para>
|
||
</listitem>
|
||
</varlistentry>
|
||
</variablelist>
|
||
</section>
|
||
<section xml:id="sec-meta-license">
|
||
<title>Licenses</title>
|
||
|
||
<para>
|
||
The <varname>meta.license</varname> attribute should preferrably contain a
|
||
value from <varname>stdenv.lib.licenses</varname> defined in
|
||
<link xlink:href="https://github.com/NixOS/nixpkgs/blob/master/lib/licenses.nix">
|
||
<filename>nixpkgs/lib/licenses.nix</filename></link>, or in-place license
|
||
description of the same format if the license is unlikely to be useful in
|
||
another expression.
|
||
</para>
|
||
|
||
<para>
|
||
Although it's typically better to indicate the specific license, a few
|
||
generic options are available:
|
||
<variablelist>
|
||
<varlistentry>
|
||
<term>
|
||
<varname>stdenv.lib.licenses.free</varname>, <varname>"free"</varname>
|
||
</term>
|
||
<listitem>
|
||
<para>
|
||
Catch-all for free software licenses not listed above.
|
||
</para>
|
||
</listitem>
|
||
</varlistentry>
|
||
<varlistentry>
|
||
<term>
|
||
<varname>stdenv.lib.licenses.unfreeRedistributable</varname>, <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>stdenv.lib.licenses.unfree</varname>, <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>stdenv.lib.licenses.unfreeRedistributableFirmware</varname>, <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>
|