2009-10-12 17:27:57 +00:00
|
|
|
{ config, pkgs, ... }:
|
2009-03-06 12:25:51 +00:00
|
|
|
|
2009-05-25 17:41:03 +00:00
|
|
|
with pkgs.lib;
|
|
|
|
|
2009-03-06 12:25:51 +00:00
|
|
|
let
|
|
|
|
|
2012-06-19 03:31:07 +00:00
|
|
|
cfg = config.nix;
|
|
|
|
|
2009-09-17 16:22:26 +00:00
|
|
|
inherit (config.environment) nix;
|
2011-09-14 18:20:50 +00:00
|
|
|
|
2010-03-11 16:50:08 +00:00
|
|
|
makeNixBuildUser = nr:
|
|
|
|
{ name = "nixbld${toString nr}";
|
|
|
|
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 21:10:48 +00:00
|
|
|
here except "nixbld". */
|
2010-03-11 16:50:08 +00:00
|
|
|
uid = builtins.add config.ids.uids.nixbld nr;
|
|
|
|
group = "nixbld";
|
2010-06-02 21:10:48 +00:00
|
|
|
extraGroups = [ "nixbld" ];
|
2010-03-11 16:50:08 +00:00
|
|
|
};
|
2009-03-06 12:25:51 +00:00
|
|
|
|
2013-02-26 02:15:29 +00:00
|
|
|
nixConf =
|
|
|
|
let
|
|
|
|
# Tricky: if we're using a chroot for builds, then we need
|
|
|
|
# /bin/sh in the chroot (our own compromise to purity).
|
|
|
|
# However, since /bin/sh is a symlink to some path in the
|
|
|
|
# Nix store, which furthermore has runtime dependencies on
|
|
|
|
# other paths in the store, we need the closure of /bin/sh
|
|
|
|
# in `build-chroot-dirs' - otherwise any builder that uses
|
|
|
|
# /bin/sh won't work.
|
2013-07-23 08:00:43 +00:00
|
|
|
binshDeps = pkgs.writeReferencesToFile config.system.build.binsh;
|
2013-02-26 02:15:29 +00:00
|
|
|
in
|
|
|
|
pkgs.runCommand "nix.conf" {extraOptions = cfg.extraOptions; } ''
|
2013-07-23 08:00:43 +00:00
|
|
|
extraPaths=$(for i in $(cat ${binshDeps}); do if test -d $i; then echo $i; fi; done)
|
2013-02-26 02:15:29 +00:00
|
|
|
cat > $out <<END
|
|
|
|
# WARNING: this file is generated.
|
|
|
|
build-users-group = nixbld
|
|
|
|
build-max-jobs = ${toString (cfg.maxJobs)}
|
|
|
|
build-use-chroot = ${if cfg.useChroot then "true" else "false"}
|
|
|
|
build-chroot-dirs = ${toString cfg.chrootDirs} $(echo $extraPaths)
|
|
|
|
binary-caches = ${toString cfg.binaryCaches}
|
|
|
|
trusted-binary-caches = ${toString cfg.trustedBinaryCaches}
|
|
|
|
$extraOptions
|
|
|
|
END
|
|
|
|
'';
|
|
|
|
|
2009-09-17 16:22:26 +00:00
|
|
|
in
|
2009-05-25 17:41:03 +00:00
|
|
|
|
2009-09-17 16:22:26 +00:00
|
|
|
{
|
2009-05-25 17:41:03 +00:00
|
|
|
|
2009-09-17 16:22:26 +00:00
|
|
|
###### interface
|
|
|
|
|
|
|
|
options = {
|
|
|
|
|
|
|
|
environment.nix = mkOption {
|
2013-07-23 08:00:54 +00:00
|
|
|
default = pkgs.nix;
|
2009-09-17 16:22:26 +00:00
|
|
|
merge = mergeOneOption;
|
2012-04-23 00:41:37 +00:00
|
|
|
description = ''
|
2009-09-17 16:22:26 +00:00
|
|
|
This option specifies the Nix package instance to use throughout the system.
|
2012-04-23 00:41:37 +00:00
|
|
|
'';
|
2009-09-17 16:22:26 +00:00
|
|
|
};
|
2011-09-14 18:20:50 +00:00
|
|
|
|
2009-03-06 12:25:51 +00:00
|
|
|
nix = {
|
|
|
|
|
|
|
|
maxJobs = mkOption {
|
|
|
|
default = 1;
|
|
|
|
example = 2;
|
|
|
|
description = "
|
|
|
|
This option defines the maximum number of jobs that Nix will try
|
|
|
|
to build in parallel. The default is 1. You should generally
|
|
|
|
set it to the number of CPUs in your system (e.g., 2 on a Athlon
|
|
|
|
64 X2).
|
|
|
|
";
|
|
|
|
};
|
|
|
|
|
|
|
|
useChroot = mkOption {
|
|
|
|
default = false;
|
|
|
|
example = true;
|
|
|
|
description = "
|
|
|
|
If set, Nix will perform builds in a chroot-environment that it
|
|
|
|
will set up automatically for each build. This prevents
|
|
|
|
impurities in builds by disallowing access to dependencies
|
|
|
|
outside of the Nix store.
|
|
|
|
";
|
|
|
|
};
|
|
|
|
|
2011-03-07 08:20:24 +00:00
|
|
|
chrootDirs = mkOption {
|
|
|
|
default = [];
|
2011-03-07 08:21:39 +00:00
|
|
|
example = [ "/dev" "/proc" ];
|
|
|
|
description =
|
|
|
|
''
|
|
|
|
Directories from the host filesystem to be included
|
|
|
|
in the chroot.
|
|
|
|
'';
|
2011-03-07 08:20:24 +00:00
|
|
|
};
|
|
|
|
|
2009-03-06 12:25:51 +00:00
|
|
|
extraOptions = mkOption {
|
|
|
|
default = "";
|
|
|
|
example = "
|
|
|
|
gc-keep-outputs = true
|
|
|
|
gc-keep-derivations = true
|
|
|
|
";
|
2012-07-20 18:58:15 +00:00
|
|
|
description = "Additional text appended to <filename>nix.conf</filename>.";
|
2009-03-06 12:25:51 +00:00
|
|
|
};
|
2011-09-14 18:20:50 +00:00
|
|
|
|
2009-03-06 12:25:51 +00:00
|
|
|
distributedBuilds = mkOption {
|
|
|
|
default = false;
|
|
|
|
description = "
|
|
|
|
Whether to distribute builds to the machines listed in
|
|
|
|
<option>nix.buildMachines</option>.
|
2010-04-29 19:06:18 +00:00
|
|
|
If you know that the <option>buildMachines</option> are not
|
2010-04-28 19:52:00 +00:00
|
|
|
always available either use nixos
|
|
|
|
<command>nixos-rebuild --no-build-hook</command>
|
|
|
|
or consider managing <filename>/etc/nix.machines</filename> manually
|
|
|
|
by setting <option>manualNixMachines</option>. Then you can comment
|
|
|
|
unavailable buildmachines.
|
2009-03-06 12:25:51 +00:00
|
|
|
";
|
|
|
|
};
|
|
|
|
|
2010-02-19 09:48:24 +00:00
|
|
|
manualNixMachines = mkOption {
|
|
|
|
default = false;
|
|
|
|
description = "
|
2011-09-14 18:20:50 +00:00
|
|
|
Whether to manually manage the list of buildmachines used in distributed
|
|
|
|
builds in /etc/nix.machines.
|
2010-02-19 09:48:24 +00:00
|
|
|
";
|
|
|
|
};
|
|
|
|
|
2009-07-18 16:14:03 +00:00
|
|
|
daemonNiceLevel = mkOption {
|
2009-10-15 11:25:15 +00:00
|
|
|
default = 10;
|
2009-07-18 16:14:03 +00:00
|
|
|
description = "
|
2009-07-23 23:25:50 +00:00
|
|
|
Nix daemon process priority. This priority propagates to build processes.
|
|
|
|
0 is the default Unix process priority, 20 is the lowest.
|
2009-07-18 16:14:03 +00:00
|
|
|
";
|
|
|
|
};
|
|
|
|
|
2009-10-15 11:25:15 +00:00
|
|
|
daemonIONiceLevel = mkOption {
|
|
|
|
default = 7;
|
|
|
|
description = "
|
2011-09-14 18:20:50 +00:00
|
|
|
Nix daemon process I/O priority. This priority propagates to build processes.
|
2009-10-15 11:25:15 +00:00
|
|
|
0 is the default Unix process I/O priority, 7 is the lowest.
|
|
|
|
";
|
|
|
|
};
|
|
|
|
|
2009-03-06 12:25:51 +00:00
|
|
|
buildMachines = mkOption {
|
|
|
|
example = [
|
|
|
|
{ hostName = "voila.labs.cs.uu.nl";
|
|
|
|
sshUser = "nix";
|
|
|
|
sshKey = "/root/.ssh/id_buildfarm";
|
|
|
|
system = "powerpc-darwin";
|
|
|
|
maxJobs = 1;
|
|
|
|
}
|
|
|
|
{ hostName = "linux64.example.org";
|
|
|
|
sshUser = "buildfarm";
|
|
|
|
sshKey = "/root/.ssh/id_buildfarm";
|
|
|
|
system = "x86_64-linux";
|
|
|
|
maxJobs = 2;
|
2013-07-26 03:39:44 +00:00
|
|
|
supportedFeatures = "kvm";
|
|
|
|
mandatoryFeatures = "perf";
|
2009-03-06 12:25:51 +00:00
|
|
|
}
|
|
|
|
];
|
|
|
|
description = "
|
|
|
|
This option lists the machines to be used if distributed
|
|
|
|
builds are enabled (see
|
|
|
|
<option>nix.distributedBuilds</option>). Nix will perform
|
2013-07-26 03:39:44 +00:00
|
|
|
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. Each
|
|
|
|
element of the list should be an attribute set containing
|
|
|
|
the machine's host name (<varname>hostname</varname>), the
|
|
|
|
user name to be used for the SSH connection
|
2009-03-06 12:25:51 +00:00
|
|
|
(<varname>sshUser</varname>), the Nix system type
|
|
|
|
(<varname>system</varname>, e.g.,
|
2013-07-26 03:39:44 +00:00
|
|
|
<literal>\"i686-linux\"</literal>), the maximum number of
|
|
|
|
jobs to be run in parallel on that machine
|
|
|
|
(<varname>maxJobs</varname>), the path to the SSH private
|
|
|
|
key to be used to connect (<varname>sshKey</varname>), a
|
|
|
|
list of supported features of the machine
|
|
|
|
(<varname>supportedFeatures</varname>) and a list of
|
|
|
|
mandatory features of the machine
|
|
|
|
(<varname>mandatoryFeatures</varname>). The SSH private key
|
|
|
|
should not have a passphrase, and the corresponding public
|
|
|
|
key should be added to
|
2009-03-06 12:25:51 +00:00
|
|
|
<filename>~<replaceable>sshUser</replaceable>/authorized_keys</filename>
|
|
|
|
on the remote machine.
|
|
|
|
";
|
|
|
|
};
|
2011-09-14 18:20:50 +00:00
|
|
|
|
2009-03-06 12:25:51 +00:00
|
|
|
proxy = mkOption {
|
|
|
|
default = "";
|
|
|
|
description = "
|
2011-09-14 18:20:50 +00:00
|
|
|
This option specifies the proxy to use for fetchurl. The real effect
|
2009-03-06 12:25:51 +00:00
|
|
|
is just exporting http_proxy, https_proxy and ftp_proxy with that
|
|
|
|
value.
|
|
|
|
";
|
|
|
|
example = "http://127.0.0.1:3128";
|
|
|
|
};
|
|
|
|
|
2009-09-17 16:22:26 +00:00
|
|
|
# Environment variables for running Nix. !!! Misnomer - it's
|
|
|
|
# actually a shell script.
|
2009-03-06 12:25:51 +00:00
|
|
|
envVars = mkOption {
|
|
|
|
internal = true;
|
2012-06-19 03:31:07 +00:00
|
|
|
default = {};
|
|
|
|
type = types.attrs;
|
|
|
|
description = "Environment variables used by Nix.";
|
2009-03-06 12:25:51 +00:00
|
|
|
};
|
2010-03-11 16:50:08 +00:00
|
|
|
|
|
|
|
nrBuildUsers = mkOption {
|
|
|
|
default = 10;
|
|
|
|
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 20:33:21 +00:00
|
|
|
|
|
|
|
readOnlyStore = mkOption {
|
2013-01-24 12:09:31 +00:00
|
|
|
default = true;
|
2012-09-25 20:33:21 +00: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-06-12 12:23:33 +00:00
|
|
|
default = [ http://cache.nixos.org/ ];
|
2013-03-14 16:09:21 +00:00
|
|
|
type = types.listOf types.string;
|
2012-11-22 10:49:47 +00:00
|
|
|
description = ''
|
|
|
|
List of binary cache URLs used to obtain pre-built binaries
|
|
|
|
of Nix packages.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
trustedBinaryCaches = mkOption {
|
|
|
|
default = [ ];
|
|
|
|
example = [ http://hydra.nixos.org/ ];
|
2013-03-14 16:09:21 +00:00
|
|
|
type = types.listOf types.string;
|
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
|
|
|
|
<option>nix.binaryCaches</option> by passing
|
|
|
|
<literal>--option binary-caches</literal> to Nix commands.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
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 12:56:56 +00:00
|
|
|
|
2009-03-06 12:25:51 +00:00
|
|
|
|
2009-09-17 16:22:26 +00:00
|
|
|
###### implementation
|
2009-03-06 12:25:51 +00:00
|
|
|
|
2009-09-17 16:22:26 +00:00
|
|
|
config = {
|
2009-03-06 12:25:51 +00:00
|
|
|
|
2013-07-23 08:00:54 +00:00
|
|
|
nix.chrootDirs = [ "/dev" "/dev/pts" "/proc" "/bin" ];
|
2011-03-07 08:20:24 +00:00
|
|
|
|
2013-02-26 02:15:29 +00:00
|
|
|
environment.etc."nix/nix.conf".source = nixConf;
|
|
|
|
|
|
|
|
# List of machines for distributed Nix builds in the format
|
|
|
|
# expected by build-remote.pl.
|
|
|
|
environment.etc."nix.machines" =
|
|
|
|
{ enable = cfg.distributedBuilds && !cfg.manualNixMachines;
|
|
|
|
text =
|
|
|
|
concatMapStrings (machine:
|
|
|
|
"${machine.sshUser}@${machine.hostName} "
|
|
|
|
+ (if machine ? system then machine.system else concatStringsSep "," machine.systems)
|
|
|
|
+ " ${machine.sshKey} ${toString machine.maxJobs} "
|
|
|
|
+ (if machine ? speedFactor then toString machine.speedFactor else "1" )
|
2013-07-26 03:39:44 +00:00
|
|
|
+ " "
|
|
|
|
+ (if machine ? supportedFeatures then concatStringsSep "," machine.supportedFeatures else "" )
|
|
|
|
+ " "
|
|
|
|
+ (if machine ? mandatoryFeatures then concatStringsSep "," machine.mandatoryFeatures else "" )
|
2013-02-26 02:15:29 +00:00
|
|
|
+ "\n"
|
|
|
|
) cfg.buildMachines;
|
|
|
|
};
|
2009-09-17 16:22:26 +00:00
|
|
|
|
2013-01-16 11:33:18 +00:00
|
|
|
systemd.sockets."nix-daemon" =
|
2012-10-01 22:58:11 +00:00
|
|
|
{ description = "Nix Daemon Socket";
|
|
|
|
wantedBy = [ "sockets.target" ];
|
|
|
|
before = [ "multi-user.target" ];
|
|
|
|
socketConfig.ListenStream = "/nix/var/nix/daemon-socket/socket";
|
2012-06-19 03:31:07 +00:00
|
|
|
};
|
2012-10-01 20:27:42 +00:00
|
|
|
|
2013-01-16 11:33:18 +00:00
|
|
|
systemd.services."nix-daemon" =
|
2012-06-19 03:31:07 +00:00
|
|
|
{ description = "Nix Daemon";
|
2009-09-17 16:22:26 +00:00
|
|
|
|
2011-11-25 16:32:54 +00:00
|
|
|
path = [ nix pkgs.openssl pkgs.utillinux ]
|
2012-06-19 03:31:07 +00:00
|
|
|
++ optionals cfg.distributedBuilds [ pkgs.openssh pkgs.gzip ];
|
2011-11-25 16:32:54 +00:00
|
|
|
|
2012-06-19 03:31:07 +00:00
|
|
|
environment = cfg.envVars;
|
2009-03-06 12:25:51 +00:00
|
|
|
|
2012-06-19 03:31:07 +00:00
|
|
|
serviceConfig =
|
2013-01-24 12:34:47 +00:00
|
|
|
{ ExecStart = "@${nix}/bin/nix-daemon nix-daemon --daemon";
|
2012-10-01 20:27:42 +00:00
|
|
|
KillMode = "process";
|
|
|
|
Nice = cfg.daemonNiceLevel;
|
|
|
|
IOSchedulingPriority = cfg.daemonIONiceLevel;
|
|
|
|
LimitNOFILE = 4096;
|
|
|
|
};
|
2013-02-26 02:15:29 +00:00
|
|
|
|
|
|
|
restartTriggers = [ nixConf ];
|
2009-09-17 16:22:26 +00:00
|
|
|
};
|
2012-10-01 20:27:42 +00:00
|
|
|
|
2012-06-19 03:31:07 +00:00
|
|
|
nix.envVars =
|
|
|
|
{ NIX_CONF_DIR = "/etc/nix";
|
|
|
|
|
|
|
|
# Enable the copy-from-other-stores substituter, which allows builds
|
|
|
|
# to be sped up by copying build results from remote Nix stores. To
|
|
|
|
# do this, mount the remote file system on a subdirectory of
|
|
|
|
# /var/run/nix/remote-stores.
|
|
|
|
NIX_OTHER_STORES = "/var/run/nix/remote-stores/*/nix";
|
|
|
|
}
|
|
|
|
|
|
|
|
// optionalAttrs cfg.distributedBuilds {
|
|
|
|
NIX_BUILD_HOOK = "${config.environment.nix}/libexec/nix/build-remote.pl";
|
|
|
|
NIX_REMOTE_SYSTEMS = "/etc/nix.machines";
|
|
|
|
NIX_CURRENT_LOAD = "/var/run/nix/current-load";
|
|
|
|
}
|
|
|
|
|
|
|
|
# !!! These should not be defined here, but in some general proxy configuration module!
|
|
|
|
// optionalAttrs (cfg.proxy != "") {
|
|
|
|
http_proxy = cfg.proxy;
|
|
|
|
https_proxy = cfg.proxy;
|
|
|
|
ftp_proxy = cfg.proxy;
|
|
|
|
};
|
2009-07-16 14:51:49 +00:00
|
|
|
|
2009-09-17 16:22:26 +00:00
|
|
|
environment.shellInit =
|
|
|
|
''
|
|
|
|
# Set up the environment variables for running Nix.
|
2012-06-19 03:31:07 +00:00
|
|
|
${concatMapStrings (n: "export ${n}=\"${getAttr n cfg.envVars}\"\n") (attrNames cfg.envVars)}
|
2011-09-14 18:20:50 +00:00
|
|
|
|
2009-09-17 16:22:26 +00:00
|
|
|
# Set up secure multi-user builds: non-root users build through the
|
|
|
|
# Nix daemon.
|
|
|
|
if test "$USER" != root; then
|
|
|
|
export NIX_REMOTE=daemon
|
|
|
|
else
|
|
|
|
export NIX_REMOTE=
|
|
|
|
fi
|
|
|
|
'';
|
|
|
|
|
2012-06-19 03:31:07 +00:00
|
|
|
users.extraUsers = map makeNixBuildUser (range 1 cfg.nrBuildUsers);
|
2010-03-11 16:50:08 +00:00
|
|
|
|
2010-09-13 15:41:38 +00:00
|
|
|
system.activationScripts.nix = stringAfter [ "etc" "users" ]
|
|
|
|
''
|
|
|
|
# Nix initialisation.
|
|
|
|
mkdir -m 0755 -p \
|
2011-10-30 15:19:58 +00:00
|
|
|
/nix/var/nix/gcroots \
|
|
|
|
/nix/var/nix/temproots \
|
|
|
|
/nix/var/nix/manifests \
|
|
|
|
/nix/var/nix/userpool \
|
|
|
|
/nix/var/nix/profiles \
|
|
|
|
/nix/var/nix/db \
|
|
|
|
/nix/var/log/nix/drvs \
|
|
|
|
/nix/var/nix/channel-cache \
|
|
|
|
/nix/var/nix/chroots
|
2012-09-28 14:59:58 +00:00
|
|
|
mkdir -m 1777 -p \
|
|
|
|
/nix/var/nix/gcroots/per-user \
|
|
|
|
/nix/var/nix/profiles/per-user \
|
|
|
|
/nix/var/nix/gcroots/tmp
|
2011-10-30 15:19:58 +00:00
|
|
|
|
|
|
|
ln -sf /nix/var/nix/profiles /nix/var/nix/gcroots/
|
|
|
|
ln -sf /nix/var/nix/manifests /nix/var/nix/gcroots/
|
2010-09-13 15:41:38 +00:00
|
|
|
'';
|
|
|
|
|
2009-09-17 16:22:26 +00:00
|
|
|
};
|
2009-05-28 12:56:56 +00:00
|
|
|
|
2009-03-06 12:25:51 +00:00
|
|
|
}
|