nixos-rebuild: add support for --file and --attr flags
adds support of building system from nix file and attrPath directly these are --file and --attr flags in nix-build respectfully
This commit is contained in:
@@ -20,6 +20,8 @@
|
||||
.Op Fl -rollback
|
||||
.Op Fl -builders Ar builder-spec
|
||||
.br
|
||||
.Op Fl -file | f Ar path
|
||||
.Op Fl -attr | A Ar attrPath
|
||||
.Op Fl -flake Ar flake-uri
|
||||
.Op Fl -no-flake
|
||||
.Op Fl -override-input Ar input-name flake-uri
|
||||
@@ -45,11 +47,15 @@
|
||||
.Sh DESCRIPTION
|
||||
This command updates the system so that it corresponds to the
|
||||
configuration specified in
|
||||
.Pa /etc/nixos/configuration.nix
|
||||
or
|
||||
.Pa /etc/nixos/flake.nix Ns
|
||||
\&. Thus, every time you modify the configuration or any other NixOS module, you
|
||||
must run
|
||||
.Pa /etc/nixos/configuration.nix Ns
|
||||
,
|
||||
.Pa /etc/nixos/flake.nix
|
||||
or the file and attribute specified by the
|
||||
.Fl -file
|
||||
and/or
|
||||
.Fl -attr
|
||||
options. Thus, every time you modify the configuration or any other NixOS
|
||||
module, you must run
|
||||
.Nm
|
||||
to make the changes take effect. It builds the new system in
|
||||
.Pa /nix/store Ns
|
||||
@@ -369,6 +375,32 @@ system with
|
||||
.Ic sudo Ns
|
||||
\&. Setting this option allows deploying as a non-root user.
|
||||
.
|
||||
.It Fl -file Ar path , Fl f Ar path
|
||||
Enable and build the NixOS system from the specified file. The file must
|
||||
evaluate to an attribute set, and it must contain a valid NixOS configuration
|
||||
at attribute
|
||||
.Va attrPath Ns
|
||||
\&. This is useful for building a NixOS system from a nix file that is not
|
||||
a flake or a NixOS configuration module. Attribute set a with valid NixOS
|
||||
configuration can be made using
|
||||
.Va nixos
|
||||
function in nixpkgs or importing and calling
|
||||
.Pa nixos/lib/eval-config.nix
|
||||
from nixpkgs. If specified without
|
||||
.Fl -attr
|
||||
option, builds the configuration from the top-level
|
||||
attribute of the file.
|
||||
.
|
||||
.It Fl -attr Ar attrPath , Fl A Ar attrPath
|
||||
Enable and build the NixOS system from nix file and use the specified attribute
|
||||
path from file specified by the
|
||||
.Fl -file
|
||||
option. If specified without
|
||||
.Fl -file
|
||||
option, uses
|
||||
.Pa default.nix
|
||||
in current directory.
|
||||
.
|
||||
.It Fl -flake Va flake-uri Ns Op Va #name
|
||||
Build the NixOS system from the specified flake. It defaults to the directory
|
||||
containing the target of the symlink
|
||||
|
||||
@@ -34,6 +34,9 @@ targetHost=
|
||||
remoteSudo=
|
||||
verboseScript=
|
||||
noFlake=
|
||||
attr=
|
||||
buildFile=default.nix
|
||||
buildingAttribute=1
|
||||
installBootloader=
|
||||
json=
|
||||
|
||||
@@ -58,6 +61,24 @@ while [ "$#" -gt 0 ]; do
|
||||
if [ -n "$action" ]; then showSyntax; fi
|
||||
action="$i"
|
||||
;;
|
||||
--file|-f)
|
||||
if [ -z "$1" ]; then
|
||||
log "$0: '$i' requires an argument"
|
||||
exit 1
|
||||
fi
|
||||
buildFile="$1"
|
||||
buildingAttribute=
|
||||
shift 1
|
||||
;;
|
||||
--attr|-A)
|
||||
if [ -z "$1" ]; then
|
||||
log "$0: '$i' requires an argument"
|
||||
exit 1
|
||||
fi
|
||||
attr="$1"
|
||||
buildingAttribute=
|
||||
shift 1
|
||||
;;
|
||||
--install-grub)
|
||||
log "$0: --install-grub deprecated, use --install-bootloader instead"
|
||||
installBootloader=1
|
||||
@@ -345,6 +366,12 @@ if [[ "$action" = switch || "$action" = boot || "$action" = test ]]; then
|
||||
canRun=1
|
||||
fi
|
||||
|
||||
# Verify that user is not trying to use attribute building and flake
|
||||
# at the same time
|
||||
if [[ -z $buildingAttribute && -n $flake ]]; then
|
||||
log "error: '--flake' cannot be used with '--file' or '--attr'"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# If ‘--upgrade’ or `--upgrade-all` is given,
|
||||
# run ‘nix-channel --update nixos’.
|
||||
@@ -426,7 +453,10 @@ trap cleanup EXIT
|
||||
|
||||
# Re-execute nixos-rebuild from the Nixpkgs tree.
|
||||
if [[ -z $_NIXOS_REBUILD_REEXEC && -n $canRun && -z $fast ]]; then
|
||||
if [[ -z $flake ]]; then
|
||||
if [[ -z $buildingAttribute ]]; then
|
||||
p=$(runCmd nix-build --no-out-link $buildFile -A "${attr:+$attr.}config.system.build.nixos-rebuild" "${extraBuildFlags[@]}")
|
||||
SHOULD_REEXEC=1
|
||||
elif [[ -z $flake ]]; then
|
||||
if p=$(runCmd nix-build --no-out-link --expr 'with import <nixpkgs/nixos> {}; config.system.build.nixos-rebuild' "${extraBuildFlags[@]}"); then
|
||||
SHOULD_REEXEC=1
|
||||
fi
|
||||
@@ -448,7 +478,10 @@ fi
|
||||
|
||||
# Find configuration.nix and open editor instead of building.
|
||||
if [ "$action" = edit ]; then
|
||||
if [[ -z $flake ]]; then
|
||||
if [[ -n $attr || -n $buildFile ]]; then
|
||||
log "error: '--file' and '--attr' are not supported with 'edit'"
|
||||
exit 1
|
||||
elif [[ -z $flake ]]; then
|
||||
NIXOS_CONFIG=${NIXOS_CONFIG:-$(runCmd nix-instantiate --find-file nixos-config)}
|
||||
if [[ -d $NIXOS_CONFIG ]]; then
|
||||
NIXOS_CONFIG=$NIXOS_CONFIG/default.nix
|
||||
@@ -493,6 +526,9 @@ prebuiltNix() {
|
||||
getNixDrv() {
|
||||
nixDrv=
|
||||
|
||||
if [[ -z $buildingAttribute ]]; then
|
||||
if nixDrv="$(runCmd nix-instantiate $buildFile --add-root "$tmpDir/nix.drv" --indirect -A ${attr:+$attr.}config.nix.package.out "${extraBuildFlags[@]}")"; then return; fi
|
||||
fi
|
||||
if nixDrv="$(runCmd nix-instantiate '<nixpkgs/nixos>' --add-root "$tmpDir/nix.drv" --indirect -A config.nix.package.out "${extraBuildFlags[@]}")"; then return; fi
|
||||
if nixDrv="$(runCmd nix-instantiate '<nixpkgs>' --add-root "$tmpDir/nix.drv" --indirect -A nix "${extraBuildFlags[@]}")"; then return; fi
|
||||
|
||||
@@ -553,7 +589,9 @@ if [ "$action" = repl ]; then
|
||||
# This is a very end user command, implemented using sub-optimal means.
|
||||
# You should feel free to improve its behavior, as well as resolve tech
|
||||
# debt in "breaking" ways. Humans adapt quite well.
|
||||
if [[ -z $flake ]]; then
|
||||
if [[ -z $buildingAttribute ]]; then
|
||||
exec nix repl --file $buildFile $attr "${extraBuildFlags[@]}"
|
||||
elif [[ -z $flake ]]; then
|
||||
exec nix repl '<nixpkgs/nixos>' "${extraBuildFlags[@]}"
|
||||
else
|
||||
if [[ -n "${lockFlags[0]}" ]]; then
|
||||
@@ -706,7 +744,9 @@ fi
|
||||
if [ -z "$rollback" ]; then
|
||||
log "building the system configuration..."
|
||||
if [[ "$action" = switch || "$action" = boot ]]; then
|
||||
if [[ -z $flake ]]; then
|
||||
if [[ -z $buildingAttribute ]]; then
|
||||
pathToConfig="$(nixBuild $buildFile -A "${attr:+$attr.}config.system.build.toplevel" "${extraBuildFlags[@]}")"
|
||||
elif [[ -z $flake ]]; then
|
||||
pathToConfig="$(nixBuild '<nixpkgs/nixos>' --no-out-link -A system "${extraBuildFlags[@]}")"
|
||||
else
|
||||
pathToConfig="$(nixFlakeBuild "$flake#$flakeAttr.config.system.build.toplevel" "${extraBuildFlags[@]}" "${lockFlags[@]}")"
|
||||
@@ -714,19 +754,25 @@ if [ -z "$rollback" ]; then
|
||||
copyToTarget "$pathToConfig"
|
||||
targetHostSudoCmd nix-env -p "$profile" --set "$pathToConfig"
|
||||
elif [[ "$action" = test || "$action" = build || "$action" = dry-build || "$action" = dry-activate ]]; then
|
||||
if [[ -z $flake ]]; then
|
||||
if [[ -z $buildingAttribute ]]; then
|
||||
pathToConfig="$(nixBuild $buildFile -A "${attr:+$attr.}config.system.build.toplevel" "${extraBuildFlags[@]}")"
|
||||
elif [[ -z $flake ]]; then
|
||||
pathToConfig="$(nixBuild '<nixpkgs/nixos>' -A system -k "${extraBuildFlags[@]}")"
|
||||
else
|
||||
pathToConfig="$(nixFlakeBuild "$flake#$flakeAttr.config.system.build.toplevel" "${extraBuildFlags[@]}" "${lockFlags[@]}")"
|
||||
fi
|
||||
elif [ "$action" = build-vm ]; then
|
||||
if [[ -z $flake ]]; then
|
||||
if [[ -z $buildingAttribute ]]; then
|
||||
pathToConfig="$(nixBuild $buildFile -A "${attr:+$attr.}config.system.build.vm" "${extraBuildFlags[@]}")"
|
||||
elif [[ -z $flake ]]; then
|
||||
pathToConfig="$(nixBuild '<nixpkgs/nixos>' -A vm -k "${extraBuildFlags[@]}")"
|
||||
else
|
||||
pathToConfig="$(nixFlakeBuild "$flake#$flakeAttr.config.system.build.vm" "${extraBuildFlags[@]}" "${lockFlags[@]}")"
|
||||
fi
|
||||
elif [ "$action" = build-vm-with-bootloader ]; then
|
||||
if [[ -z $flake ]]; then
|
||||
if [[ -z $buildingAttribute ]]; then
|
||||
pathToConfig="$(nixBuild $buildFile -A "${attr:+$attr.}config.system.build.vmWithBootLoader" "${extraBuildFlags[@]}")"
|
||||
elif [[ -z $flake ]]; then
|
||||
pathToConfig="$(nixBuild '<nixpkgs/nixos>' -A vmWithBootLoader -k "${extraBuildFlags[@]}")"
|
||||
else
|
||||
pathToConfig="$(nixFlakeBuild "$flake#$flakeAttr.config.system.build.vmWithBootLoader" "${extraBuildFlags[@]}" "${lockFlags[@]}")"
|
||||
|
||||
Reference in New Issue
Block a user