Merge pull request #254405 from lf-/jade/nix-path-flakes
nixos/flake: set up NIX_PATH and system flake registry automatically
This commit is contained in:
14
flake.nix
14
flake.nix
@@ -27,7 +27,19 @@
|
|||||||
# We set it to null, to remove the "legacy" entrypoint's
|
# We set it to null, to remove the "legacy" entrypoint's
|
||||||
# non-hermetic default.
|
# non-hermetic default.
|
||||||
system = null;
|
system = null;
|
||||||
} // args
|
|
||||||
|
modules = args.modules ++ [
|
||||||
|
# This module is injected here since it exposes the nixpkgs self-path in as
|
||||||
|
# constrained of contexts as possible to avoid more things depending on it and
|
||||||
|
# introducing unnecessary potential fragility to changes in flakes itself.
|
||||||
|
#
|
||||||
|
# See: failed attempt to make pkgs.path not copy when using flakes:
|
||||||
|
# https://github.com/NixOS/nixpkgs/pull/153594#issuecomment-1023287913
|
||||||
|
({ config, pkgs, lib, ... }: {
|
||||||
|
config.nixpkgs.flake.source = self.outPath;
|
||||||
|
})
|
||||||
|
];
|
||||||
|
} // builtins.removeAttrs args [ "modules" ]
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -20,6 +20,14 @@ In addition to numerous new and upgraded packages, this release has the followin
|
|||||||
- This can be disabled through the `environment.stub-ld.enable` option.
|
- This can be disabled through the `environment.stub-ld.enable` option.
|
||||||
- If you use `programs.nix-ld.enable`, no changes are needed. The stub will be disabled automatically.
|
- If you use `programs.nix-ld.enable`, no changes are needed. The stub will be disabled automatically.
|
||||||
|
|
||||||
|
- On flake-based NixOS configurations using `nixpkgs.lib.nixosSystem`, NixOS will automatically set `NIX_PATH` and the system-wide flake registry (`/etc/nix/registry.json`) to point `<nixpkgs>` and the unqualified flake path `nixpkgs` to the version of nixpkgs used to build the system.
|
||||||
|
|
||||||
|
This makes `nix run nixpkgs#hello` and `nix-build '<nixpkgs>' -A hello` work out of the box with no added configuration, reusing dependencies already on the system.
|
||||||
|
|
||||||
|
This may be undesirable if nix commands are not going to be run on the built system since it adds nixpkgs to the system closure. For such closure-size-constrained non-interactive systems, this setting should be disabled.
|
||||||
|
|
||||||
|
To disable this, set [nixpkgs.flake.setNixPath](#opt-nixpkgs.flake.setNixPath) and [nixpkgs.flake.setFlakeRegistry](#opt-nixpkgs.flake.setFlakeRegistry) to false.
|
||||||
|
|
||||||
- Julia environments can now be built with arbitrary packages from the ecosystem using the `.withPackages` function. For example: `julia.withPackages ["Plots"]`.
|
- Julia environments can now be built with arbitrary packages from the ecosystem using the `.withPackages` function. For example: `julia.withPackages ["Plots"]`.
|
||||||
|
|
||||||
- A new option `systemd.sysusers.enable` was added. If enabled, users and
|
- A new option `systemd.sysusers.enable` was added. If enabled, users and
|
||||||
|
|||||||
105
nixos/modules/misc/nixpkgs-flake.nix
Normal file
105
nixos/modules/misc/nixpkgs-flake.nix
Normal file
@@ -0,0 +1,105 @@
|
|||||||
|
{ config, options, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
with lib;
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.nixpkgs.flake;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.nixpkgs.flake = {
|
||||||
|
source = mkOption {
|
||||||
|
# In newer Nix versions, particularly with lazy trees, outPath of
|
||||||
|
# flakes becomes a Nix-language path object. We deliberately allow this
|
||||||
|
# to gracefully come through the interface in discussion with @roberth.
|
||||||
|
#
|
||||||
|
# See: https://github.com/NixOS/nixpkgs/pull/278522#discussion_r1460292639
|
||||||
|
type = types.nullOr (types.either types.str types.path);
|
||||||
|
|
||||||
|
default = null;
|
||||||
|
defaultText = "if (using nixpkgsFlake.lib.nixosSystem) then self.outPath else null";
|
||||||
|
|
||||||
|
example = ''builtins.fetchTarball { name = "source"; sha256 = "${lib.fakeHash}"; url = "https://github.com/nixos/nixpkgs/archive/somecommit.tar.gz"; }'';
|
||||||
|
|
||||||
|
description = mdDoc ''
|
||||||
|
The path to the nixpkgs sources used to build the system. This is automatically set up to be
|
||||||
|
the store path of the nixpkgs flake used to build the system if using
|
||||||
|
`nixpkgs.lib.nixosSystem`, and is otherwise null by default.
|
||||||
|
|
||||||
|
This can also be optionally set if the NixOS system is not built with a flake but still uses
|
||||||
|
pinned sources: set this to the store path for the nixpkgs sources used to build the system,
|
||||||
|
as may be obtained by `builtins.fetchTarball`, for example.
|
||||||
|
|
||||||
|
Note: the name of the store path must be "source" due to
|
||||||
|
<https://github.com/NixOS/nix/issues/7075>.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
setNixPath = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
|
||||||
|
default = cfg.source != null;
|
||||||
|
defaultText = "config.nixpkgs.flake.source != null";
|
||||||
|
|
||||||
|
description = mdDoc ''
|
||||||
|
Whether to set {env}`NIX_PATH` to include `nixpkgs=flake:nixpkgs` such that `<nixpkgs>`
|
||||||
|
lookups receive the version of nixpkgs that the system was built with, in concert with
|
||||||
|
{option}`nixpkgs.flake.setFlakeRegistry`.
|
||||||
|
|
||||||
|
This is on by default for NixOS configurations built with flakes.
|
||||||
|
|
||||||
|
This makes {command}`nix-build '<nixpkgs>' -A hello` work out of the box on flake systems.
|
||||||
|
|
||||||
|
Note that this option makes the NixOS closure depend on the nixpkgs sources, which may add
|
||||||
|
undesired closure size if the system will not have any nix commands run on it.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
setFlakeRegistry = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
|
||||||
|
default = cfg.source != null;
|
||||||
|
defaultText = "config.nixpkgs.flake.source != null";
|
||||||
|
|
||||||
|
description = mdDoc ''
|
||||||
|
Whether to pin nixpkgs in the system-wide flake registry (`/etc/nix/registry.json`) to the
|
||||||
|
store path of the sources of nixpkgs used to build the NixOS system.
|
||||||
|
|
||||||
|
This is on by default for NixOS configurations built with flakes.
|
||||||
|
|
||||||
|
This option makes {command}`nix run nixpkgs#hello` reuse dependencies from the system, avoid
|
||||||
|
refetching nixpkgs, and have a consistent result every time.
|
||||||
|
|
||||||
|
Note that this option makes the NixOS closure depend on the nixpkgs sources, which may add
|
||||||
|
undesired closure size if the system will not have any nix commands run on it.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = mkIf (cfg.source != null) (mkMerge [
|
||||||
|
{
|
||||||
|
assertions = [
|
||||||
|
{
|
||||||
|
assertion = cfg.setNixPath -> cfg.setFlakeRegistry;
|
||||||
|
message = ''
|
||||||
|
Setting `nixpkgs.flake.setNixPath` requires that `nixpkgs.flake.setFlakeRegistry` also
|
||||||
|
be set, since it is implemented in terms of indirection through the flake registry.
|
||||||
|
'';
|
||||||
|
}
|
||||||
|
];
|
||||||
|
}
|
||||||
|
(mkIf cfg.setFlakeRegistry {
|
||||||
|
nix.registry.nixpkgs.to = mkDefault {
|
||||||
|
type = "path";
|
||||||
|
path = cfg.source;
|
||||||
|
};
|
||||||
|
})
|
||||||
|
(mkIf cfg.setNixPath {
|
||||||
|
# N.B. This does not include nixos-config in NIX_PATH unlike modules/config/nix-channel.nix
|
||||||
|
# because we would need some kind of evil shim taking the *calling* flake's self path,
|
||||||
|
# perhaps, to ever make that work (in order to know where the Nix expr for the system came
|
||||||
|
# from and how to call it).
|
||||||
|
nix.nixPath = mkDefault ([ "nixpkgs=flake:nixpkgs" ]
|
||||||
|
++ optional config.nix.channel.enable "/nix/var/nix/profiles/per-user/root/channels");
|
||||||
|
})
|
||||||
|
]);
|
||||||
|
}
|
||||||
@@ -133,6 +133,7 @@
|
|||||||
./misc/meta.nix
|
./misc/meta.nix
|
||||||
./misc/nixops-autoluks.nix
|
./misc/nixops-autoluks.nix
|
||||||
./misc/nixpkgs.nix
|
./misc/nixpkgs.nix
|
||||||
|
./misc/nixpkgs-flake.nix
|
||||||
./misc/passthru.nix
|
./misc/passthru.nix
|
||||||
./misc/version.nix
|
./misc/version.nix
|
||||||
./misc/wordlist.nix
|
./misc/wordlist.nix
|
||||||
|
|||||||
Reference in New Issue
Block a user