2014-04-14 15:26:48 +01:00
|
|
|
{ config, lib, pkgs, ... }:
|
2009-03-06 12:25:51 +00:00
|
|
|
|
2014-04-14 15:26:48 +01:00
|
|
|
with lib;
|
2009-05-25 18:41:03 +01:00
|
|
|
|
2009-03-06 12:25:51 +00:00
|
|
|
let
|
|
|
|
|
2012-06-19 04:31:07 +01:00
|
|
|
cfg = config.nix;
|
|
|
|
|
2016-04-24 12:06:04 +01:00
|
|
|
nix = cfg.package.out;
|
2011-09-14 19:20:50 +01:00
|
|
|
|
2019-08-27 20:17:20 +01:00
|
|
|
nixVersion = getVersion nix;
|
|
|
|
|
2019-09-28 15:49:53 +01:00
|
|
|
isNix23 = versionAtLeast nixVersion "2.3pre";
|
2017-03-03 14:55:27 +00:00
|
|
|
|
2019-09-14 18:51:29 +01:00
|
|
|
makeNixBuildUser = nr: {
|
|
|
|
name = "nixbld${toString nr}";
|
|
|
|
value = {
|
2010-03-11 16:50:08 +00:00
|
|
|
description = "Nix build user ${toString nr}";
|
|
|
|
|
|
|
|
/* For consistency with the setgid(2), setuid(2), and setgroups(2)
|
|
|
|
calls in `libstore/build.cc', don't add any supplementary group
|
2010-06-02 22:10:48 +01:00
|
|
|
here except "nixbld". */
|
2010-03-11 16:50:08 +00:00
|
|
|
uid = builtins.add config.ids.uids.nixbld nr;
|
2021-03-07 13:54:00 +00:00
|
|
|
isSystemUser = true;
|
2010-03-11 16:50:08 +00:00
|
|
|
group = "nixbld";
|
2010-06-02 22:10:48 +01:00
|
|
|
extraGroups = [ "nixbld" ];
|
2010-03-11 16:50:08 +00:00
|
|
|
};
|
2019-09-14 18:51:29 +01:00
|
|
|
};
|
2009-03-06 12:25:51 +00:00
|
|
|
|
2019-09-14 18:51:29 +01:00
|
|
|
nixbldUsers = listToAttrs (map makeNixBuildUser (range 1 cfg.nrBuildUsers));
|
2015-03-10 01:04:40 +00:00
|
|
|
|
2013-02-26 02:15:29 +00:00
|
|
|
nixConf =
|
2019-10-09 19:27:11 +01:00
|
|
|
assert versionAtLeast nixVersion "2.2";
|
|
|
|
pkgs.runCommand "nix.conf" { preferLocalBuild = true; extraOptions = cfg.extraOptions; } (
|
|
|
|
''
|
2013-02-26 02:15:29 +00:00
|
|
|
cat > $out <<END
|
2013-08-26 11:11:17 +01:00
|
|
|
# WARNING: this file is generated from the nix.* options in
|
|
|
|
# your NixOS configuration, typically
|
|
|
|
# /etc/nixos/configuration.nix. Do not edit it!
|
2013-02-26 02:15:29 +00:00
|
|
|
build-users-group = nixbld
|
2019-10-09 19:27:11 +01:00
|
|
|
max-jobs = ${toString (cfg.maxJobs)}
|
|
|
|
cores = ${toString (cfg.buildCores)}
|
|
|
|
sandbox = ${if (builtins.isBool cfg.useSandbox) then boolToString cfg.useSandbox else cfg.useSandbox}
|
2021-05-24 09:51:02 +01:00
|
|
|
extra-sandbox-paths = ${toString cfg.sandboxPaths}
|
2019-10-09 19:27:11 +01:00
|
|
|
substituters = ${toString cfg.binaryCaches}
|
|
|
|
trusted-substituters = ${toString cfg.trustedBinaryCaches}
|
|
|
|
trusted-public-keys = ${toString cfg.binaryCachePublicKeys}
|
2017-04-11 17:08:51 +01:00
|
|
|
auto-optimise-store = ${boolToString cfg.autoOptimiseStore}
|
2020-10-14 00:46:17 +01:00
|
|
|
require-sigs = ${boolToString cfg.requireSignedBinaryCaches}
|
2015-06-26 17:33:01 +01:00
|
|
|
trusted-users = ${toString cfg.trustedUsers}
|
|
|
|
allowed-users = ${toString cfg.allowedUsers}
|
2019-10-09 19:27:11 +01:00
|
|
|
${optionalString (!cfg.distributedBuilds) ''
|
2018-01-31 21:20:39 +00:00
|
|
|
builders =
|
|
|
|
''}
|
2019-04-21 18:06:50 +01:00
|
|
|
system-features = ${toString cfg.systemFeatures}
|
2019-09-28 15:49:53 +01:00
|
|
|
${optionalString isNix23 ''
|
2019-08-27 20:17:20 +01:00
|
|
|
sandbox-fallback = false
|
|
|
|
''}
|
2013-02-26 02:15:29 +00:00
|
|
|
$extraOptions
|
|
|
|
END
|
2018-11-10 01:18:06 +00:00
|
|
|
'' + optionalString cfg.checkConfig (
|
|
|
|
if pkgs.stdenv.hostPlatform != pkgs.stdenv.buildPlatform then ''
|
|
|
|
echo "Ignore nix.checkConfig when cross-compiling"
|
|
|
|
'' else ''
|
|
|
|
echo "Checking that Nix can read nix.conf..."
|
|
|
|
ln -s $out ./nix.conf
|
2019-10-23 17:39:37 +01:00
|
|
|
NIX_CONF_DIR=$PWD ${cfg.package}/bin/nix show-config ${optionalString isNix23 "--no-net --option experimental-features nix-command"} >/dev/null
|
2018-11-10 01:18:06 +00:00
|
|
|
'')
|
|
|
|
);
|
2013-02-26 02:15:29 +00:00
|
|
|
|
2009-09-17 17:22:26 +01:00
|
|
|
in
|
2009-05-25 18:41:03 +01:00
|
|
|
|
2009-09-17 17:22:26 +01:00
|
|
|
{
|
2019-12-10 01:51:19 +00:00
|
|
|
imports = [
|
|
|
|
(mkRenamedOptionModule [ "nix" "useChroot" ] [ "nix" "useSandbox" ])
|
|
|
|
(mkRenamedOptionModule [ "nix" "chrootDirs" ] [ "nix" "sandboxPaths" ])
|
2021-11-26 11:53:37 +00:00
|
|
|
(mkRenamedOptionModule [ "nix" "daemonIONiceLevel" ] [ "nix" "daemonIOSchedPriority" ])
|
|
|
|
(mkRemovedOptionModule [ "nix" "daemonNiceLevel" ] "Consider nix.daemonCPUSchedPolicy instead.")
|
2019-12-10 01:51:19 +00:00
|
|
|
];
|
2009-05-25 18:41:03 +01:00
|
|
|
|
2009-09-17 17:22:26 +01:00
|
|
|
###### interface
|
|
|
|
|
|
|
|
options = {
|
|
|
|
|
2009-03-06 12:25:51 +00:00
|
|
|
nix = {
|
|
|
|
|
2021-04-24 22:02:15 +01:00
|
|
|
enable = mkOption {
|
|
|
|
type = types.bool;
|
|
|
|
default = true;
|
|
|
|
description = ''
|
|
|
|
Whether to enable Nix.
|
|
|
|
Disabling Nix makes the system hard to modify and the Nix programs and configuration will not be made available by NixOS itself.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
2013-10-28 15:28:04 +00:00
|
|
|
package = mkOption {
|
2014-02-27 12:22:04 +00:00
|
|
|
type = types.package;
|
2016-04-24 12:01:40 +01:00
|
|
|
default = pkgs.nix;
|
2021-10-03 17:06:03 +01:00
|
|
|
defaultText = literalExpression "pkgs.nix";
|
2013-10-28 15:28:04 +00:00
|
|
|
description = ''
|
|
|
|
This option specifies the Nix package instance to use throughout the system.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
2009-03-06 12:25:51 +00:00
|
|
|
maxJobs = mkOption {
|
2018-08-18 12:45:12 +01:00
|
|
|
type = types.either types.int (types.enum ["auto"]);
|
2020-04-07 08:21:02 +01:00
|
|
|
default = "auto";
|
2013-10-30 16:37:45 +00:00
|
|
|
example = 64;
|
2015-02-16 10:57:36 +00:00
|
|
|
description = ''
|
2020-04-07 08:21:02 +01:00
|
|
|
This option defines the maximum number of jobs that Nix will try to
|
|
|
|
build in parallel. The default is auto, which means it will use all
|
|
|
|
available logical cores. It is recommend to set it to the total
|
|
|
|
number of logical cores in your system (e.g., 16 for two CPUs with 4
|
|
|
|
cores each and hyper-threading).
|
2015-02-16 10:57:36 +00:00
|
|
|
'';
|
2009-03-06 12:25:51 +00:00
|
|
|
};
|
|
|
|
|
2017-03-20 18:06:16 +00:00
|
|
|
autoOptimiseStore = mkOption {
|
|
|
|
type = types.bool;
|
|
|
|
default = false;
|
|
|
|
example = true;
|
|
|
|
description = ''
|
|
|
|
If set to true, Nix automatically detects files in the store that have
|
|
|
|
identical contents, and replaces them with hard links to a single copy.
|
|
|
|
This saves disk space. If set to false (the default), you can still run
|
|
|
|
nix-store --optimise to get rid of duplicate files.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
2014-10-31 12:49:18 +00:00
|
|
|
buildCores = mkOption {
|
|
|
|
type = types.int;
|
2018-11-16 00:39:27 +00:00
|
|
|
default = 0;
|
2014-10-31 12:49:18 +00:00
|
|
|
example = 64;
|
|
|
|
description = ''
|
|
|
|
This option defines the maximum number of concurrent tasks during
|
2018-11-16 00:39:27 +00:00
|
|
|
one build. It affects, e.g., -j option for make.
|
2015-01-05 14:38:08 +00:00
|
|
|
The special value 0 means that the builder should use all
|
|
|
|
available CPU cores in the system. Some builds may become
|
|
|
|
non-deterministic with this option; use with care! Packages will
|
|
|
|
only be affected if enableParallelBuilding is set for them.
|
2014-10-31 12:49:18 +00:00
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
2016-04-25 10:00:26 +01:00
|
|
|
useSandbox = mkOption {
|
2016-03-25 12:47:09 +00:00
|
|
|
type = types.either types.bool (types.enum ["relaxed"]);
|
2018-07-29 10:01:55 +01:00
|
|
|
default = true;
|
2009-03-06 12:25:51 +00:00
|
|
|
description = "
|
2016-04-25 10:00:26 +01:00
|
|
|
If set, Nix will perform builds in a sandboxed environment that it
|
2018-06-07 21:43:52 +01:00
|
|
|
will set up automatically for each build. This prevents impurities
|
2018-06-30 00:58:35 +01:00
|
|
|
in builds by disallowing access to dependencies outside of the Nix
|
|
|
|
store by using network and mount namespaces in a chroot environment.
|
2018-07-29 10:01:55 +01:00
|
|
|
This is enabled by default even though it has a possible performance
|
|
|
|
impact due to the initial setup time of a sandbox for each build. It
|
|
|
|
doesn't affect derivation hashes, so changing this option will not
|
|
|
|
trigger a rebuild of packages.
|
2009-03-06 12:25:51 +00:00
|
|
|
";
|
|
|
|
};
|
|
|
|
|
2016-04-25 10:00:26 +01:00
|
|
|
sandboxPaths = mkOption {
|
2013-10-30 16:37:45 +00:00
|
|
|
type = types.listOf types.str;
|
2011-03-07 08:20:24 +00:00
|
|
|
default = [];
|
2011-03-07 08:21:39 +00:00
|
|
|
example = [ "/dev" "/proc" ];
|
|
|
|
description =
|
|
|
|
''
|
|
|
|
Directories from the host filesystem to be included
|
2016-04-25 10:00:26 +01:00
|
|
|
in the sandbox.
|
2011-03-07 08:21:39 +00:00
|
|
|
'';
|
2011-03-07 08:20:24 +00:00
|
|
|
};
|
|
|
|
|
2009-03-06 12:25:51 +00:00
|
|
|
extraOptions = mkOption {
|
2013-10-30 16:37:45 +00:00
|
|
|
type = types.lines;
|
2009-03-06 12:25:51 +00:00
|
|
|
default = "";
|
2013-10-29 16:29:37 +00:00
|
|
|
example = ''
|
2019-10-08 07:53:53 +01:00
|
|
|
keep-outputs = true
|
|
|
|
keep-derivations = true
|
2013-10-29 16:29:37 +00:00
|
|
|
'';
|
2012-07-20 19:58:15 +01:00
|
|
|
description = "Additional text appended to <filename>nix.conf</filename>.";
|
2009-03-06 12:25:51 +00:00
|
|
|
};
|
2011-09-14 19:20:50 +01:00
|
|
|
|
2009-03-06 12:25:51 +00:00
|
|
|
distributedBuilds = mkOption {
|
2013-10-30 16:37:45 +00:00
|
|
|
type = types.bool;
|
2009-03-06 12:25:51 +00:00
|
|
|
default = false;
|
2013-10-16 09:53:23 +01:00
|
|
|
description = ''
|
2009-03-06 12:25:51 +00:00
|
|
|
Whether to distribute builds to the machines listed in
|
|
|
|
<option>nix.buildMachines</option>.
|
2013-10-16 09:53:23 +01:00
|
|
|
'';
|
2010-02-19 09:48:24 +00:00
|
|
|
};
|
|
|
|
|
2021-09-20 19:38:35 +01:00
|
|
|
daemonCPUSchedPolicy = mkOption {
|
|
|
|
type = types.enum ["other" "batch" "idle"];
|
|
|
|
default = "other";
|
|
|
|
example = "batch";
|
2013-10-30 16:37:45 +00:00
|
|
|
description = ''
|
2021-09-20 19:38:35 +01:00
|
|
|
Nix daemon process CPU scheduling policy. This policy propagates to
|
2021-12-10 10:30:51 +00:00
|
|
|
build processes. <literal>other</literal> is the default scheduling
|
|
|
|
policy for regular tasks. The <literal>batch</literal> policy is
|
|
|
|
similar to <literal>other</literal>, but optimised for
|
|
|
|
non-interactive tasks. <literal>idle</literal> is for extremely
|
|
|
|
low-priority tasks that should only be run when no other task
|
|
|
|
requires CPU time.
|
|
|
|
|
|
|
|
Please note that while using the <literal>idle</literal> policy may
|
|
|
|
greatly improve responsiveness of a system performing expensive
|
|
|
|
builds, it may also slow down and potentially starve crucial
|
|
|
|
configuration updates during load.
|
|
|
|
|
|
|
|
<literal>idle</literal> may therefore be a sensible policy for
|
|
|
|
systems that experience only intermittent phases of high CPU load,
|
|
|
|
such as desktop or portable computers used interactively. Other
|
|
|
|
systems should use the <literal>other</literal> or
|
|
|
|
<literal>batch</literal> policy instead.
|
|
|
|
|
|
|
|
For more fine-grained resource control, please refer to
|
|
|
|
<citerefentry><refentrytitle>systemd.resource-control
|
|
|
|
</refentrytitle><manvolnum>5</manvolnum></citerefentry> and adjust
|
|
|
|
<option>systemd.services.nix-daemon</option> directly.
|
2021-09-20 19:38:35 +01:00
|
|
|
'';
|
2009-07-18 17:14:03 +01:00
|
|
|
};
|
|
|
|
|
2021-09-20 19:38:35 +01:00
|
|
|
daemonIOSchedClass = mkOption {
|
|
|
|
type = types.enum ["best-effort" "idle"];
|
|
|
|
default = "best-effort";
|
|
|
|
example = "idle";
|
|
|
|
description = ''
|
|
|
|
Nix daemon process I/O scheduling class. This class propagates to
|
2021-12-10 10:30:51 +00:00
|
|
|
build processes. <literal>best-effort</literal> is the default
|
|
|
|
class for regular tasks. The <literal>idle</literal> class is for
|
|
|
|
extremely low-priority tasks that should only perform I/O when no
|
|
|
|
other task does.
|
|
|
|
|
|
|
|
Please note that while using the <literal>idle</literal> scheduling
|
|
|
|
class can improve responsiveness of a system performing expensive
|
|
|
|
builds, it might also slow down or starve crucial configuration
|
|
|
|
updates during load.
|
2021-09-20 19:38:35 +01:00
|
|
|
|
2021-12-10 10:30:51 +00:00
|
|
|
<literal>idle</literal> may therefore be a sensible class for
|
|
|
|
systems that experience only intermittent phases of high I/O load,
|
|
|
|
such as desktop or portable computers used interactively. Other
|
|
|
|
systems should use the <literal>best-effort</literal> class.
|
2021-09-20 19:38:35 +01:00
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
daemonIOSchedPriority = mkOption {
|
2013-10-30 16:37:45 +00:00
|
|
|
type = types.int;
|
2013-08-06 17:32:31 +01:00
|
|
|
default = 0;
|
2021-09-20 19:38:35 +01:00
|
|
|
example = 1;
|
2013-10-30 16:37:45 +00:00
|
|
|
description = ''
|
2021-09-20 19:38:35 +01:00
|
|
|
Nix daemon process I/O scheduling priority. This priority propagates
|
|
|
|
to build processes. The supported priorities depend on the
|
|
|
|
scheduling policy: With idle, priorities are not used in scheduling
|
|
|
|
decisions. best-effort supports values in the range 0 (high) to 7
|
|
|
|
(low).
|
|
|
|
'';
|
2009-10-15 12:25:15 +01:00
|
|
|
};
|
|
|
|
|
2009-03-06 12:25:51 +00:00
|
|
|
buildMachines = mkOption {
|
2020-03-21 19:21:58 +00:00
|
|
|
type = types.listOf (types.submodule ({
|
2018-10-02 01:17:17 +01:00
|
|
|
options = {
|
|
|
|
hostName = mkOption {
|
2020-03-21 19:21:58 +00:00
|
|
|
type = types.str;
|
|
|
|
example = "nixbuilder.example.org";
|
2018-10-02 01:17:17 +01:00
|
|
|
description = ''
|
|
|
|
The hostname of the build machine.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
system = mkOption {
|
2020-03-21 19:21:58 +00:00
|
|
|
type = types.nullOr types.str;
|
2018-10-02 01:17:17 +01:00
|
|
|
default = null;
|
2020-03-21 19:21:58 +00:00
|
|
|
example = "x86_64-linux";
|
2018-10-02 01:17:17 +01:00
|
|
|
description = ''
|
|
|
|
The system type the build machine can execute derivations on.
|
2020-03-21 19:21:58 +00:00
|
|
|
Either this attribute or <varname>systems</varname> must be
|
|
|
|
present, where <varname>system</varname> takes precedence if
|
|
|
|
both are set.
|
2018-10-02 01:17:17 +01:00
|
|
|
'';
|
|
|
|
};
|
|
|
|
systems = mkOption {
|
2020-03-21 19:21:58 +00:00
|
|
|
type = types.listOf types.str;
|
2018-10-02 01:17:17 +01:00
|
|
|
default = [];
|
2020-03-21 19:21:58 +00:00
|
|
|
example = [ "x86_64-linux" "aarch64-linux" ];
|
2018-10-02 01:17:17 +01:00
|
|
|
description = ''
|
|
|
|
The system types the build machine can execute derivations on.
|
2020-03-21 19:21:58 +00:00
|
|
|
Either this attribute or <varname>system</varname> must be
|
|
|
|
present, where <varname>system</varname> takes precedence if
|
|
|
|
both are set.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
sshUser = mkOption {
|
|
|
|
type = types.nullOr types.str;
|
|
|
|
default = null;
|
|
|
|
example = "builder";
|
|
|
|
description = ''
|
|
|
|
The username to log in as on the remote host. This user must be
|
|
|
|
able to log in and run nix commands non-interactively. It must
|
|
|
|
also be privileged to build derivations, so must be included in
|
|
|
|
<option>nix.trustedUsers</option>.
|
2018-10-02 01:17:17 +01:00
|
|
|
'';
|
|
|
|
};
|
|
|
|
sshKey = mkOption {
|
2020-03-21 19:21:58 +00:00
|
|
|
type = types.nullOr types.str;
|
|
|
|
default = null;
|
|
|
|
example = "/root/.ssh/id_buildhost_builduser";
|
2018-10-02 01:17:17 +01:00
|
|
|
description = ''
|
2020-03-21 19:21:58 +00:00
|
|
|
The path to the SSH private key with which to authenticate on
|
|
|
|
the build machine. The private key must not have a passphrase.
|
|
|
|
If null, the building user (root on NixOS machines) must have an
|
|
|
|
appropriate ssh configuration to log in non-interactively.
|
|
|
|
|
|
|
|
Note that for security reasons, this path must point to a file
|
|
|
|
in the local filesystem, *not* to the nix store.
|
2018-10-02 01:17:17 +01:00
|
|
|
'';
|
|
|
|
};
|
|
|
|
maxJobs = mkOption {
|
|
|
|
type = types.int;
|
|
|
|
default = 1;
|
|
|
|
description = ''
|
|
|
|
The number of concurrent jobs the build machine supports. The
|
2020-03-21 19:21:58 +00:00
|
|
|
build machine will enforce its own limits, but this allows hydra
|
2018-10-02 01:17:17 +01:00
|
|
|
to schedule better since there is no work-stealing between build
|
|
|
|
machines.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
speedFactor = mkOption {
|
|
|
|
type = types.int;
|
|
|
|
default = 1;
|
|
|
|
description = ''
|
2020-03-21 19:21:58 +00:00
|
|
|
The relative speed of this builder. This is an arbitrary integer
|
|
|
|
that indicates the speed of this builder, relative to other
|
|
|
|
builders. Higher is faster.
|
2018-10-02 01:17:17 +01:00
|
|
|
'';
|
|
|
|
};
|
2020-03-21 19:21:58 +00:00
|
|
|
mandatoryFeatures = mkOption {
|
|
|
|
type = types.listOf types.str;
|
2018-10-02 01:17:17 +01:00
|
|
|
default = [];
|
2020-03-21 19:21:58 +00:00
|
|
|
example = [ "big-parallel" ];
|
|
|
|
description = ''
|
|
|
|
A list of features mandatory for this builder. The builder will
|
|
|
|
be ignored for derivations that don't require all features in
|
|
|
|
this list. All mandatory features are automatically included in
|
|
|
|
<varname>supportedFeatures</varname>.
|
2018-10-02 01:17:17 +01:00
|
|
|
'';
|
|
|
|
};
|
2020-03-21 19:21:58 +00:00
|
|
|
supportedFeatures = mkOption {
|
|
|
|
type = types.listOf types.str;
|
2018-10-02 01:17:17 +01:00
|
|
|
default = [];
|
2020-03-21 19:21:58 +00:00
|
|
|
example = [ "kvm" "big-parallel" ];
|
|
|
|
description = ''
|
|
|
|
A list of features supported by this builder. The builder will
|
|
|
|
be ignored for derivations that require features not in this
|
|
|
|
list.
|
2018-10-02 01:17:17 +01:00
|
|
|
'';
|
|
|
|
};
|
|
|
|
};
|
|
|
|
}));
|
2013-10-16 09:53:23 +01:00
|
|
|
default = [];
|
|
|
|
description = ''
|
2020-03-21 19:21:58 +00:00
|
|
|
This option lists the machines to be used if distributed builds are
|
|
|
|
enabled (see <option>nix.distributedBuilds</option>).
|
|
|
|
Nix will perform derivations on those machines via SSH by copying the
|
|
|
|
inputs to the Nix store on the remote machine, starting the build,
|
|
|
|
then copying the output back to the local Nix store.
|
2013-10-16 09:53:23 +01:00
|
|
|
'';
|
2009-03-06 12:25:51 +00:00
|
|
|
};
|
2011-09-14 19:20:50 +01:00
|
|
|
|
2013-09-18 04:18:34 +01:00
|
|
|
# Environment variables for running Nix.
|
2009-03-06 12:25:51 +00:00
|
|
|
envVars = mkOption {
|
2013-10-30 16:37:45 +00:00
|
|
|
type = types.attrs;
|
2009-03-06 12:25:51 +00:00
|
|
|
internal = true;
|
2012-06-19 04:31:07 +01:00
|
|
|
default = {};
|
|
|
|
description = "Environment variables used by Nix.";
|
2009-03-06 12:25:51 +00:00
|
|
|
};
|
2010-03-11 16:50:08 +00:00
|
|
|
|
|
|
|
nrBuildUsers = mkOption {
|
2013-10-30 16:37:45 +00:00
|
|
|
type = types.int;
|
2010-03-11 16:50:08 +00:00
|
|
|
description = ''
|
|
|
|
Number of <literal>nixbld</literal> user accounts created to
|
|
|
|
perform secure concurrent builds. If you receive an error
|
|
|
|
message saying that “all build users are currently in use”,
|
|
|
|
you should increase this value.
|
|
|
|
'';
|
|
|
|
};
|
2012-09-25 21:33:21 +01:00
|
|
|
|
|
|
|
readOnlyStore = mkOption {
|
2013-10-30 16:37:45 +00:00
|
|
|
type = types.bool;
|
2013-01-24 12:09:31 +00:00
|
|
|
default = true;
|
2012-09-25 21:33:21 +01:00
|
|
|
description = ''
|
|
|
|
If set, NixOS will enforce the immutability of the Nix store
|
|
|
|
by making <filename>/nix/store</filename> a read-only bind
|
|
|
|
mount. Nix will automatically make the store writable when
|
|
|
|
needed.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
2012-11-22 10:49:47 +00:00
|
|
|
binaryCaches = mkOption {
|
2013-10-30 16:37:45 +00:00
|
|
|
type = types.listOf types.str;
|
2012-11-22 10:49:47 +00:00
|
|
|
description = ''
|
|
|
|
List of binary cache URLs used to obtain pre-built binaries
|
|
|
|
of Nix packages.
|
2019-06-26 13:30:56 +01:00
|
|
|
|
|
|
|
By default https://cache.nixos.org/ is added,
|
|
|
|
to override it use <literal>lib.mkForce []</literal>.
|
2012-11-22 10:49:47 +00:00
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
trustedBinaryCaches = mkOption {
|
2013-10-30 16:37:45 +00:00
|
|
|
type = types.listOf types.str;
|
2012-11-22 10:49:47 +00:00
|
|
|
default = [ ];
|
2020-04-18 21:51:19 +01:00
|
|
|
example = [ "https://hydra.nixos.org/" ];
|
2012-11-22 10:49:47 +00:00
|
|
|
description = ''
|
|
|
|
List of binary cache URLs that non-root users can use (in
|
|
|
|
addition to those specified using
|
2016-08-23 11:59:17 +01:00
|
|
|
<option>nix.binaryCaches</option>) by passing
|
2012-11-22 10:49:47 +00:00
|
|
|
<literal>--option binary-caches</literal> to Nix commands.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
2015-02-19 13:15:02 +00:00
|
|
|
requireSignedBinaryCaches = mkOption {
|
|
|
|
type = types.bool;
|
2015-07-27 18:28:41 +01:00
|
|
|
default = true;
|
2015-02-19 13:15:02 +00:00
|
|
|
description = ''
|
2016-03-07 19:48:14 +00:00
|
|
|
If enabled (the default), Nix will only download binaries from binary caches if
|
|
|
|
they are cryptographically signed with any of the keys listed in
|
|
|
|
<option>nix.binaryCachePublicKeys</option>. If disabled, signatures are neither
|
|
|
|
required nor checked, so it's strongly recommended that you use only
|
|
|
|
trustworthy caches and https to prevent man-in-the-middle attacks.
|
2015-02-19 13:15:02 +00:00
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
binaryCachePublicKeys = mkOption {
|
|
|
|
type = types.listOf types.str;
|
|
|
|
example = [ "hydra.nixos.org-1:CNHJZBh9K4tP3EKF6FkkgeVYsS3ohTl+oS0Qa8bezVs=" ];
|
|
|
|
description = ''
|
|
|
|
List of public keys used to sign binary caches. If
|
|
|
|
<option>nix.requireSignedBinaryCaches</option> is enabled,
|
|
|
|
then Nix will use a binary from a binary cache if and only
|
|
|
|
if it is signed by <emphasis>any</emphasis> of the keys
|
|
|
|
listed here. By default, only the key for
|
|
|
|
<uri>cache.nixos.org</uri> is included.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
2015-06-26 17:33:01 +01:00
|
|
|
trustedUsers = mkOption {
|
|
|
|
type = types.listOf types.str;
|
|
|
|
default = [ "root" ];
|
|
|
|
example = [ "root" "alice" "@wheel" ];
|
|
|
|
description = ''
|
|
|
|
A list of names of users that have additional rights when
|
|
|
|
connecting to the Nix daemon, such as the ability to specify
|
|
|
|
additional binary caches, or to import unsigned NARs. You
|
|
|
|
can also specify groups by prefixing them with
|
|
|
|
<literal>@</literal>; for instance,
|
|
|
|
<literal>@wheel</literal> means all users in the wheel
|
|
|
|
group.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
allowedUsers = mkOption {
|
|
|
|
type = types.listOf types.str;
|
|
|
|
default = [ "*" ];
|
|
|
|
example = [ "@wheel" "@builders" "alice" "bob" ];
|
|
|
|
description = ''
|
|
|
|
A list of names of users (separated by whitespace) that are
|
|
|
|
allowed to connect to the Nix daemon. As with
|
|
|
|
<option>nix.trustedUsers</option>, you can specify groups by
|
|
|
|
prefixing them with <literal>@</literal>. Also, you can
|
|
|
|
allow all users by specifying <literal>*</literal>. The
|
|
|
|
default is <literal>*</literal>. Note that trusted users are
|
|
|
|
always allowed to connect.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
2015-08-05 11:03:19 +01:00
|
|
|
nixPath = mkOption {
|
|
|
|
type = types.listOf types.str;
|
|
|
|
default =
|
2018-04-02 20:02:43 +01:00
|
|
|
[
|
2018-05-21 21:41:03 +01:00
|
|
|
"nixpkgs=/nix/var/nix/profiles/per-user/root/channels/nixos"
|
2015-08-05 11:03:19 +01:00
|
|
|
"nixos-config=/etc/nixos/configuration.nix"
|
|
|
|
"/nix/var/nix/profiles/per-user/root/channels"
|
|
|
|
];
|
|
|
|
description = ''
|
|
|
|
The default Nix expression search path, used by the Nix
|
|
|
|
evaluator to look up paths enclosed in angle brackets
|
|
|
|
(e.g. <literal><nixpkgs></literal>).
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
2019-04-21 18:06:50 +01:00
|
|
|
systemFeatures = mkOption {
|
|
|
|
type = types.listOf types.str;
|
|
|
|
example = [ "kvm" "big-parallel" "gccarch-skylake" ];
|
|
|
|
description = ''
|
|
|
|
The supported features of a machine
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
2018-04-24 15:19:45 +01:00
|
|
|
checkConfig = mkOption {
|
|
|
|
type = types.bool;
|
|
|
|
default = true;
|
|
|
|
description = ''
|
|
|
|
If enabled (the default), checks that Nix can parse the generated nix.conf.
|
|
|
|
'';
|
|
|
|
};
|
2020-04-02 17:01:45 +01:00
|
|
|
|
|
|
|
registry = mkOption {
|
|
|
|
type = types.attrsOf (types.submodule (
|
|
|
|
let
|
|
|
|
inputAttrs = types.attrsOf (types.oneOf [types.str types.int types.bool types.package]);
|
|
|
|
in
|
|
|
|
{ config, name, ... }:
|
|
|
|
{ options = {
|
|
|
|
from = mkOption {
|
|
|
|
type = inputAttrs;
|
|
|
|
example = { type = "indirect"; id = "nixpkgs"; };
|
|
|
|
description = "The flake reference to be rewritten.";
|
|
|
|
};
|
|
|
|
to = mkOption {
|
|
|
|
type = inputAttrs;
|
|
|
|
example = { type = "github"; owner = "my-org"; repo = "my-nixpkgs"; };
|
|
|
|
description = "The flake reference to which <option>from></option> is to be rewritten.";
|
|
|
|
};
|
|
|
|
flake = mkOption {
|
2021-07-28 13:54:00 +01:00
|
|
|
type = types.nullOr types.attrs;
|
2020-04-02 17:01:45 +01:00
|
|
|
default = null;
|
2021-10-03 17:06:03 +01:00
|
|
|
example = literalExpression "nixpkgs";
|
2020-04-02 17:01:45 +01:00
|
|
|
description = ''
|
|
|
|
The flake input to which <option>from></option> is to be rewritten.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
exact = mkOption {
|
|
|
|
type = types.bool;
|
|
|
|
default = true;
|
|
|
|
description = ''
|
|
|
|
Whether the <option>from</option> reference needs to match exactly. If set,
|
|
|
|
a <option>from</option> reference like <literal>nixpkgs</literal> does not
|
|
|
|
match with a reference like <literal>nixpkgs/nixos-20.03</literal>.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
};
|
|
|
|
config = {
|
|
|
|
from = mkDefault { type = "indirect"; id = name; };
|
|
|
|
to = mkIf (config.flake != null)
|
|
|
|
({ type = "path";
|
|
|
|
path = config.flake.outPath;
|
|
|
|
} // lib.filterAttrs
|
|
|
|
(n: v: n == "lastModified" || n == "rev" || n == "revCount" || n == "narHash")
|
|
|
|
config.flake);
|
|
|
|
};
|
|
|
|
}
|
|
|
|
));
|
|
|
|
default = {};
|
|
|
|
description = ''
|
|
|
|
A system-wide flake registry.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
2009-03-06 12:25:51 +00:00
|
|
|
};
|
2012-11-22 10:49:47 +00:00
|
|
|
|
2009-03-06 12:25:51 +00:00
|
|
|
};
|
2009-05-28 13:56:56 +01:00
|
|
|
|
2009-03-06 12:25:51 +00:00
|
|
|
|
2009-09-17 17:22:26 +01:00
|
|
|
###### implementation
|
2009-03-06 12:25:51 +00:00
|
|
|
|
2021-04-24 22:02:15 +01:00
|
|
|
config = mkIf cfg.enable {
|
2009-03-06 12:25:51 +00:00
|
|
|
|
2015-02-19 13:15:02 +00:00
|
|
|
nix.binaryCachePublicKeys = [ "cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY=" ];
|
2019-06-26 13:30:56 +01:00
|
|
|
nix.binaryCaches = [ "https://cache.nixos.org/" ];
|
2015-02-19 13:15:02 +00:00
|
|
|
|
2020-06-04 13:18:18 +01:00
|
|
|
environment.systemPackages =
|
|
|
|
[ nix
|
|
|
|
pkgs.nix-info
|
|
|
|
]
|
2021-11-26 07:16:08 +00:00
|
|
|
++ optional (config.programs.bash.enableCompletion) pkgs.nix-bash-completions;
|
2020-06-04 13:18:18 +01:00
|
|
|
|
2013-02-26 02:15:29 +00:00
|
|
|
environment.etc."nix/nix.conf".source = nixConf;
|
|
|
|
|
2020-04-02 17:01:45 +01:00
|
|
|
environment.etc."nix/registry.json".text = builtins.toJSON {
|
|
|
|
version = 2;
|
|
|
|
flakes = mapAttrsToList (n: v: { inherit (v) from to exact; }) cfg.registry;
|
|
|
|
};
|
|
|
|
|
2013-02-26 02:15:29 +00:00
|
|
|
# List of machines for distributed Nix builds in the format
|
|
|
|
# expected by build-remote.pl.
|
2013-10-16 09:57:25 +01:00
|
|
|
environment.etc."nix/machines" =
|
2013-10-16 09:53:23 +01:00
|
|
|
{ enable = cfg.buildMachines != [];
|
2013-02-26 02:15:29 +00:00
|
|
|
text =
|
|
|
|
concatMapStrings (machine:
|
2018-10-02 01:17:17 +01:00
|
|
|
"${if machine.sshUser != null then "${machine.sshUser}@" else ""}${machine.hostName} "
|
|
|
|
+ (if machine.system != null then machine.system else concatStringsSep "," machine.systems)
|
2020-03-21 19:21:58 +00:00
|
|
|
+ " ${if machine.sshKey != null then machine.sshKey else "-"} ${toString machine.maxJobs} "
|
2018-10-02 01:17:17 +01:00
|
|
|
+ toString (machine.speedFactor)
|
2013-07-26 04:39:44 +01:00
|
|
|
+ " "
|
2018-10-02 01:17:17 +01:00
|
|
|
+ concatStringsSep "," (machine.mandatoryFeatures ++ machine.supportedFeatures)
|
2013-07-26 04:39:44 +01:00
|
|
|
+ " "
|
2018-10-02 01:17:17 +01:00
|
|
|
+ concatStringsSep "," machine.mandatoryFeatures
|
2013-02-26 02:15:29 +00:00
|
|
|
+ "\n"
|
|
|
|
) cfg.buildMachines;
|
|
|
|
};
|
2021-04-10 06:37:00 +01:00
|
|
|
assertions =
|
|
|
|
let badMachine = m: m.system == null && m.systems == [];
|
|
|
|
in [
|
|
|
|
{
|
|
|
|
assertion = !(builtins.any badMachine cfg.buildMachines);
|
|
|
|
message = ''
|
|
|
|
At least one system type (via <varname>system</varname> or
|
|
|
|
<varname>systems</varname>) must be set for every build machine.
|
|
|
|
Invalid machine specifications:
|
|
|
|
'' + " " +
|
|
|
|
(builtins.concatStringsSep "\n "
|
|
|
|
(builtins.map (m: m.hostName)
|
|
|
|
(builtins.filter (badMachine) cfg.buildMachines)));
|
|
|
|
}
|
|
|
|
];
|
|
|
|
|
2009-09-17 17:22:26 +01:00
|
|
|
|
2014-04-17 17:52:31 +01:00
|
|
|
systemd.packages = [ nix ];
|
2009-09-17 17:22:26 +01:00
|
|
|
|
2014-04-18 13:47:02 +01:00
|
|
|
systemd.sockets.nix-daemon.wantedBy = [ "sockets.target" ];
|
|
|
|
|
2014-04-17 17:52:31 +01:00
|
|
|
systemd.services.nix-daemon =
|
2020-11-24 15:29:28 +00:00
|
|
|
{ path = [ nix pkgs.util-linux config.programs.ssh.package ]
|
2019-10-09 19:27:11 +01:00
|
|
|
++ optionals cfg.distributedBuilds [ pkgs.gzip ];
|
2011-11-25 16:32:54 +00:00
|
|
|
|
2014-11-29 19:53:13 +00:00
|
|
|
environment = cfg.envVars
|
2020-04-19 14:03:37 +01:00
|
|
|
// { CURL_CA_BUNDLE = "/etc/ssl/certs/ca-certificates.crt"; }
|
2014-11-29 19:53:13 +00:00
|
|
|
// config.networking.proxy.envVars;
|
2009-03-06 12:25:51 +00:00
|
|
|
|
2015-10-22 18:50:12 +01:00
|
|
|
unitConfig.RequiresMountsFor = "/nix/store";
|
|
|
|
|
2012-06-19 04:31:07 +01:00
|
|
|
serviceConfig =
|
2021-09-20 19:38:35 +01:00
|
|
|
{ CPUSchedulingPolicy = cfg.daemonCPUSchedPolicy;
|
|
|
|
IOSchedulingClass = cfg.daemonIOSchedClass;
|
|
|
|
IOSchedulingPriority = cfg.daemonIOSchedPriority;
|
2012-10-01 21:27:42 +01:00
|
|
|
LimitNOFILE = 4096;
|
|
|
|
};
|
2013-02-26 02:15:29 +00:00
|
|
|
|
|
|
|
restartTriggers = [ nixConf ];
|
2009-09-17 17:22:26 +01:00
|
|
|
};
|
2012-10-01 21:27:42 +01:00
|
|
|
|
2013-09-18 04:18:34 +01:00
|
|
|
# Set up the environment variables for running Nix.
|
2015-08-05 11:03:19 +01:00
|
|
|
environment.sessionVariables = cfg.envVars //
|
2018-08-15 04:10:15 +01:00
|
|
|
{ NIX_PATH = cfg.nixPath;
|
2015-08-05 11:03:19 +01:00
|
|
|
};
|
2011-09-14 19:20:50 +01:00
|
|
|
|
2019-10-09 19:27:11 +01:00
|
|
|
environment.extraInit =
|
2013-09-18 04:18:34 +01:00
|
|
|
''
|
2018-09-28 20:53:04 +01:00
|
|
|
if [ -e "$HOME/.nix-defexpr/channels" ]; then
|
|
|
|
export NIX_PATH="$HOME/.nix-defexpr/channels''${NIX_PATH:+:$NIX_PATH}"
|
|
|
|
fi
|
2009-09-17 17:22:26 +01:00
|
|
|
'';
|
|
|
|
|
2019-08-01 06:54:28 +01:00
|
|
|
nix.nrBuildUsers = mkDefault (lib.max 32 (if cfg.maxJobs == "auto" then 0 else cfg.maxJobs));
|
2015-02-16 10:57:36 +00:00
|
|
|
|
2018-06-30 00:58:35 +01:00
|
|
|
users.users = nixbldUsers;
|
2015-03-10 01:04:40 +00:00
|
|
|
|
2019-09-14 18:51:29 +01:00
|
|
|
services.xserver.displayManager.hiddenUsers = attrNames nixbldUsers;
|
2010-03-11 16:50:08 +00:00
|
|
|
|
2010-09-13 16:41:38 +01:00
|
|
|
system.activationScripts.nix = stringAfter [ "etc" "users" ]
|
|
|
|
''
|
2020-05-07 11:38:12 +01:00
|
|
|
install -m 0755 -d /nix/var/nix/{gcroots,profiles}/per-user
|
2019-10-09 19:11:51 +01:00
|
|
|
|
|
|
|
# Subscribe the root user to the NixOS channel by default.
|
|
|
|
if [ ! -e "/root/.nix-channels" ]; then
|
|
|
|
echo "${config.system.defaultChannel} nixos" > "/root/.nix-channels"
|
|
|
|
fi
|
2010-09-13 16:41:38 +01:00
|
|
|
'';
|
|
|
|
|
2019-04-30 17:28:21 +01:00
|
|
|
nix.systemFeatures = mkDefault (
|
|
|
|
[ "nixos-test" "benchmark" "big-parallel" "kvm" ] ++
|
2021-01-23 01:33:55 +00:00
|
|
|
optionals (pkgs.hostPlatform ? gcc.arch) (
|
|
|
|
# a builder can run code for `gcc.arch` and inferior architectures
|
|
|
|
[ "gccarch-${pkgs.hostPlatform.gcc.arch}" ] ++
|
|
|
|
map (x: "gccarch-${x}") lib.systems.architectures.inferiors.${pkgs.hostPlatform.gcc.arch}
|
2019-04-21 18:06:50 +01:00
|
|
|
)
|
|
|
|
);
|
|
|
|
|
2009-09-17 17:22:26 +01:00
|
|
|
};
|
2009-05-28 13:56:56 +01:00
|
|
|
|
2009-03-06 12:25:51 +00:00
|
|
|
}
|