1 # Meta-attributes {#chap-meta}
3 Nix packages can declare *meta-attributes* 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 `meta` declaration like this:
8 description = "A program that produces a familiar, friendly greeting";
10 GNU Hello is a program that prints "Hello, world!" when you run it.
11 It is fully customizable.
13 homepage = "https://www.gnu.org/software/hello/manual/";
14 license = lib.licenses.gpl3Plus;
15 maintainers = with lib.maintainers; [ eelco ];
16 platforms = lib.platforms.all;
21 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.
23 ## Standard meta-attributes {#sec-standard-meta-attributes}
25 It is expected that each meta-attribute is one of the following:
27 ### `description` {#var-meta-description}
29 A short (one-line) description of the package.
30 This is displayed on [search.nixos.org](https://search.nixos.org/packages).
32 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.
34 Wrong: `"libpng is a library that allows you to decode PNG images."`
36 Right: `"A library for decoding PNG images"`
38 ### `longDescription` {#var-meta-longDescription}
40 An arbitrarily long description of the package in [CommonMark](https://commonmark.org) Markdown.
42 ### `branch` {#var-meta-branch}
44 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.
46 ### `homepage` {#var-meta-homepage}
48 The package’s homepage. Example: `https://www.gnu.org/software/hello/manual/`
50 ### `downloadPage` {#var-meta-downloadPage}
52 The page where a link to the current version can be found. Example: `https://ftp.gnu.org/gnu/hello/`
54 ### `changelog` {#var-meta-changelog}
56 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: `"https://git.savannah.gnu.org/cgit/hello.git/plain/NEWS?h=v${version}"`
58 ### `license` {#var-meta-license}
60 The license, or licenses, for the package. One from the attribute set defined in [`nixpkgs/lib/licenses.nix`](https://github.com/NixOS/nixpkgs/blob/master/lib/licenses.nix). 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:
62 - Single license referenced by attribute (preferred) `lib.licenses.gpl3Only`.
63 - Single license referenced by its attribute shortName (frowned upon) `"gpl3Only"`.
64 - Single license referenced by its attribute spdxId (frowned upon) `"GPL-3.0-only"`.
65 - Multiple licenses referenced by attribute (preferred) `with lib.licenses; [ asl20 free ofl ]`.
66 - Multiple licenses referenced as a space delimited string of attribute shortNames (frowned upon) `"asl20 free ofl"`.
68 For details, see [Licenses](#sec-meta-license).
70 ### `maintainers` {#var-meta-maintainers}
72 A list of the maintainers of this Nix expression. Maintainers are defined in [`nixpkgs/maintainers/maintainer-list.nix`](https://github.com/NixOS/nixpkgs/blob/master/maintainers/maintainer-list.nix). There is no restriction to becoming a maintainer, just add yourself to that list in a separate commit titled “maintainers: add alice” in the same pull request, and reference maintainers with `maintainers = with lib.maintainers; [ alice bob ]`.
74 ### `mainProgram` {#var-meta-mainProgram}
76 The name of the main binary for the package. This affects the binary `nix run` executes. Example: `"rg"`
78 ### `priority` {#var-meta-priority}
80 The *priority* of the package, used by `nix-env` to resolve file name conflicts between packages. See the [manual page for `nix-env`](https://nixos.org/manual/nix/stable/command-ref/nix-env) for details. Example: `"10"` (a low-priority package).
82 ### `platforms` {#var-meta-platforms}
84 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:
88 meta.platforms = lib.platforms.linux;
92 Attribute Set `lib.platforms` defines [various common lists](https://github.com/NixOS/nixpkgs/blob/master/lib/systems/doubles.nix) of platforms types.
94 ### `badPlatforms` {#var-meta-badPlatforms}
96 The list of Nix [platform types](https://github.com/NixOS/nixpkgs/blob/b03ac42b0734da3e7be9bf8d94433a5195734b19/lib/meta.nix#L75-L81) on which the package is known not to be buildable.
97 Hydra will never create prebuilt binaries for these platform types, even if they are in [`meta.platforms`](#var-meta-platforms).
98 In general it is preferable to set `meta.platforms = lib.platforms.all` and then exclude any platforms on which the package is known not to build.
99 For example, a package which requires dynamic linking and cannot be linked statically could use this:
103 meta.platforms = lib.platforms.all;
104 meta.badPlatforms = [ lib.systems.inspect.patterns.isStatic ];
108 The [`lib.meta.availableOn`](https://github.com/NixOS/nixpkgs/blob/b03ac42b0734da3e7be9bf8d94433a5195734b19/lib/meta.nix#L95-L106) function can be used to test whether or not a package is available (i.e. buildable) on a given platform.
109 Some packages use this to automatically detect the maximum set of features with which they can be built.
110 For example, `systemd` [requires dynamic linking](https://github.com/systemd/systemd/issues/20600#issuecomment-912338965), and [has a `meta.badPlatforms` setting](https://github.com/NixOS/nixpkgs/blob/b03ac42b0734da3e7be9bf8d94433a5195734b19/pkgs/os-specific/linux/systemd/default.nix#L752) similar to the one above.
111 Packages which can be built with or without `systemd` support will use `lib.meta.availableOn` to detect whether or not `systemd` is available on the [`hostPlatform`](#ssec-cross-platform-parameters) for which they are being built; if it is not available (e.g. due to a statically-linked host platform like `pkgsStatic`) this support will be disabled by default.
113 ### `tests` {#var-meta-tests}
116 This attribute is special in that it is not actually under the `meta` attribute set but rather under the `passthru` attribute set. This is due to how `meta` attributes work, and the fact that they are supposed to contain only metadata, not derivations.
119 An attribute set with tests as values. A test is a derivation that builds when the test passes and fails to build otherwise.
121 You can run these tests with:
125 $ nix-build -A your-package.tests
128 #### Package tests {#var-meta-tests-packages}
130 Tests that are part of the source package are often executed in the `installCheckPhase`.
132 Prefer `passthru.tests` for tests that are introduced in nixpkgs because:
134 * `passthru.tests` tests the 'real' package, independently from the environment in which it was built
135 * we can run `passthru.tests` independently
136 * `installCheckPhase` adds overhead to each build
138 For more on how to write and run package tests, see [](#sec-package-tests).
140 #### NixOS tests {#var-meta-tests-nixos}
142 The NixOS tests are available as `nixosTests` in parameters of derivations. For instance, the OpenSMTPD derivation includes lines similar to:
145 { /* ... , */ nixosTests }:
149 basic-functionality-and-dovecot-integration = nixosTests.opensmtpd;
154 NixOS tests run in a VM, so they are slower than regular package tests. For more information see [NixOS module tests](https://nixos.org/manual/nixos/stable/#sec-nixos-tests).
156 Alternatively, you can specify other derivations as tests. You can make use of
157 the optional parameter to inject the correct package without
158 relying on non-local definitions, even in the presence of `overrideAttrs`.
159 Here that's `finalAttrs.finalPackage`, but you could choose a different name if
160 `finalAttrs` already exists in your scope.
162 `(mypkg.overrideAttrs f).passthru.tests` will be as expected, as long as the
163 definition of `tests` does not rely on the original `mypkg` or overrides it in
167 # my-package/default.nix
168 { stdenv, callPackage }:
169 stdenv.mkDerivation (finalAttrs: {
171 passthru.tests.example = callPackage ./example.nix { my-package = finalAttrs.finalPackage; };
176 # my-package/example.nix
177 { runCommand, lib, my-package, ... }:
178 runCommand "my-package-test" {
179 nativeBuildInputs = [ my-package ];
180 src = lib.sources.sourcesByRegex ./. [ ".*.in" ".*.expected" ];
183 my-package <example.in >example.actual
184 diff -U3 --color=auto example.expected example.actual
190 ### `timeout` {#var-meta-timeout}
192 A timeout (in seconds) for building the derivation. If the derivation takes longer than this time to build, Hydra will fail it 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 `nixpkgs`.
194 `meta` attributes are not stored in the instantiated derivation.
195 Therefore, this setting may be lost when the package is used as a dependency.
196 To be effective, it must be presented directly to an evaluation process that handles the `meta.timeout` attribute.
198 ### `hydraPlatforms` {#var-meta-hydraPlatforms}
200 The list of Nix platform types for which the [Hydra](https://github.com/nixos/hydra) [instance at `hydra.nixos.org`](https://nixos.org/hydra) will build the package. (Hydra is the Nix-based continuous build system.) It defaults to the value of `meta.platforms`. Thus, the only reason to set `meta.hydraPlatforms` is if you want `hydra.nixos.org` to build the package on a subset of `meta.platforms`, or not at all, e.g.
204 meta.platforms = lib.platforms.linux;
205 meta.hydraPlatforms = [];
209 ### `broken` {#var-meta-broken}
211 If set to `true`, the package is marked as "broken", meaning that it won’t show up in [search.nixos.org](https://search.nixos.org/packages), and cannot be built or installed unless the environment variable [`NIXPKGS_ALLOW_BROKEN`](#opt-allowBroken) is set.
212 Such unconditionally-broken packages should be removed from Nixpkgs eventually unless they are fixed.
214 The value of this attribute can depend on a package's arguments, including `stdenv`.
215 This means that `broken` can be used to express constraints, for example:
217 - Does not cross compile
221 meta.broken = !(stdenv.buildPlatform.canExecute stdenv.hostPlatform);
225 - Broken if all of a certain set of its dependencies are broken
229 meta.broken = lib.all (map (p: p.meta.broken) [ glibc musl ]);
233 This makes `broken` strictly more powerful than `meta.badPlatforms`.
234 However `meta.availableOn` currently examines only `meta.platforms` and `meta.badPlatforms`, so `meta.broken` does not influence the default values for optional dependencies.
236 ## Licenses {#sec-meta-license}
238 The `meta.license` attribute should preferably contain a value from `lib.licenses` defined in [`nixpkgs/lib/licenses.nix`](https://github.com/NixOS/nixpkgs/blob/master/lib/licenses.nix), or in-place license description of the same format if the license is unlikely to be useful in another expression.
240 Although it’s typically better to indicate the specific license, a few generic options are available:
242 ### `lib.licenses.free`, `"free"` {#lib.licenses.free-free}
244 Catch-all for free software licenses not listed above.
246 ### `lib.licenses.unfreeRedistributable`, `"unfree-redistributable"` {#lib.licenses.unfreeredistributable-unfree-redistributable}
248 Unfree package that can be redistributed in binary form. That is, it’s legal to redistribute the *output* of the derivation. This means that the package can be included in the Nixpkgs channel.
250 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 `patchelf` to make them work. Thus, its license is `"unfree"` and it cannot be included in the Nixpkgs channel.
252 ### `lib.licenses.unfree`, `"unfree"` {#lib.licenses.unfree-unfree}
254 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.
256 ### `lib.licenses.unfreeRedistributableFirmware`, `"unfree-redistributable-firmware"` {#lib.licenses.unfreeredistributablefirmware-unfree-redistributable-firmware}
258 This package supplies unfree, redistributable firmware. This is a separate value from `unfree-redistributable` because not everybody cares whether firmware is free.
260 ## Source provenance {#sec-meta-sourceProvenance}
262 The value of a package's `meta.sourceProvenance` attribute specifies the provenance of the package's derivation outputs.
264 If a package contains elements that are not built from the original source by a nixpkgs derivation, the `meta.sourceProvenance` attribute should be a list containing one or more value from `lib.sourceTypes` defined in [`nixpkgs/lib/source-types.nix`](https://github.com/NixOS/nixpkgs/blob/master/lib/source-types.nix).
266 Adding this information helps users who have needs related to build transparency and supply-chain security to gain some visibility into their installed software or set policy to allow or disallow installation based on source provenance.
268 The presence of a particular `sourceType` in a package's `meta.sourceProvenance` list indicates that the package contains some components falling into that category, though the *absence* of that `sourceType` does not *guarantee* the absence of that category of `sourceType` in the package's contents. A package with no `meta.sourceProvenance` set implies it has no *known* `sourceType`s other than `fromSource`.
270 The meaning of the `meta.sourceProvenance` attribute does not depend on the value of the `meta.license` attribute.
272 ### `lib.sourceTypes.fromSource` {#lib.sourceTypes.fromSource}
274 Package elements which are produced by a nixpkgs derivation which builds them from source code.
276 ### `lib.sourceTypes.binaryNativeCode` {#lib.sourceTypes.binaryNativeCode}
278 Native code to be executed on the target system's CPU, built by a third party. This includes packages which wrap a downloaded AppImage or Debian package.
280 ### `lib.sourceTypes.binaryFirmware` {#lib.sourceTypes.binaryFirmware}
282 Code to be executed on a peripheral device or embedded controller, built by a third party.
284 ### `lib.sourceTypes.binaryBytecode` {#lib.sourceTypes.binaryBytecode}
286 Code to run on a VM interpreter or JIT compiled into bytecode by a third party. This includes packages which download Java `.jar` files from another source.