···11# Multiple-output packages {#chap-multiple-output}
2233-## Introduction {#sec-multiple-outputs-introduction}
44-53The Nix language allows a derivation to produce multiple outputs, which is similar to what is utilized by other Linux distribution packaging systems. The outputs reside in separate Nix store paths, so they can be mostly handled independently of each other, including passing to build inputs, garbage collection or binary substitution. The exception is that building from source always produces all the outputs.
6475The main motivation is to save disk space by reducing runtime closure sizes; consequently also sizes of substituted binaries get reduced. Splitting can be used to have more granular runtime dependencies, for example the typical reduction is to split away development-only files, as those are typically not needed during runtime. As a result, closure sizes of many packages can get reduced to a half or even much less.
···108The reduction effects could be instead achieved by building the parts in completely separate derivations. That would often additionally reduce build-time closures, but it tends to be much harder to write such derivations, as build systems typically assume all parts are being built at once. This compromise approach of single source package producing multiple binary packages is also utilized often by rpm and deb.
119:::
12101313-A number of attributes can be used to work with a derivation with multiple outputs. The attribute `outputs` is a list of strings, which are the names of the outputs. For each of these names, an identically named attribute is created, corresponding to that output. The attribute `meta.outputsToInstall` is used to determine the default set of outputs to install when using the derivation name unqualified.
1414-1515-## Installing a split package {#sec-multiple-outputs-installing}
1616-1717-When installing a package with multiple outputs, the package’s `meta.outputsToInstall` attribute determines which outputs are actually installed. `meta.outputsToInstall` is a list whose [default installs binaries and the associated man pages](https://github.com/NixOS/nixpkgs/blob/f1680774340d5443a1409c3421ced84ac1163ba9/pkgs/stdenv/generic/make-derivation.nix#L310-L320). The following sections describe ways to install different outputs.
1818-1919-### Selecting outputs to install via NixOS {#sec-multiple-outputs-installing-nixos}
2020-2121-NixOS provides two ways to select the outputs to install for packages listed in `environment.systemPackages`:
2222-2323-- The configuration option `environment.extraOutputsToInstall` is appended to each package’s `meta.outputsToInstall` attribute to determine the outputs to install. It can for example be used to install `info` documentation or debug symbols for all packages.
2424-2525-- The outputs can be listed as packages in `environment.systemPackages`. For example, the `"out"` and `"info"` outputs for the `coreutils` package can be installed by including `coreutils` and `coreutils.info` in `environment.systemPackages`.
2626-2727-### Selecting outputs to install via `nix-env` {#sec-multiple-outputs-installing-nix-env}
2828-2929-`nix-env` lacks an easy way to select the outputs to install. When installing a package, `nix-env` always installs the outputs listed in `meta.outputsToInstall`, even when the user explicitly selects an output.
3030-3131-::: {.warning}
3232-`nix-env` silently disregards the outputs selected by the user, and instead installs the outputs from `meta.outputsToInstall`. For example,
3333-3434-```ShellSession
3535-$ nix-env -iA nixpkgs.coreutils.info
3636-```
3737-3838-installs the `"out"` output (`coreutils.meta.outputsToInstall` is `[ "out" ]`) instead of the requested `"info"`.
3939-:::
4040-4141-The only recourse to select an output with `nix-env` is to override the package’s `meta.outputsToInstall`, using the functions described in [](#chap-overrides). For example, the following overlay adds the `"info"` output for the `coreutils` package:
1111+A number of attributes can be used to work with a derivation with multiple outputs.
1212+The attribute `outputs` is a list of strings, which are the names of the outputs.
1313+For each of these names, an identically named attribute is created, corresponding to that output.
42144343-```nix
4444-self: super:
4545-{
4646- coreutils = super.coreutils.overrideAttrs (oldAttrs: {
4747- meta = oldAttrs.meta // { outputsToInstall = oldAttrs.meta.outputsToInstall or [ "out" ] ++ [ "info" ]; };
4848- });
4949-}
5050-```
1515+The attribute `meta.outputsToInstall` is used to determine the [default set of outputs to install](https://github.com/NixOS/nixpkgs/blob/08c3198f1c6fd89a09f8f0ea09b425028a34de3e/pkgs/stdenv/generic/check-meta.nix#L411-L426) when using the derivation name unqualified:
1616+`bin`, or `out`, or the first specified output; as well as `man` if that is specified.
51175218## Using a split package {#sec-multiple-outputs-using-split-packages}
5319
···132132133133- `himalaya` has been updated to `0.8.0`, which drops the native TLS support (in favor of Rustls) and add OAuth 2.0 support. See the [release note](https://github.com/soywod/himalaya/releases/tag/v0.8.0) for more details.
134134135135+- `nix-prefetch-git` now ignores global and user git config, to improve reproducibility.
136136+135137- The [services.caddy.acmeCA](#opt-services.caddy.acmeCA) option now defaults to `null` instead of `"https://acme-v02.api.letsencrypt.org/directory"`, to use all of Caddy's default ACME CAs and enable Caddy's automatic issuer fallback feature by default, as recommended by upstream.
136138137139- The default priorities of [`services.nextcloud.phpOptions`](#opt-services.nextcloud.phpOptions) have changed. This means that e.g.
···276278- `services.matrix-synapse` has new options to configure worker processes for matrix-synapse using [`services.matrix-synapse.workers`](#opt-services.matrix-synapse.workers). It's also now possible to configure a local redis server using [`services.matrix-synapse.configureRedisLocally`](#opt-services.matrix-synapse.configureRedisLocally).
277279278280- `services.nginx` gained a `defaultListen` option at server-level with support for PROXY protocol listeners, also `proxyProtocol` is now exposed in `services.nginx.virtualHosts.<name>.listen` option. It is now possible to run PROXY listeners and non-PROXY listeners at a server-level, see [#213510](https://github.com/NixOS/nixpkgs/pull/213510/) for more details.
279279-280280-- `generic-extlinux-compatible` bootloader (and raspberry pi with uboot) supports appending secrets to the initramfs
281281282282- `services.restic.backups` now adds wrapper scripts to your system path, which set the same environment variables as the service, so restic operations can easly be run from the command line. This behavior can be disabled by setting `createWrapper` to `false`, per backup configuration.
283283
+8-2
nixos/modules/config/system-path.nix
···116116 extraOutputsToInstall = mkOption {
117117 type = types.listOf types.str;
118118 default = [ ];
119119- example = [ "doc" "info" "devdoc" ];
120120- description = lib.mdDoc "List of additional package outputs to be symlinked into {file}`/run/current-system/sw`.";
119119+ example = [ "dev" "info" ];
120120+ description = lib.mdDoc ''
121121+ Entries listed here will be appended to the `meta.outputsToInstall` attribute for each package in `environment.systemPackages`, and the files from the corresponding derivation outputs symlinked into {file}`/run/current-system/sw`.
122122+123123+ For example, this can be used to install the `dev` and `info` outputs for all packages in the system environment, if they are available.
124124+125125+ To use specific outputs instead of configuring them globally, select the corresponding attribute on the package derivation, e.g. `libxml2.dev` or `coreutils.info`.
126126+ '';
121127 };
122128123129 extraSetup = mkOption {
···7070addEntry() {
7171 local path=$(readlink -f "$1")
7272 local tag="$2" # Generation number or 'default'
7373- local current="$3" # whether this is the current/latest generation
74737574 if ! test -e $path/kernel -a -e $path/initrd; then
7675 return
7776 fi
78777979- if test -e "$path/append-initrd-secrets"; then
8080- local initrd="$target/nixos/$(basename "$path")-initramfs-with-secrets"
8181- cp $(readlink -f "$path/initrd") "$initrd"
8282- chmod 600 "${initrd}"
8383- chown 0:0 "${initrd}"
8484- filesCopied[$initrd]=1
8585-8686- "$path/append-initrd-secrets" "$initrd" || if test "${current}" = "1"; then
8787- echo "failed to create initrd secrets for the current generation." >&2
8888- echo "are your \`boot.initrd.secrets\` still in place?" >&2
8989- exit 1
9090- else
9191- echo "warning: failed to create initrd secrets for \"$path\", an older generation" >&2
9292- echo "note: this is normal after having removed or renamed a file in \`boot.initrd.secrets\`" >&2
9393- fi
9494- else
9595- copyToKernelsDir "$path/initrd"; initrd=$result
9696- fi
9797-9878 copyToKernelsDir "$path/kernel"; kernel=$result
9999-7979+ copyToKernelsDir "$path/initrd"; initrd=$result
10080 dtbDir=$(readlink -m "$path/dtbs")
10181 if [ -e "$dtbDir" ]; then
10282 copyToKernelsDir "$dtbDir"; dtbs=$result
···150130TIMEOUT $timeout
151131EOF
152132153153-addEntry $default default 1 >> $tmpFile
133133+addEntry $default default >> $tmpFile
154134155135if [ "$numGenerations" -gt 0 ]; then
156136 # Add up to $numGenerations generations of the system profile to the menu,
157137 # in reverse (most recent to least recent) order.
158158- current=1
159138 for generation in $(
160139 (cd /nix/var/nix/profiles && ls -d system-*-link) \
161140 | sed 's/system-\([0-9]\+\)-link/\1/' \
162141 | sort -n -r \
163142 | head -n $numGenerations); do
164143 link=/nix/var/nix/profiles/system-$generation-link
165165- addEntry $link $generation $current
166166- current=0
144144+ addEntry $link $generation
167145 done >> $tmpFile
168146fi
169147
···610610 path the secret should have inside the initrd, the value
611611 is the path it should be copied from (or null for the same
612612 path inside and out).
613613-614614- The loader `generic-extlinux-compatible` supports this. Because
615615- it is not well know how different implementations react to
616616- concatenated cpio archives, this is disabled by default. It can be
617617- enabled by setting {option}`boot.loader.supportsInitrdSecrets`
618618- to true. If this works for you, please report your findings at
619619- https://github.com/NixOS/nixpkgs/issues/247145 .
620613 '';
621614 example = literalExpression
622615 ''
+1
pkgs/applications/editors/mg/default.nix
···3131 description = "Micro GNU/emacs, a portable version of the mg maintained by the OpenBSD team";
3232 homepage = "https://man.openbsd.org/OpenBSD-current/man1/mg.1";
3333 license = licenses.publicDomain;
3434+ mainProgram = "mg";
3435 platforms = platforms.all;
3536 };
3637}
···66latest_linux_version=$(curl -L --silent https://slack.com/downloads/linux | sed -n 's/.*Version \([0-9\.]\+\).*/\1/p')
77latest_mac_version=$(curl -L --silent https://slack.com/downloads/mac | sed -n 's/.*Version \([0-9\.]\+\).*/\1/p')
8899-# Double check that the latest mac and linux versions are in sync.
1010-if [[ "$latest_linux_version" != "$latest_mac_version" ]]; then
1111- echo "the latest linux ($latest_linux_version) and mac ($latest_mac_version) versions are not the same"
1212- exit 1
1313-fi
1414-159nixpkgs="$(git rev-parse --show-toplevel)"
1610slack_nix="$nixpkgs/pkgs/applications/networking/instant-messengers/slack/default.nix"
1711nixpkgs_linux_version=$(cat "$slack_nix" | sed -n 's/.*x86_64-linux-version = \"\([0-9\.]\+\)\";.*/\1/p')
···55}:
66crystal.buildCrystalPackage rec {
77 pname = "gi-crystal";
88- version = "0.17.0";
88+ version = "0.18.0";
991010 src = fetchFromGitHub {
1111 owner = "hugopl";
1212 repo = "gi-crystal";
1313 rev = "v${version}";
1414- hash = "sha256-DIH8L8P8lkWzzVUj1Tbf9oTUvu9X7OT66APyUHiDkYk=";
1414+ hash = "sha256-9px6JRdVzsUoU5wlO+blH1OBGKskozF3WvqLV/EYiiA=";
1515 };
16161717 # Make sure gi-crystal picks up the name of the so or dylib and not the leading nix store path