This file https://github.com/NixOS/nixpkgs/blob/master/nixos/default.nix
{ configuration ? import ./lib/from-env.nix "NIXOS_CONFIG" <nixos-config>
, system ? builtins.currentSystem
}:
let
eval = import ./lib/eval-config.nix {
inherit system;
modules = [ configuration ];
};
in
{
inherit (eval) pkgs config options;
system = eval.config.system.build.toplevel;
inherit (eval.config.system.build) vm vmWithBootLoader;
}
This week I was working with https://github.com/astro/microvm.nix and I was trying to understand how it was creating the NixOS configurations. This lead me to the above file that pretty much receives a NixOS configuration.nix
(usually located at /etc/nixos/configuration.nix
) and generates and attribute set that the nix
cli will be used to build a system derivation. Lets go line by line and see what it does.
Inputs
{
configuration ? import ./lib/from-env.nix "NIXOS_CONFIG" <nixos-config>,
system ? builtins.currentSystem
}:
The above two inputs of a nix
function are: - configuration
which has the default value of the environment variable NIXOS_CONFIG
or <nixos-config>
which is usually passed in as a cli argument in the form of: -I nixos-config=./configuration.nix
. I know that the value <nixpkgs>
is usually a path defined in a file ~/.config
or /etc/nix
. Using the bracket notation used be much more common before nix
Flakes got introduced. - system
which is the host machine architecture ("aarch64-linux", "x86_64-linux")
let
closure
eval = import ./lib/eval-config.nix {
inherit system;
modules = [ configuration ];
};
These lines imports a nix file, which is a function that needs the arguments system
and modules
. In the end it returns the evaluated value and calls it eval
.
Returned attribute set
{
inherit (eval) pkgs config options;
system = eval.config.system.build.toplevel;
inherit (eval.config.system.build) vm vmWithBootLoader;
}
The above is an attribute set that is returned by nixpkgs/nixos/default.nix
. The attribute names are as follows:
{
pkgs = ...; # All of the packages for the determined system
config = ...; # The config of nixos
options = ...; # The options enabled of the above config
system = <originally builtins.currentSystem>;
# The following two options are used by the `nixos-rebuild build-vm` command
vm = {...};
vmWithBootLoader = {...} ;
}