2022-08-14 17:52:52 -07:00
|
|
|
|
# Based off: https://github.com/NixOS/nixpkgs/blob/master/nixos/modules/services/misc/nix-daemon.nix
|
|
|
|
|
# When making changes please try to keep it in sync and keep the diff NixOS module clean.
|
2016-12-15 13:26:22 +01:00
|
|
|
|
{ config, lib, pkgs, ... }:
|
|
|
|
|
|
|
|
|
|
with lib;
|
|
|
|
|
|
|
|
|
|
let
|
2022-08-13 12:49:34 -07:00
|
|
|
|
|
2016-12-15 13:26:22 +01:00
|
|
|
|
cfg = config.nix;
|
|
|
|
|
|
2022-08-13 14:17:44 -07:00
|
|
|
|
nixPackage = cfg.package.out;
|
2017-07-18 22:31:31 +02:00
|
|
|
|
|
2022-08-13 15:11:58 -07:00
|
|
|
|
isNixAtLeast = versionAtLeast (getVersion nixPackage);
|
|
|
|
|
|
2025-01-28 19:30:20 +00:00
|
|
|
|
configureBuildUsers = !(config.nix.settings.auto-allocate-uids or false);
|
|
|
|
|
|
2022-08-13 19:18:48 -07:00
|
|
|
|
makeNixBuildUser = nr: {
|
|
|
|
|
name = "_nixbld${toString nr}";
|
|
|
|
|
value = {
|
|
|
|
|
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
|
|
|
|
|
here except "nixbld".
|
|
|
|
|
*/
|
|
|
|
|
uid = builtins.add config.ids.uids.nixbld nr;
|
|
|
|
|
gid = config.ids.gids.nixbld;
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
nixbldUsers = listToAttrs (map makeNixBuildUser (range 1 cfg.nrBuildUsers));
|
|
|
|
|
|
2016-12-15 13:26:22 +01:00
|
|
|
|
nixConf =
|
2022-08-13 15:11:58 -07:00
|
|
|
|
assert isNixAtLeast "2.2";
|
2016-12-15 13:26:22 +01:00
|
|
|
|
let
|
2022-08-13 15:11:58 -07:00
|
|
|
|
|
|
|
|
|
mkValueString = v:
|
|
|
|
|
if v == null then ""
|
|
|
|
|
else if isInt v then toString v
|
|
|
|
|
else if isBool v then boolToString v
|
2022-08-29 15:39:16 -07:00
|
|
|
|
else if isFloat v then strings.floatToString v
|
2022-08-13 15:11:58 -07:00
|
|
|
|
else if isList v then toString v
|
|
|
|
|
else if isDerivation v then toString v
|
|
|
|
|
else if builtins.isPath v then toString v
|
|
|
|
|
else if isString v then v
|
|
|
|
|
else if isCoercibleToString v then toString v
|
|
|
|
|
else abort "The nix conf value: ${toPretty {} v} can not be encoded";
|
|
|
|
|
|
|
|
|
|
mkKeyValue = k: v: "${escape [ "=" ] k} = ${mkValueString v}";
|
|
|
|
|
|
|
|
|
|
mkKeyValuePairs = attrs: concatStringsSep "\n" (mapAttrsToList mkKeyValue attrs);
|
|
|
|
|
|
2025-02-14 16:33:12 +04:00
|
|
|
|
isExtra = key: hasPrefix "extra-" key;
|
|
|
|
|
|
2016-12-15 13:26:22 +01:00
|
|
|
|
in
|
2022-08-13 15:11:58 -07:00
|
|
|
|
pkgs.writeTextFile {
|
|
|
|
|
name = "nix.conf";
|
|
|
|
|
text = ''
|
|
|
|
|
# WARNING: this file is generated from the nix.* options in
|
2022-08-13 15:32:29 -07:00
|
|
|
|
# your nix-darwin configuration. Do not edit it!
|
2025-02-14 16:33:12 +04:00
|
|
|
|
${mkKeyValuePairs (filterAttrs (key: value: !(isExtra key)) cfg.settings)}
|
|
|
|
|
${mkKeyValuePairs (filterAttrs (key: value: isExtra key) cfg.settings)}
|
2022-08-13 15:11:58 -07:00
|
|
|
|
${cfg.extraOptions}
|
|
|
|
|
'';
|
|
|
|
|
checkPhase =
|
|
|
|
|
if pkgs.stdenv.hostPlatform != pkgs.stdenv.buildPlatform then ''
|
|
|
|
|
echo "Ignoring validation for cross-compilation"
|
2018-01-21 13:46:30 +01:00
|
|
|
|
''
|
2024-03-02 18:51:25 -06:00
|
|
|
|
else
|
|
|
|
|
let
|
|
|
|
|
showCommand = if isNixAtLeast "2.20pre" then "config show" else "show-config";
|
|
|
|
|
in
|
|
|
|
|
''
|
2022-08-13 15:11:58 -07:00
|
|
|
|
echo "Validating generated nix.conf"
|
|
|
|
|
ln -s $out ./nix.conf
|
|
|
|
|
set -e
|
|
|
|
|
set +o pipefail
|
|
|
|
|
NIX_CONF_DIR=$PWD \
|
2024-03-02 18:51:25 -06:00
|
|
|
|
${cfg.package}/bin/nix ${showCommand} ${optionalString (isNixAtLeast "2.3pre") "--no-net"} \
|
2022-08-13 15:11:58 -07:00
|
|
|
|
${optionalString (isNixAtLeast "2.4pre") "--option experimental-features nix-command"} \
|
|
|
|
|
|& sed -e 's/^warning:/error:/' \
|
|
|
|
|
| (! grep '${if cfg.checkConfig then "^error:" else "^error: unknown setting"}')
|
|
|
|
|
set -o pipefail
|
2018-01-21 13:46:30 +01:00
|
|
|
|
'';
|
2022-08-13 15:11:58 -07:00
|
|
|
|
};
|
2022-08-13 12:09:24 -07:00
|
|
|
|
|
|
|
|
|
legacyConfMappings = {
|
|
|
|
|
useSandbox = "sandbox";
|
|
|
|
|
buildCores = "cores";
|
|
|
|
|
maxJobs = "max-jobs";
|
|
|
|
|
sandboxPaths = "extra-sandbox-paths";
|
|
|
|
|
binaryCaches = "substituters";
|
|
|
|
|
trustedBinaryCaches = "trusted-substituters";
|
|
|
|
|
binaryCachePublicKeys = "trusted-public-keys";
|
|
|
|
|
autoOptimiseStore = "auto-optimise-store";
|
|
|
|
|
requireSignedBinaryCaches = "require-sigs";
|
|
|
|
|
trustedUsers = "trusted-users";
|
|
|
|
|
allowedUsers = "allowed-users";
|
|
|
|
|
# systemFeatures = "system-features";
|
|
|
|
|
};
|
2022-08-13 12:49:34 -07:00
|
|
|
|
|
2022-08-13 15:11:58 -07:00
|
|
|
|
semanticConfType = with types;
|
|
|
|
|
let
|
|
|
|
|
confAtom = nullOr
|
|
|
|
|
(oneOf [
|
|
|
|
|
bool
|
|
|
|
|
int
|
|
|
|
|
float
|
|
|
|
|
str
|
|
|
|
|
path
|
|
|
|
|
package
|
|
|
|
|
]) // {
|
|
|
|
|
description = "Nix config atom (null, bool, int, float, str, path or package)";
|
|
|
|
|
};
|
|
|
|
|
in
|
|
|
|
|
attrsOf (either confAtom (listOf confAtom));
|
|
|
|
|
|
2022-08-13 16:41:43 -07:00
|
|
|
|
# Not in NixOS module
|
|
|
|
|
nixPathType = mkOptionType {
|
|
|
|
|
name = "nix path";
|
|
|
|
|
merge = loc: defs:
|
|
|
|
|
let
|
|
|
|
|
values = flatten (map (def:
|
|
|
|
|
(map (x:
|
|
|
|
|
if isAttrs x then (mapAttrsToList nameValuePair x)
|
|
|
|
|
else if isString x then x
|
|
|
|
|
else throw "The option value `${showOption loc}` in `${def.file}` is not a attset or string.")
|
|
|
|
|
(if isList def.value then def.value else [def.value]))) defs);
|
|
|
|
|
|
|
|
|
|
namedPaths = mapAttrsToList (n: v: "${n}=${(head v).value}")
|
|
|
|
|
(zipAttrs
|
|
|
|
|
(map (x: { "${x.name}" = { inherit (x) value; }; })
|
|
|
|
|
(filter isAttrs values)));
|
|
|
|
|
|
|
|
|
|
searchPaths = unique
|
|
|
|
|
(filter isString values);
|
|
|
|
|
in
|
|
|
|
|
namedPaths ++ searchPaths;
|
|
|
|
|
};
|
|
|
|
|
|
2025-01-28 18:40:29 +00:00
|
|
|
|
handleUnmanaged = managedConfig: mkMerge [
|
|
|
|
|
(mkIf cfg.enable managedConfig)
|
|
|
|
|
(mkIf (!cfg.enable) {
|
|
|
|
|
system.activationScripts.nix-daemon.text = ''
|
|
|
|
|
# Restore unmanaged Nix daemon if present
|
|
|
|
|
unmanagedNixProfile=/nix/var/nix/profiles/default
|
|
|
|
|
if [[
|
|
|
|
|
-e /run/current-system/Library/LaunchDaemons/org.nixos.nix-daemon.plist
|
|
|
|
|
&& -e $unmanagedNixProfile/Library/LaunchDaemons/org.nixos.nix-daemon.plist
|
|
|
|
|
]]; then
|
|
|
|
|
printf >&2 'restoring unmanaged Nix daemon...\n'
|
|
|
|
|
cp \
|
|
|
|
|
"$unmanagedNixProfile/Library/LaunchDaemons/org.nixos.nix-daemon.plist" \
|
|
|
|
|
/Library/LaunchDaemons
|
|
|
|
|
launchctl load -w /Library/LaunchDaemons/org.nixos.nix-daemon.plist
|
|
|
|
|
fi
|
|
|
|
|
'';
|
|
|
|
|
})
|
|
|
|
|
];
|
|
|
|
|
|
2025-02-10 20:54:52 +00:00
|
|
|
|
managedDefault = name: default: {
|
|
|
|
|
default = if cfg.enable then default else throw ''
|
|
|
|
|
${name}: accessed when `nix.enable` is off; this is a bug in
|
|
|
|
|
nix-darwin or a third‐party module
|
|
|
|
|
'';
|
|
|
|
|
defaultText = default;
|
|
|
|
|
};
|
|
|
|
|
|
2016-12-15 13:26:22 +01:00
|
|
|
|
in
|
|
|
|
|
|
|
|
|
|
{
|
2022-08-14 13:38:11 -07:00
|
|
|
|
imports =
|
|
|
|
|
let
|
2022-10-12 08:38:06 -04:00
|
|
|
|
altOption = alt: "No `nix-darwin` equivalent to this NixOS option, consider using `${alt}` instead.";
|
2022-08-14 13:38:11 -07:00
|
|
|
|
consider = alt: "Consider using `${alt}` instead.";
|
|
|
|
|
in
|
|
|
|
|
[
|
|
|
|
|
# Only ever in NixOS
|
|
|
|
|
(mkRemovedOptionModule [ "nix" "daemonCPUSchedPolicy" ] (altOption "nix.daemonProcessType"))
|
|
|
|
|
(mkRemovedOptionModule [ "nix" "daemonIOSchedClass" ] (altOption "nix.daemonProcessType"))
|
|
|
|
|
(mkRemovedOptionModule [ "nix" "daemonIOSchedPriority" ] (altOption "nix.daemonIOLowPriority"))
|
2022-10-12 08:34:38 -04:00
|
|
|
|
(mkRemovedOptionModule [ "nix" "readOnlyStore" ] "No `nix-darwin` equivalent to this NixOS option.")
|
2022-08-14 13:38:11 -07:00
|
|
|
|
|
|
|
|
|
# Option changes in `nix-darwin`
|
|
|
|
|
(mkRemovedOptionModule [ "nix" "profile" ] "Use `nix.package` instead.")
|
|
|
|
|
(mkRemovedOptionModule [ "nix" "version" ] (consider "nix.package.version"))
|
|
|
|
|
(mkRenamedOptionModule [ "users" "nix" "configureBuildUsers" ] [ "nix" "configureBuildUsers" ])
|
|
|
|
|
(mkRenamedOptionModule [ "users" "nix" "nrBuildUsers" ] [ "nix" "nrBuildUsers" ])
|
|
|
|
|
(mkRenamedOptionModule [ "nix" "daemonIONice" ] [ "nix" "daemonIOLowPriority" ])
|
|
|
|
|
(mkRemovedOptionModule [ "nix" "daemonNiceLevel" ] (consider "nix.daemonProcessType"))
|
2025-01-28 19:30:20 +00:00
|
|
|
|
(mkRemovedOptionModule [ "nix" "useDaemon" ] ''
|
|
|
|
|
nix-darwin now only supports managing multi‐user daemon
|
|
|
|
|
installations of Nix.
|
|
|
|
|
'')
|
2025-01-28 19:30:20 +00:00
|
|
|
|
(mkRemovedOptionModule [ "nix" "configureBuildUsers" ] ''
|
|
|
|
|
nix-darwin now manages build users unconditionally when
|
|
|
|
|
`nix.enable` is on.
|
|
|
|
|
'')
|
2022-08-14 13:38:11 -07:00
|
|
|
|
] ++ mapAttrsToList (oldConf: newConf: mkRenamedOptionModule [ "nix" oldConf ] [ "nix" "settings" newConf ]) legacyConfMappings;
|
2022-08-13 12:09:24 -07:00
|
|
|
|
|
2022-08-13 12:49:34 -07:00
|
|
|
|
###### interface
|
2018-01-14 15:12:35 +01:00
|
|
|
|
|
2022-08-13 12:49:34 -07:00
|
|
|
|
options = {
|
2016-12-15 13:26:22 +01:00
|
|
|
|
|
2022-08-13 12:49:34 -07:00
|
|
|
|
nix = {
|
2016-12-15 13:26:22 +01:00
|
|
|
|
|
2025-01-28 18:40:29 +00:00
|
|
|
|
enable = lib.mkOption {
|
|
|
|
|
type = lib.types.bool;
|
|
|
|
|
default = true;
|
|
|
|
|
description = ''
|
|
|
|
|
Whether to enable Nix.
|
|
|
|
|
|
|
|
|
|
Disabling this will stop nix-darwin from managing the
|
|
|
|
|
installed version of Nix, the nix-daemon launchd daemon, and
|
|
|
|
|
the settings in {file}`/etc/nix/nix.conf`.
|
|
|
|
|
|
|
|
|
|
This allows you to use nix-darwin without it taking over your
|
|
|
|
|
system installation of Nix. Some nix-darwin functionality
|
|
|
|
|
that relies on managing the Nix installation, like the
|
|
|
|
|
`nix.*` options to adjust Nix settings or configure a Linux
|
|
|
|
|
builder, will be unavailable. You will also have to upgrade
|
|
|
|
|
Nix yourself, as nix-darwin will no longer do so.
|
|
|
|
|
|
|
|
|
|
::: {.warning}
|
|
|
|
|
If you have already removed your global system installation
|
|
|
|
|
of Nix, this will break nix-darwin and you will have to
|
|
|
|
|
reinstall Nix to fix it.
|
|
|
|
|
:::
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
2022-08-13 12:49:34 -07:00
|
|
|
|
package = mkOption {
|
2022-08-13 14:17:44 -07:00
|
|
|
|
type = types.package;
|
2025-02-10 20:54:52 +00:00
|
|
|
|
inherit (managedDefault "nix.package" pkgs.nix) default;
|
2022-08-13 14:17:44 -07:00
|
|
|
|
defaultText = literalExpression "pkgs.nix";
|
2024-04-14 23:02:32 +02:00
|
|
|
|
description = ''
|
2022-08-13 14:17:44 -07:00
|
|
|
|
This option specifies the Nix package instance to use throughout the system.
|
2022-08-13 12:49:34 -07:00
|
|
|
|
'';
|
|
|
|
|
};
|
2016-12-15 13:26:22 +01:00
|
|
|
|
|
2022-08-13 12:49:34 -07:00
|
|
|
|
distributedBuilds = mkOption {
|
|
|
|
|
type = types.bool;
|
2025-02-10 20:54:52 +00:00
|
|
|
|
inherit (managedDefault "nix.distributedBuilds" false) default defaultText;
|
2024-04-14 23:02:32 +02:00
|
|
|
|
description = ''
|
2022-08-13 12:49:34 -07:00
|
|
|
|
Whether to distribute builds to the machines listed in
|
2023-06-22 12:21:32 +01:00
|
|
|
|
{option}`nix.buildMachines`.
|
2022-08-13 12:49:34 -07:00
|
|
|
|
'';
|
|
|
|
|
};
|
2022-08-13 12:34:47 -07:00
|
|
|
|
|
2022-08-13 12:49:34 -07:00
|
|
|
|
# Not in NixOS module
|
2022-08-14 13:38:11 -07:00
|
|
|
|
daemonProcessType = mkOption {
|
|
|
|
|
type = types.enum [ "Background" "Standard" "Adaptive" "Interactive" ];
|
2025-02-10 20:54:52 +00:00
|
|
|
|
inherit (managedDefault "nix.daemonProcessType" "Standard") default defaultText;
|
2024-04-14 23:02:32 +02:00
|
|
|
|
description = ''
|
2022-08-14 13:38:11 -07:00
|
|
|
|
Nix daemon process resource limits class. These limits propagate to
|
2023-06-22 12:21:32 +01:00
|
|
|
|
build processes. `Standard` is the default process type
|
2022-08-14 13:38:11 -07:00
|
|
|
|
and will apply light resource limits, throttling its CPU usage and I/O
|
|
|
|
|
bandwidth.
|
|
|
|
|
|
2023-06-22 12:21:32 +01:00
|
|
|
|
See {command}`man launchd.plist` for explanation of other
|
2022-08-14 13:38:11 -07:00
|
|
|
|
process types.
|
2022-08-13 12:49:34 -07:00
|
|
|
|
'';
|
|
|
|
|
};
|
2022-08-13 12:34:47 -07:00
|
|
|
|
|
2022-08-13 12:49:34 -07:00
|
|
|
|
# Not in NixOS module
|
2022-08-14 13:38:11 -07:00
|
|
|
|
daemonIOLowPriority = mkOption {
|
2022-08-13 12:49:34 -07:00
|
|
|
|
type = types.bool;
|
2025-02-10 20:54:52 +00:00
|
|
|
|
inherit (managedDefault "nix.daemonIOLowPriority" false) default defaultText;
|
2024-04-14 23:02:32 +02:00
|
|
|
|
description = ''
|
2022-08-13 12:49:34 -07:00
|
|
|
|
Whether the Nix daemon process should considered to be low priority when
|
|
|
|
|
doing file system I/O.
|
|
|
|
|
'';
|
|
|
|
|
};
|
2022-08-13 12:34:47 -07:00
|
|
|
|
|
2022-08-13 12:49:34 -07:00
|
|
|
|
buildMachines = mkOption {
|
2022-08-13 15:59:31 -07:00
|
|
|
|
type = types.listOf (types.submodule {
|
|
|
|
|
options = {
|
|
|
|
|
hostName = mkOption {
|
|
|
|
|
type = types.str;
|
|
|
|
|
example = "nixbuilder.example.org";
|
2024-04-14 23:02:32 +02:00
|
|
|
|
description = ''
|
2022-08-13 15:59:31 -07:00
|
|
|
|
The hostname of the build machine.
|
|
|
|
|
'';
|
|
|
|
|
};
|
2023-06-10 13:41:13 +01:00
|
|
|
|
protocol = mkOption {
|
|
|
|
|
type = types.enum [ null "ssh" "ssh-ng" ];
|
|
|
|
|
default = "ssh";
|
|
|
|
|
example = "ssh-ng";
|
2024-04-14 23:02:32 +02:00
|
|
|
|
description = ''
|
2023-06-10 13:41:13 +01:00
|
|
|
|
The protocol used for communicating with the build machine.
|
|
|
|
|
Use `ssh-ng` if your remote builder and your
|
|
|
|
|
local Nix version support that improved protocol.
|
|
|
|
|
|
|
|
|
|
Use `null` when trying to change the special localhost builder
|
|
|
|
|
without a protocol which is for example used by hydra.
|
|
|
|
|
'';
|
|
|
|
|
};
|
2022-08-13 15:59:31 -07:00
|
|
|
|
system = mkOption {
|
|
|
|
|
type = types.nullOr types.str;
|
|
|
|
|
default = null;
|
|
|
|
|
example = "x86_64-linux";
|
2024-04-14 23:02:32 +02:00
|
|
|
|
description = ''
|
2022-08-13 15:59:31 -07:00
|
|
|
|
The system type the build machine can execute derivations on.
|
2023-06-22 12:21:32 +01:00
|
|
|
|
Either this attribute or {var}`systems` must be
|
|
|
|
|
present, where {var}`system` takes precedence if
|
2022-08-13 15:59:31 -07:00
|
|
|
|
both are set.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
systems = mkOption {
|
|
|
|
|
type = types.listOf types.str;
|
|
|
|
|
default = [ ];
|
|
|
|
|
example = [ "x86_64-linux" "aarch64-linux" ];
|
2024-04-14 23:02:32 +02:00
|
|
|
|
description = ''
|
2022-08-13 15:59:31 -07:00
|
|
|
|
The system types the build machine can execute derivations on.
|
2023-06-22 12:21:32 +01:00
|
|
|
|
Either this attribute or {var}`system` must be
|
|
|
|
|
present, where {var}`system` takes precedence if
|
2022-08-13 15:59:31 -07:00
|
|
|
|
both are set.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
sshUser = mkOption {
|
|
|
|
|
type = types.nullOr types.str;
|
|
|
|
|
default = null;
|
|
|
|
|
example = "builder";
|
2024-04-14 23:02:32 +02:00
|
|
|
|
description = ''
|
2022-08-13 15:59:31 -07:00
|
|
|
|
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
|
2023-06-22 12:21:32 +01:00
|
|
|
|
{option}`nix.settings.trusted-users`.
|
2022-08-13 15:59:31 -07:00
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
sshKey = mkOption {
|
|
|
|
|
type = types.nullOr types.str;
|
|
|
|
|
default = null;
|
|
|
|
|
example = "/root/.ssh/id_buildhost_builduser";
|
2024-04-14 23:02:32 +02:00
|
|
|
|
description = ''
|
2022-08-13 15:59:31 -07: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.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
maxJobs = mkOption {
|
|
|
|
|
type = types.int;
|
|
|
|
|
default = 1;
|
2024-04-14 23:02:32 +02:00
|
|
|
|
description = ''
|
2022-08-13 15:59:31 -07:00
|
|
|
|
The number of concurrent jobs the build machine supports. The
|
|
|
|
|
build machine will enforce its own limits, but this allows hydra
|
|
|
|
|
to schedule better since there is no work-stealing between build
|
|
|
|
|
machines.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
speedFactor = mkOption {
|
|
|
|
|
type = types.int;
|
|
|
|
|
default = 1;
|
2024-04-14 23:02:32 +02:00
|
|
|
|
description = ''
|
2022-08-13 15:59:31 -07: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.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
mandatoryFeatures = mkOption {
|
|
|
|
|
type = types.listOf types.str;
|
|
|
|
|
default = [ ];
|
|
|
|
|
example = [ "big-parallel" ];
|
2024-04-14 23:02:32 +02:00
|
|
|
|
description = ''
|
2022-08-13 15:59:31 -07:00
|
|
|
|
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
|
2023-06-22 12:21:32 +01:00
|
|
|
|
{var}`supportedFeatures`.
|
2022-08-13 15:59:31 -07:00
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
supportedFeatures = mkOption {
|
|
|
|
|
type = types.listOf types.str;
|
|
|
|
|
default = [ ];
|
|
|
|
|
example = [ "kvm" "big-parallel" ];
|
2024-04-14 23:02:32 +02:00
|
|
|
|
description = ''
|
2022-08-13 15:59:31 -07:00
|
|
|
|
A list of features supported by this builder. The builder will
|
|
|
|
|
be ignored for derivations that require features not in this
|
|
|
|
|
list.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
publicHostKey = mkOption {
|
|
|
|
|
type = types.nullOr types.str;
|
|
|
|
|
default = null;
|
2024-04-14 23:02:32 +02:00
|
|
|
|
description = ''
|
2022-08-13 15:59:31 -07:00
|
|
|
|
The (base64-encoded) public host key of this builder. The field
|
2023-06-22 12:21:32 +01:00
|
|
|
|
is calculated via {command}`base64 -w0 /etc/ssh/ssh_host_type_key.pub`.
|
2022-08-13 15:59:31 -07:00
|
|
|
|
If null, SSH will use its regular known-hosts file when connecting.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
});
|
2025-02-10 20:54:52 +00:00
|
|
|
|
inherit (managedDefault "nix.buildMachines" [ ]) default defaultText;
|
2024-04-14 23:02:32 +02:00
|
|
|
|
description = ''
|
2022-08-13 15:59:31 -07:00
|
|
|
|
This option lists the machines to be used if distributed builds are
|
2023-06-22 12:21:32 +01:00
|
|
|
|
enabled (see {option}`nix.distributedBuilds`).
|
2022-08-13 15:59:31 -07:00
|
|
|
|
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.
|
2022-08-13 12:49:34 -07:00
|
|
|
|
'';
|
|
|
|
|
};
|
2022-08-13 12:34:47 -07:00
|
|
|
|
|
2022-08-13 12:49:34 -07:00
|
|
|
|
# Environment variables for running Nix.
|
|
|
|
|
envVars = mkOption {
|
|
|
|
|
type = types.attrs;
|
|
|
|
|
internal = true;
|
2025-02-10 20:54:52 +00:00
|
|
|
|
inherit (managedDefault "nix.envVars" { }) default defaultText;
|
2024-04-14 23:02:32 +02:00
|
|
|
|
description = "Environment variables used by Nix.";
|
2022-08-13 12:49:34 -07:00
|
|
|
|
};
|
2022-08-13 12:34:47 -07:00
|
|
|
|
|
2022-08-13 19:18:48 -07:00
|
|
|
|
nrBuildUsers = mkOption {
|
|
|
|
|
type = types.int;
|
2025-02-10 20:54:52 +00:00
|
|
|
|
inherit (managedDefault "nix.nrBuildUsers" 0) default defaultText;
|
2024-04-14 23:02:32 +02:00
|
|
|
|
description = ''
|
2023-06-22 12:21:32 +01:00
|
|
|
|
Number of `nixbld` user accounts created to
|
2022-08-13 19:18:48 -07:00
|
|
|
|
perform secure concurrent builds. If you receive an error
|
|
|
|
|
message saying that “all build users are currently in use”,
|
|
|
|
|
you should increase this value.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
2024-08-03 15:00:09 +03:00
|
|
|
|
channel = {
|
|
|
|
|
enable = mkOption {
|
|
|
|
|
description = ''
|
|
|
|
|
Whether the `nix-channel` command and state files are made available on the machine.
|
|
|
|
|
|
|
|
|
|
The following files are initialized when enabled:
|
|
|
|
|
- `/nix/var/nix/profiles/per-user/root/channels`
|
|
|
|
|
- `$HOME/.nix-defexpr/channels` (on login)
|
|
|
|
|
|
|
|
|
|
Disabling this option will not remove the state files from the system.
|
|
|
|
|
'';
|
|
|
|
|
type = types.bool;
|
|
|
|
|
default = true;
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
|
2022-08-13 16:41:43 -07:00
|
|
|
|
# Definition differs substantially from NixOS module
|
2022-08-13 12:49:34 -07:00
|
|
|
|
nixPath = mkOption {
|
2022-08-13 16:41:43 -07:00
|
|
|
|
type = nixPathType;
|
2025-02-10 20:54:52 +00:00
|
|
|
|
inherit (managedDefault "nix.nixPath" (
|
|
|
|
|
lib.optionals cfg.channel.enable [
|
|
|
|
|
# Include default path <darwin-config>.
|
|
|
|
|
{ darwin-config = "${config.environment.darwinConfig}"; }
|
|
|
|
|
"/nix/var/nix/profiles/per-user/root/channels"
|
|
|
|
|
]
|
|
|
|
|
)) default;
|
2024-11-08 12:02:34 +11:00
|
|
|
|
|
2024-08-03 15:00:09 +03:00
|
|
|
|
defaultText = lib.literalExpression ''
|
|
|
|
|
lib.optionals cfg.channel.enable [
|
2022-08-13 16:41:43 -07:00
|
|
|
|
# Include default path <darwin-config>.
|
2024-08-03 15:00:09 +03:00
|
|
|
|
{ darwin-config = "''${config.environment.darwinConfig}"; }
|
2022-08-13 12:49:34 -07:00
|
|
|
|
"/nix/var/nix/profiles/per-user/root/channels"
|
2024-08-03 15:00:09 +03:00
|
|
|
|
]
|
|
|
|
|
'';
|
2024-04-14 23:02:32 +02:00
|
|
|
|
description = ''
|
2022-08-13 12:49:34 -07:00
|
|
|
|
The default Nix expression search path, used by the Nix
|
|
|
|
|
evaluator to look up paths enclosed in angle brackets
|
2023-06-22 12:21:32 +01:00
|
|
|
|
(e.g. `<nixpkgs>`).
|
2022-08-13 12:49:34 -07:00
|
|
|
|
|
|
|
|
|
Named entries can be specified using an attribute set, if an
|
|
|
|
|
entry is configured multiple times the value with the lowest
|
|
|
|
|
ordering will be used.
|
|
|
|
|
'';
|
|
|
|
|
};
|
2022-08-13 12:34:47 -07:00
|
|
|
|
|
2022-08-13 15:11:58 -07:00
|
|
|
|
checkConfig = mkOption {
|
|
|
|
|
type = types.bool;
|
2025-02-10 20:54:52 +00:00
|
|
|
|
inherit (managedDefault "nix.checkConfig" true) default defaultText;
|
2024-04-14 23:02:32 +02:00
|
|
|
|
description = ''
|
2022-08-13 15:11:58 -07:00
|
|
|
|
If enabled (the default), checks for data type mismatches and that Nix
|
|
|
|
|
can parse the generated nix.conf.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
2022-08-13 12:49:34 -07:00
|
|
|
|
registry = mkOption {
|
|
|
|
|
type = types.attrsOf (types.submodule (
|
|
|
|
|
let
|
2022-08-13 16:51:25 -07:00
|
|
|
|
referenceAttrs = with types; attrsOf (oneOf [
|
|
|
|
|
str
|
|
|
|
|
int
|
|
|
|
|
bool
|
|
|
|
|
package
|
|
|
|
|
]);
|
2022-08-13 12:49:34 -07:00
|
|
|
|
in
|
|
|
|
|
{ config, name, ... }:
|
2022-08-13 16:51:25 -07:00
|
|
|
|
{
|
|
|
|
|
options = {
|
2022-08-13 12:49:34 -07:00
|
|
|
|
from = mkOption {
|
2022-08-13 16:51:25 -07:00
|
|
|
|
type = referenceAttrs;
|
2022-08-13 12:49:34 -07:00
|
|
|
|
example = { type = "indirect"; id = "nixpkgs"; };
|
2024-04-14 23:02:32 +02:00
|
|
|
|
description = "The flake reference to be rewritten.";
|
2022-08-13 12:49:34 -07:00
|
|
|
|
};
|
|
|
|
|
to = mkOption {
|
2022-08-13 16:51:25 -07:00
|
|
|
|
type = referenceAttrs;
|
2022-08-13 12:49:34 -07:00
|
|
|
|
example = { type = "github"; owner = "my-org"; repo = "my-nixpkgs"; };
|
2024-04-14 23:02:32 +02:00
|
|
|
|
description = "The flake reference {option}`from` is rewritten to.";
|
2022-08-13 12:49:34 -07:00
|
|
|
|
};
|
|
|
|
|
flake = mkOption {
|
2022-08-13 16:51:25 -07:00
|
|
|
|
type = types.nullOr types.attrs;
|
2022-08-13 12:49:34 -07:00
|
|
|
|
default = null;
|
|
|
|
|
example = literalExpression "nixpkgs";
|
2024-04-14 23:02:32 +02:00
|
|
|
|
description = ''
|
2023-06-22 12:21:32 +01:00
|
|
|
|
The flake input {option}`from` is rewritten to.
|
2022-08-13 12:49:34 -07:00
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
exact = mkOption {
|
|
|
|
|
type = types.bool;
|
|
|
|
|
default = true;
|
2024-04-14 23:02:32 +02:00
|
|
|
|
description = ''
|
2023-06-22 12:21:32 +01:00
|
|
|
|
Whether the {option}`from` reference needs to match exactly. If set,
|
|
|
|
|
a {option}`from` reference like `nixpkgs` does not
|
|
|
|
|
match with a reference like `nixpkgs/nixos-20.03`.
|
2022-08-13 12:49:34 -07:00
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
config = {
|
|
|
|
|
from = mkDefault { type = "indirect"; id = name; };
|
2023-05-04 23:53:14 -04:00
|
|
|
|
to = mkIf (config.flake != null) (mkDefault (
|
2022-08-13 16:51:25 -07:00
|
|
|
|
{
|
|
|
|
|
type = "path";
|
|
|
|
|
path = config.flake.outPath;
|
|
|
|
|
} // filterAttrs
|
2023-05-04 23:53:14 -04:00
|
|
|
|
(n: _: n == "lastModified" || n == "rev" || n == "revCount" || n == "narHash")
|
|
|
|
|
config.flake
|
|
|
|
|
));
|
2022-08-13 12:49:34 -07:00
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
));
|
2025-02-10 20:54:52 +00:00
|
|
|
|
inherit (managedDefault "nix.registry" { }) default defaultText;
|
2024-04-14 23:02:32 +02:00
|
|
|
|
description = ''
|
2022-08-13 12:49:34 -07:00
|
|
|
|
A system-wide flake registry.
|
|
|
|
|
'';
|
|
|
|
|
};
|
2022-08-13 12:34:47 -07:00
|
|
|
|
|
2022-08-13 12:49:34 -07:00
|
|
|
|
extraOptions = mkOption {
|
|
|
|
|
type = types.lines;
|
2025-02-10 20:54:52 +00:00
|
|
|
|
inherit (managedDefault "nix.extraOptions" "") default defaultText;
|
2022-08-13 12:49:34 -07:00
|
|
|
|
example = ''
|
2022-08-13 15:32:29 -07:00
|
|
|
|
keep-outputs = true
|
|
|
|
|
keep-derivations = true
|
2022-08-13 12:49:34 -07:00
|
|
|
|
'';
|
2024-04-14 23:02:32 +02:00
|
|
|
|
description = "Additional text appended to {file}`nix.conf`.";
|
2022-08-13 12:49:34 -07:00
|
|
|
|
};
|
2022-08-13 12:34:47 -07:00
|
|
|
|
|
2022-08-13 15:11:58 -07:00
|
|
|
|
settings = mkOption {
|
|
|
|
|
type = types.submodule {
|
|
|
|
|
freeformType = semanticConfType;
|
|
|
|
|
|
|
|
|
|
options = {
|
|
|
|
|
max-jobs = mkOption {
|
|
|
|
|
type = types.either types.int (types.enum [ "auto" ]);
|
|
|
|
|
default = "auto";
|
|
|
|
|
example = 64;
|
2024-04-14 23:02:32 +02:00
|
|
|
|
description = ''
|
2022-08-13 15:11:58 -07: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).
|
|
|
|
|
'';
|
|
|
|
|
};
|
2022-08-13 12:49:34 -07:00
|
|
|
|
|
2022-08-13 15:11:58 -07:00
|
|
|
|
auto-optimise-store = mkOption {
|
|
|
|
|
type = types.bool;
|
|
|
|
|
default = false;
|
|
|
|
|
example = true;
|
2024-04-14 23:02:32 +02:00
|
|
|
|
description = ''
|
2022-08-13 15:11:58 -07:00
|
|
|
|
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.
|
2024-11-08 12:02:34 +11:00
|
|
|
|
This saves disk space. If set to false (the default), you can enable
|
|
|
|
|
{option}`nix.optimise.automatic` to run {command}`nix-store --optimise`
|
|
|
|
|
periodically to get rid of duplicate files. You can also run
|
|
|
|
|
{command}`nix-store --optimise` manually.
|
2022-08-13 15:11:58 -07:00
|
|
|
|
'';
|
|
|
|
|
};
|
2022-08-13 12:49:34 -07:00
|
|
|
|
|
2022-08-13 15:11:58 -07:00
|
|
|
|
cores = mkOption {
|
|
|
|
|
type = types.int;
|
|
|
|
|
default = 0;
|
|
|
|
|
example = 64;
|
2024-04-14 23:02:32 +02:00
|
|
|
|
description = ''
|
2022-08-13 15:11:58 -07:00
|
|
|
|
This option defines the maximum number of concurrent tasks during
|
|
|
|
|
one build. It affects, e.g., -j option for make.
|
|
|
|
|
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.
|
|
|
|
|
'';
|
|
|
|
|
};
|
2022-08-13 12:49:34 -07:00
|
|
|
|
|
2022-08-13 15:11:58 -07:00
|
|
|
|
sandbox = mkOption {
|
|
|
|
|
type = types.either types.bool (types.enum [ "relaxed" ]);
|
|
|
|
|
default = false;
|
2024-04-14 23:02:32 +02:00
|
|
|
|
description = ''
|
2022-08-13 15:11:58 -07:00
|
|
|
|
If set, Nix will perform builds in a sandboxed environment that it
|
|
|
|
|
will set up automatically for each build. This prevents impurities
|
|
|
|
|
in builds by disallowing access to dependencies outside of the Nix
|
2022-08-13 15:32:29 -07:00
|
|
|
|
store by using network and mount namespaces in a chroot environment. It
|
2022-08-13 15:11:58 -07:00
|
|
|
|
doesn't affect derivation hashes, so changing this option will not
|
|
|
|
|
trigger a rebuild of packages.
|
|
|
|
|
'';
|
|
|
|
|
};
|
2022-08-13 12:49:34 -07:00
|
|
|
|
|
2022-08-13 15:11:58 -07:00
|
|
|
|
extra-sandbox-paths = mkOption {
|
|
|
|
|
type = types.listOf types.str;
|
|
|
|
|
default = [ ];
|
|
|
|
|
example = [ "/dev" "/proc" ];
|
2024-04-14 23:02:32 +02:00
|
|
|
|
description = ''
|
2022-08-13 15:11:58 -07:00
|
|
|
|
Directories from the host filesystem to be included
|
|
|
|
|
in the sandbox.
|
|
|
|
|
'';
|
|
|
|
|
};
|
2022-08-13 12:49:34 -07:00
|
|
|
|
|
2022-08-13 15:11:58 -07:00
|
|
|
|
substituters = mkOption {
|
|
|
|
|
type = types.listOf types.str;
|
2024-04-14 23:02:32 +02:00
|
|
|
|
description = ''
|
2022-08-13 15:11:58 -07:00
|
|
|
|
List of binary cache URLs used to obtain pre-built binaries
|
|
|
|
|
of Nix packages.
|
2022-08-13 12:49:34 -07:00
|
|
|
|
|
2022-08-13 15:11:58 -07:00
|
|
|
|
By default https://cache.nixos.org/ is added.
|
|
|
|
|
'';
|
|
|
|
|
};
|
2022-08-13 12:49:34 -07:00
|
|
|
|
|
2022-08-13 15:11:58 -07:00
|
|
|
|
trusted-substituters = mkOption {
|
|
|
|
|
type = types.listOf types.str;
|
|
|
|
|
default = [ ];
|
|
|
|
|
example = [ "https://hydra.nixos.org/" ];
|
2024-04-14 23:02:32 +02:00
|
|
|
|
description = ''
|
2022-08-13 15:11:58 -07:00
|
|
|
|
List of binary cache URLs that non-root users can use (in
|
|
|
|
|
addition to those specified using
|
2023-06-22 12:21:32 +01:00
|
|
|
|
{option}`nix.settings.substituters`) by passing
|
|
|
|
|
`--option binary-caches` to Nix commands.
|
2022-08-13 15:11:58 -07:00
|
|
|
|
'';
|
|
|
|
|
};
|
2022-08-13 12:49:34 -07:00
|
|
|
|
|
2022-08-13 15:11:58 -07:00
|
|
|
|
require-sigs = mkOption {
|
|
|
|
|
type = types.bool;
|
|
|
|
|
default = true;
|
2024-04-14 23:02:32 +02:00
|
|
|
|
description = ''
|
2022-08-13 15:11:58 -07: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
|
2023-06-22 12:21:32 +01:00
|
|
|
|
{option}`nix.settings.trusted-public-keys`. If disabled, signatures are neither
|
2022-08-13 15:11:58 -07:00
|
|
|
|
required nor checked, so it's strongly recommended that you use only
|
|
|
|
|
trustworthy caches and https to prevent man-in-the-middle attacks.
|
|
|
|
|
'';
|
|
|
|
|
};
|
2022-08-13 12:49:34 -07:00
|
|
|
|
|
2022-08-13 15:11:58 -07:00
|
|
|
|
trusted-public-keys = mkOption {
|
|
|
|
|
type = types.listOf types.str;
|
|
|
|
|
example = [ "hydra.nixos.org-1:CNHJZBh9K4tP3EKF6FkkgeVYsS3ohTl+oS0Qa8bezVs=" ];
|
2024-04-14 23:02:32 +02:00
|
|
|
|
description = ''
|
2022-08-13 15:11:58 -07:00
|
|
|
|
List of public keys used to sign binary caches. If
|
2023-06-22 12:21:32 +01:00
|
|
|
|
{option}`nix.settings.trusted-public-keys` is enabled,
|
2022-08-13 15:11:58 -07:00
|
|
|
|
then Nix will use a binary from a binary cache if and only
|
2023-06-22 12:21:32 +01:00
|
|
|
|
if it is signed by *any* of the keys
|
2022-08-13 15:11:58 -07:00
|
|
|
|
listed here. By default, only the key for
|
2023-06-22 12:21:32 +01:00
|
|
|
|
`cache.nixos.org` is included.
|
2022-08-13 15:11:58 -07:00
|
|
|
|
'';
|
|
|
|
|
};
|
2022-08-13 12:49:34 -07:00
|
|
|
|
|
2022-08-13 15:11:58 -07:00
|
|
|
|
trusted-users = mkOption {
|
|
|
|
|
type = types.listOf types.str;
|
2022-08-13 15:32:29 -07:00
|
|
|
|
example = [ "root" "alice" "@admin" ];
|
2024-04-14 23:02:32 +02:00
|
|
|
|
description = ''
|
2022-08-13 15:11:58 -07:00
|
|
|
|
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
|
2023-06-22 12:21:32 +01:00
|
|
|
|
`@`; for instance,
|
|
|
|
|
`@admin` means all users in the wheel
|
2022-08-13 15:11:58 -07:00
|
|
|
|
group.
|
|
|
|
|
'';
|
|
|
|
|
};
|
2022-08-13 12:49:34 -07:00
|
|
|
|
|
2022-08-13 15:11:58 -07:00
|
|
|
|
# Not implemented yet
|
|
|
|
|
# system-features = mkOption {
|
|
|
|
|
# type = types.listOf types.str;
|
|
|
|
|
# example = [ "kvm" "big-parallel" "gccarch-skylake" ];
|
|
|
|
|
# description = ''
|
|
|
|
|
# The set of features supported by the machine. Derivations
|
|
|
|
|
# can express dependencies on system features through the
|
|
|
|
|
# <literal>requiredSystemFeatures</literal> attribute.
|
|
|
|
|
|
|
|
|
|
# By default, pseudo-features <literal>nixos-test</literal>, <literal>benchmark</literal>,
|
|
|
|
|
# and <literal>big-parallel</literal> used in Nixpkgs are set, <literal>kvm</literal>
|
|
|
|
|
# is also included in it is avaliable.
|
|
|
|
|
# '';
|
|
|
|
|
# };
|
|
|
|
|
|
|
|
|
|
allowed-users = mkOption {
|
|
|
|
|
type = types.listOf types.str;
|
|
|
|
|
default = [ "*" ];
|
2022-08-13 15:32:29 -07:00
|
|
|
|
example = [ "@admin" "@builders" "alice" "bob" ];
|
2024-04-14 23:02:32 +02:00
|
|
|
|
description = ''
|
2022-08-13 15:11:58 -07:00
|
|
|
|
A list of names of users (separated by whitespace) that are
|
|
|
|
|
allowed to connect to the Nix daemon. As with
|
2023-06-22 12:21:32 +01:00
|
|
|
|
{option}`nix.settings.trusted-users`, you can specify groups by
|
|
|
|
|
prefixing them with `@`. Also, you can
|
|
|
|
|
allow all users by specifying `*`. The
|
|
|
|
|
default is `*`. Note that trusted users are
|
2022-08-13 15:11:58 -07:00
|
|
|
|
always allowed to connect.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
};
|
2022-08-13 12:49:34 -07:00
|
|
|
|
};
|
2025-02-10 20:54:52 +00:00
|
|
|
|
inherit (managedDefault "nix.settings" { }) default defaultText;
|
2024-04-14 23:02:32 +02:00
|
|
|
|
description = ''
|
2022-08-13 15:11:58 -07:00
|
|
|
|
Configuration for Nix, see
|
2023-06-22 12:21:32 +01:00
|
|
|
|
<https://nixos.org/manual/nix/stable/#sec-conf-file>
|
2022-08-13 15:32:29 -07:00
|
|
|
|
for avalaible options.
|
2022-08-13 15:11:58 -07:00
|
|
|
|
The value declared here will be translated directly to the key-value pairs Nix expects.
|
2023-06-22 02:34:49 +01:00
|
|
|
|
|
2023-06-22 12:21:32 +01:00
|
|
|
|
Nix configurations defined under {option}`nix.*` will be translated and applied to this
|
|
|
|
|
option. In addition, configuration specified in {option}`nix.extraOptions` which will be appended
|
2022-08-13 15:11:58 -07:00
|
|
|
|
verbatim to the resulting config file.
|
|
|
|
|
'';
|
2022-08-13 12:49:34 -07:00
|
|
|
|
};
|
2022-08-13 12:34:47 -07:00
|
|
|
|
};
|
2022-08-13 12:49:34 -07:00
|
|
|
|
};
|
2022-08-13 12:34:47 -07:00
|
|
|
|
|
|
|
|
|
|
2022-08-13 12:49:34 -07:00
|
|
|
|
###### implementation
|
2016-12-15 13:26:22 +01:00
|
|
|
|
|
2025-01-28 18:40:29 +00:00
|
|
|
|
config = handleUnmanaged {
|
2022-08-13 14:17:44 -07:00
|
|
|
|
environment.systemPackages =
|
|
|
|
|
[
|
|
|
|
|
nixPackage
|
|
|
|
|
pkgs.nix-info
|
|
|
|
|
]
|
2024-09-30 16:30:50 +01:00
|
|
|
|
++ optional (config.programs.bash.completion.enable) pkgs.nix-bash-completions;
|
2018-01-13 18:18:48 +01:00
|
|
|
|
|
2016-12-15 13:26:22 +01:00
|
|
|
|
environment.etc."nix/nix.conf".source = nixConf;
|
|
|
|
|
|
2022-08-13 15:11:58 -07:00
|
|
|
|
# Not in NixOS module
|
2020-06-17 18:35:37 +02:00
|
|
|
|
environment.etc."nix/nix.conf".knownSha256Hashes = [
|
2023-06-24 13:23:04 +10:00
|
|
|
|
"7c2d80499b39256b03ee9abd3d6258343718306aca8d472c26ac32c9b0949093" # official Nix installer
|
2021-12-21 21:20:33 +01:00
|
|
|
|
"19299897fa312d9d32b3c968c2872dd143085aa727140cec51f57c59083e93b9"
|
|
|
|
|
"c4ecc3d541c163c8fcc954ccae6b8cab28c973dc283fea5995c69aaabcdf785f"
|
2023-06-24 13:23:04 +10:00
|
|
|
|
"ef78f401a9b5a42fd15e967c50da384f99ec62f9dbc66ea38f1390b46b63e1ff" # official Nix installer 2.0
|
|
|
|
|
"c06b0c6080dd1d62e61a30cfad100c0cfed2d3bcd378e296632dc3b28b31dc69" # official Nix installer as of 2.0.1
|
|
|
|
|
"ff08c12813680da98c4240328f828647b67a65ba7aa89c022bd8072cba862cf1" # official Nix installer as of 2.4
|
|
|
|
|
"f3e03d851c240c1aa7daccd144ee929f0f5971982424c868c434eb6030e961d4" # DeterminateSystems Nix installer 0.10.0
|
2023-11-16 14:26:25 +11:00
|
|
|
|
"c6080216f2a170611e339c3f46e4e1d61aaf0d8b417ad93ade8d647da1382c11" # DeterminateSystems Nix installer 0.14.0
|
2024-02-23 18:40:24 +11:00
|
|
|
|
"97f4135d262ca22d65c9554aad795c10a4491fa61b67d9c2430f4d82bbfec9a2" # DeterminateSystems Nix installer 0.15.1
|
2024-08-25 14:36:37 +10:00
|
|
|
|
"5d23e6d7015756c6f300f8cd558ec4d9234ca61deefd4f2478e91a49760b0747" # DeterminateSystems Nix installer 0.16.0
|
|
|
|
|
"e4974acb79c56148cb8e92137fa4f2de9b7356e897b332fc4e6769e8c0b83e18" # DeterminateSystems Nix installer 0.20.0
|
2024-08-27 14:07:12 -07:00
|
|
|
|
"966d22ef5bb9b56d481e8e0d5f7ca2deaf4d24c0f0fc969b2eeaa7ae0aa42907" # DeterminateSystems Nix installer 0.22.0
|
2025-01-14 22:53:19 +00:00
|
|
|
|
"53712b4335030e2dbfb46bb235f8cffcac83fea404bd32dc99417ac89e2dd7c5" # DeterminateSystems Nix installer 0.33.0
|
|
|
|
|
"6bb8d6b0dd16b44ee793a9b8382dac76c926e4c16ffb8ddd2bb4884d1ca3f811" # DeterminateSystems Nix installer 0.34.0
|
2024-07-06 18:04:06 -04:00
|
|
|
|
"24797ac05542ff8b52910efc77870faa5f9e3275097227ea4e50c430a5f72916" # lix-installer 0.17.1 with flakes
|
|
|
|
|
"b027b5cad320b5b8123d9d0db9f815c3f3921596c26dc3c471457098e4d3cc40" # lix-installer 0.17.1 without flakes
|
2020-06-17 18:35:37 +02:00
|
|
|
|
];
|
|
|
|
|
|
2020-12-22 19:44:21 +01:00
|
|
|
|
environment.etc."nix/registry.json".text = builtins.toJSON {
|
|
|
|
|
version = 2;
|
|
|
|
|
flakes = mapAttrsToList (n: v: { inherit (v) from to exact; }) cfg.registry;
|
|
|
|
|
};
|
|
|
|
|
|
2016-12-15 13:26:22 +01:00
|
|
|
|
# List of machines for distributed Nix builds in the format
|
2022-08-13 15:59:31 -07:00
|
|
|
|
# expected by build-remote.pl.
|
|
|
|
|
environment.etc."nix/machines" = mkIf (cfg.buildMachines != [ ]) {
|
|
|
|
|
text =
|
|
|
|
|
concatMapStrings
|
|
|
|
|
(machine:
|
|
|
|
|
(concatStringsSep " " ([
|
2023-06-10 13:41:13 +01:00
|
|
|
|
"${optionalString (machine.protocol != null) "${machine.protocol}://"}${optionalString (machine.sshUser != null) "${machine.sshUser}@"}${machine.hostName}"
|
2022-08-13 15:59:31 -07:00
|
|
|
|
(if machine.system != null then machine.system else if machine.systems != [ ] then concatStringsSep "," machine.systems else "-")
|
|
|
|
|
(if machine.sshKey != null then machine.sshKey else "-")
|
|
|
|
|
(toString machine.maxJobs)
|
|
|
|
|
(toString machine.speedFactor)
|
2022-10-03 12:33:21 +09:00
|
|
|
|
(let res = (machine.supportedFeatures ++ machine.mandatoryFeatures);
|
|
|
|
|
in if (res == []) then "-" else (concatStringsSep "," res))
|
|
|
|
|
(let res = machine.mandatoryFeatures;
|
|
|
|
|
in if (res == []) then "-" else (concatStringsSep "," machine.mandatoryFeatures))
|
2022-08-13 15:59:31 -07:00
|
|
|
|
]
|
|
|
|
|
++ optional (isNixAtLeast "2.4pre") (if machine.publicHostKey != null then machine.publicHostKey else "-")))
|
2016-12-15 13:26:22 +01:00
|
|
|
|
+ "\n"
|
2022-08-13 15:59:31 -07:00
|
|
|
|
)
|
|
|
|
|
cfg.buildMachines;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
assertions =
|
2022-08-13 19:18:48 -07:00
|
|
|
|
let
|
|
|
|
|
badMachine = m: m.system == null && m.systems == [ ];
|
|
|
|
|
|
|
|
|
|
# Not in NixOS module
|
|
|
|
|
createdGroups = mapAttrsToList (n: v: v.name) config.users.groups;
|
|
|
|
|
createdUsers = mapAttrsToList (n: v: v.name) config.users.users;
|
2022-08-13 15:59:31 -07:00
|
|
|
|
in
|
|
|
|
|
[
|
|
|
|
|
{
|
|
|
|
|
assertion = !(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:
|
|
|
|
|
'' + " " +
|
|
|
|
|
(concatStringsSep "\n "
|
|
|
|
|
(map (m: m.hostName)
|
|
|
|
|
(filter (badMachine) cfg.buildMachines)));
|
|
|
|
|
}
|
2022-08-13 19:18:48 -07:00
|
|
|
|
|
|
|
|
|
# Not in NixOS module
|
|
|
|
|
{ assertion = elem "nixbld" config.users.knownGroups -> elem "nixbld" createdGroups; message = "refusing to delete group nixbld in users.knownGroups, this would break nix"; }
|
2025-01-29 01:08:02 +00:00
|
|
|
|
{ assertion = elem "_nixbld1" config.users.knownUsers -> elem "_nixbld1" createdUsers; message = "refusing to delete user _nixbld1 in users.knownUsers, this would break nix"; }
|
2022-08-13 19:18:48 -07:00
|
|
|
|
{ assertion = config.users.groups ? "nixbld" -> config.users.groups.nixbld.members != []; message = "refusing to remove all members from nixbld group, this would break nix"; }
|
2024-11-08 12:02:34 +11:00
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
# Should be fixed in Lix by https://gerrit.lix.systems/c/lix/+/2100
|
2024-12-03 22:53:36 -06:00
|
|
|
|
# Lix 2.92.0 will set `VERSION_SUFFIX` to `""`; `lib.versionAtLeast "" "pre20241107"` will return `true`.
|
|
|
|
|
assertion = cfg.settings.auto-optimise-store -> (cfg.package.pname == "lix" && (isNixAtLeast "2.92.0" && versionAtLeast (strings.removePrefix "-" cfg.package.VERSION_SUFFIX) "pre20241107"));
|
2024-11-08 12:02:34 +11:00
|
|
|
|
message = "`nix.settings.auto-optimise-store` is known to corrupt the Nix Store, please use `nix.optimise.automatic` instead.";
|
|
|
|
|
}
|
2022-08-13 15:59:31 -07:00
|
|
|
|
];
|
2016-12-15 13:26:22 +01:00
|
|
|
|
|
2022-08-13 19:18:48 -07:00
|
|
|
|
# Not in NixOS module
|
|
|
|
|
warnings = [
|
|
|
|
|
(mkIf (!cfg.distributedBuilds && cfg.buildMachines != []) "nix.distributedBuilds is not enabled, build machines won't be configured.")
|
|
|
|
|
];
|
|
|
|
|
|
2022-08-13 15:43:54 -07:00
|
|
|
|
# Not in NixOS module
|
2024-08-03 19:32:20 +03:00
|
|
|
|
nix.nixPath = mkIf (config.system.stateVersion < 2) (mkDefault [
|
|
|
|
|
"darwin=$HOME/.nix-defexpr/darwin"
|
|
|
|
|
"darwin-config=$HOME/.nixpkgs/darwin-configuration.nix"
|
|
|
|
|
"/nix/var/nix/profiles/per-user/root/channels"
|
|
|
|
|
]);
|
2022-08-13 15:43:54 -07:00
|
|
|
|
|
|
|
|
|
# Set up the environment variables for running Nix.
|
2022-08-13 16:41:43 -07:00
|
|
|
|
environment.variables = cfg.envVars // { NIX_PATH = cfg.nixPath; };
|
2022-08-13 15:43:54 -07:00
|
|
|
|
|
2025-01-28 19:30:20 +00:00
|
|
|
|
environment.extraInit = mkIf cfg.channel.enable ''
|
|
|
|
|
if [ -e "$HOME/.nix-defexpr/channels" ]; then
|
|
|
|
|
export NIX_PATH="$HOME/.nix-defexpr/channels''${NIX_PATH:+:$NIX_PATH}"
|
|
|
|
|
fi
|
|
|
|
|
'';
|
2024-08-03 15:00:09 +03:00
|
|
|
|
|
|
|
|
|
environment.extraSetup = mkIf (!cfg.channel.enable) ''
|
|
|
|
|
rm --force $out/bin/nix-channel
|
|
|
|
|
'';
|
2018-01-03 20:10:24 +01:00
|
|
|
|
|
2022-08-13 19:18:48 -07:00
|
|
|
|
nix.nrBuildUsers = mkDefault (max 32 (if cfg.settings.max-jobs == "auto" then 0 else cfg.settings.max-jobs));
|
|
|
|
|
|
2025-01-28 19:30:20 +00:00
|
|
|
|
users.users = mkIf configureBuildUsers nixbldUsers;
|
2022-08-13 19:18:48 -07:00
|
|
|
|
|
|
|
|
|
# Not in NixOS module
|
2025-01-28 19:30:20 +00:00
|
|
|
|
users.groups.nixbld = mkIf configureBuildUsers {
|
2022-08-13 19:18:48 -07:00
|
|
|
|
description = "Nix build group for nix-daemon";
|
|
|
|
|
gid = config.ids.gids.nixbld;
|
|
|
|
|
members = attrNames nixbldUsers;
|
|
|
|
|
};
|
|
|
|
|
users.knownUsers =
|
|
|
|
|
let nixbldUserNames = attrNames nixbldUsers;
|
|
|
|
|
in
|
2025-01-28 19:30:20 +00:00
|
|
|
|
mkMerge [
|
2022-08-13 19:18:48 -07:00
|
|
|
|
nixbldUserNames
|
|
|
|
|
(map (removePrefix "_") nixbldUserNames) # delete old style nixbld users
|
2025-01-28 19:30:20 +00:00
|
|
|
|
];
|
|
|
|
|
users.knownGroups = [ "nixbld" ];
|
2022-08-13 19:18:48 -07:00
|
|
|
|
|
2025-01-13 15:22:01 +00:00
|
|
|
|
# The Determinate Systems installer puts user‐specified settings in
|
|
|
|
|
# `/etc/nix/nix.custom.conf` since v0.33.0. Supplement the
|
|
|
|
|
# `/etc/nix/nix.conf` hash check so that we don’t accidentally
|
|
|
|
|
# clobber user configuration.
|
|
|
|
|
#
|
|
|
|
|
# TODO: Maybe this could use a more general file placement mechanism
|
|
|
|
|
# to express that we want it deleted and know only one hash?
|
|
|
|
|
system.activationScripts.etcChecks.text = mkAfter ''
|
|
|
|
|
nixCustomConfKnownSha256Hashes=(
|
|
|
|
|
# v0.33.0
|
|
|
|
|
6787fade1cf934f82db554e78e1fc788705c2c5257fddf9b59bdd963ca6fec63
|
|
|
|
|
# v0.34.0
|
|
|
|
|
3bd68ef979a42070a44f8d82c205cfd8e8cca425d91253ec2c10a88179bb34aa
|
|
|
|
|
)
|
|
|
|
|
if [[ -e /etc/nix/nix.custom.conf ]]; then
|
|
|
|
|
nixCustomConfSha256Output=$(shasum -a 256 /etc/nix/nix.custom.conf)
|
|
|
|
|
nixCustomConfSha256Hash=''${nixCustomConfSha256Output%% *}
|
|
|
|
|
nixCustomConfIsKnown=
|
|
|
|
|
for nixCustomConfKnownSha256Hash
|
|
|
|
|
in "''${nixCustomConfKnownSha256Hashes[@]}"
|
|
|
|
|
do
|
|
|
|
|
if
|
|
|
|
|
[[ $nixCustomConfSha256Hash == "$nixCustomConfKnownSha256Hash" ]]
|
|
|
|
|
then
|
|
|
|
|
nixCustomConfIsKnown=1
|
|
|
|
|
break
|
|
|
|
|
fi
|
|
|
|
|
done
|
|
|
|
|
if [[ ! $nixCustomConfIsKnown ]]; then
|
|
|
|
|
printf >&2 '\e[1;31merror: custom settings in `/etc/nix/nix.custom.conf`, aborting activation\e[0m\n'
|
|
|
|
|
printf >&2 'You will need to migrate these to nix-darwin `nix.*` settings if you\n'
|
|
|
|
|
printf >&2 'wish to keep them. Check the manual for the appropriate settings and\n'
|
|
|
|
|
printf >&2 'add them to your system configuration, then run:\n'
|
|
|
|
|
printf >&2 '\n'
|
|
|
|
|
printf >&2 ' $ sudo mv /etc/nix/nix.custom.conf{,.before-nix-darwin}\n'
|
|
|
|
|
printf >&2 '\n'
|
|
|
|
|
printf >&2 'and activate your system again.\n'
|
|
|
|
|
exit 2
|
|
|
|
|
fi
|
|
|
|
|
fi
|
|
|
|
|
'';
|
|
|
|
|
|
2023-06-07 12:50:00 +10:00
|
|
|
|
# Unrelated to use in NixOS module
|
2025-01-13 15:22:01 +00:00
|
|
|
|
system.activationScripts.nix-daemon.text = ''
|
|
|
|
|
# Follow up on the `/etc/nix/nix.custom.conf` check.
|
|
|
|
|
# TODO: Use a more generalized file placement mechanism for this.
|
|
|
|
|
if [[ -e /etc/nix/nix.custom.conf ]]; then
|
|
|
|
|
mv /etc/nix/nix.custom.conf{,.before-nix-darwin}
|
|
|
|
|
fi
|
2025-01-28 19:30:20 +00:00
|
|
|
|
|
2023-06-07 12:50:00 +10:00
|
|
|
|
if ! diff /etc/nix/nix.conf /run/current-system/etc/nix/nix.conf &> /dev/null || ! diff /etc/nix/machines /run/current-system/etc/nix/machines &> /dev/null; then
|
2020-03-28 17:16:11 +01:00
|
|
|
|
echo "reloading nix-daemon..." >&2
|
|
|
|
|
launchctl kill HUP system/org.nixos.nix-daemon
|
2018-01-03 20:10:24 +01:00
|
|
|
|
fi
|
2020-03-28 17:16:11 +01:00
|
|
|
|
while ! nix-store --store daemon -q --hash ${pkgs.stdenv.shell} &>/dev/null; do
|
|
|
|
|
echo "waiting for nix-daemon" >&2
|
|
|
|
|
launchctl kickstart system/org.nixos.nix-daemon
|
|
|
|
|
done
|
2018-01-03 20:10:24 +01:00
|
|
|
|
'';
|
|
|
|
|
|
2022-08-13 15:11:58 -07:00
|
|
|
|
nix.settings = mkMerge [
|
|
|
|
|
{
|
|
|
|
|
trusted-public-keys = [ "cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY=" ];
|
2025-01-08 14:26:32 +11:00
|
|
|
|
trusted-users = [ "root" ];
|
2022-08-13 15:11:58 -07:00
|
|
|
|
substituters = mkAfter [ "https://cache.nixos.org/" ];
|
|
|
|
|
|
2025-01-28 19:30:20 +00:00
|
|
|
|
# Not in NixOS module
|
|
|
|
|
build-users-group = "nixbld";
|
|
|
|
|
|
2022-08-13 15:11:58 -07:00
|
|
|
|
# Not implemented yet
|
|
|
|
|
# system-features = mkDefault (
|
|
|
|
|
# [ "nixos-test" "benchmark" "big-parallel" "kvm" ] ++
|
|
|
|
|
# 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}") systems.architectures.inferiors.${pkgs.hostPlatform.gcc.arch}
|
|
|
|
|
# )
|
|
|
|
|
# );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
(mkIf (!cfg.distributedBuilds) { builders = null; })
|
|
|
|
|
|
|
|
|
|
(mkIf (isNixAtLeast "2.3pre") { sandbox-fallback = false; })
|
|
|
|
|
|
|
|
|
|
];
|
|
|
|
|
|
2016-12-15 13:26:22 +01:00
|
|
|
|
};
|
2022-08-13 12:49:34 -07:00
|
|
|
|
|
2016-12-15 13:26:22 +01:00
|
|
|
|
}
|