2020-08-13 19:54:51 +00:00
#! @runtimeShell@
2021-11-29 03:48:23 +00:00
# shellcheck shell=bash
2014-04-15 09:47:41 +00:00
2020-08-13 19:54:51 +00:00
if [ -x "@runtimeShell@" ] ; then export SHELL = "@runtimeShell@" ; fi ;
2014-04-18 14:05:20 +00:00
2014-04-15 09:47:41 +00:00
set -e
2019-09-13 16:02:44 +00:00
set -o pipefail
2021-07-28 15:06:03 +00:00
shopt -s inherit_errexit
2019-09-13 16:02:44 +00:00
export PATH = @path@:$PATH
2007-02-06 13:09:25 +00:00
2007-02-06 13:12:10 +00:00
showSyntax( ) {
2013-10-11 12:05:53 +00:00
exec man nixos-rebuild
2007-02-06 13:09:25 +00:00
exit 1
2007-02-06 13:12:10 +00:00
}
2008-08-04 14:58:26 +00:00
# Parse the command line.
2014-04-15 09:47:41 +00:00
origArgs = ( " $@ " )
2021-06-10 21:20:23 +00:00
copyClosureFlags = ( )
2012-11-22 11:04:00 +00:00
extraBuildFlags = ( )
2020-02-05 15:00:58 +00:00
lockFlags = ( )
2020-09-04 04:53:00 +00:00
flakeFlags = ( )
2008-08-04 14:58:26 +00:00
action =
2009-08-03 12:36:15 +00:00
buildNix = 1
2017-02-11 13:52:23 +00:00
fast =
2009-08-19 15:04:19 +00:00
rollback =
2012-06-25 20:17:34 +00:00
upgrade =
2020-09-25 15:22:11 +00:00
upgrade_all =
2013-10-09 17:13:26 +00:00
profile = /nix/var/nix/profiles/system
2021-06-11 16:50:40 +00:00
buildHost = localhost
2016-01-11 18:41:48 +00:00
targetHost =
2021-11-03 11:37:39 +00:00
remoteSudo =
2022-03-08 15:59:45 +00:00
verboseScript =
2022-03-04 17:53:07 +00:00
noFlake =
2021-11-03 11:37:39 +00:00
# comma separated list of vars to preserve when using sudo
preservedSudoVars = NIXOS_INSTALL_BOOTLOADER
2008-08-04 14:58:26 +00:00
2022-03-22 19:39:29 +00:00
# log the given argument to stderr
log( ) {
echo " $@ " >& 2
}
2013-01-16 12:21:59 +00:00
while [ " $# " -gt 0 ] ; do
2009-08-03 12:36:15 +00:00
i = " $1 " ; shift 1
2010-01-03 13:36:23 +00:00
case " $i " in
--help)
2008-08-04 14:58:26 +00:00
showSyntax
2012-06-25 20:17:34 +00:00
; ;
2019-02-24 23:59:35 +00:00
switch| boot| test| build| edit| dry-build| dry-run| dry-activate| build-vm| build-vm-with-bootloader)
2015-03-09 15:23:23 +00:00
if [ " $i " = dry-run ] ; then i = dry-build; fi
2022-06-05 19:04:07 +00:00
# exactly one action mandatory, bail out if multiple are given
if [ -n " $action " ] ; then showSyntax; fi
2008-08-04 14:58:26 +00:00
action = " $i "
2012-06-25 20:17:34 +00:00
; ;
2010-01-03 13:36:23 +00:00
--install-grub)
2022-03-22 19:39:29 +00:00
log " $0 : --install-grub deprecated, use --install-bootloader instead "
2016-08-16 11:51:58 +00:00
export NIXOS_INSTALL_BOOTLOADER = 1
; ;
--install-bootloader)
export NIXOS_INSTALL_BOOTLOADER = 1
2012-06-25 20:17:34 +00:00
; ;
2010-01-03 13:36:23 +00:00
--no-build-nix)
2009-08-03 12:36:15 +00:00
buildNix =
2012-06-25 20:17:34 +00:00
; ;
2010-01-03 13:36:23 +00:00
--rollback)
2009-08-19 15:04:19 +00:00
rollback = 1
2012-06-25 20:17:34 +00:00
; ;
--upgrade)
upgrade = 1
; ;
2020-09-25 15:22:11 +00:00
--upgrade-all)
upgrade = 1
upgrade_all = 1
; ;
2022-01-23 13:59:30 +00:00
--use-substitutes| -s)
2021-06-10 21:20:23 +00:00
copyClosureFlags += ( " $i " )
; ;
2022-01-23 13:59:30 +00:00
-I| --max-jobs| -j| --cores| --builders)
2011-03-07 12:12:39 +00:00
j = " $1 " ; shift 1
2012-11-22 11:04:00 +00:00
extraBuildFlags += ( " $i " " $j " )
2012-06-25 20:17:34 +00:00
; ;
2022-01-23 13:59:30 +00:00
-j*| --quiet| --print-build-logs| -L| --no-build-output| -Q| --show-trace| --keep-going| -k| --keep-failed| -K| --fallback| --refresh| --repair| --impure| --offline| --no-net)
2022-03-08 15:59:45 +00:00
extraBuildFlags += ( " $i " )
; ;
--verbose| -v| -vv| -vvv| -vvvv| -vvvvv)
verboseScript = "true"
2017-02-11 12:18:17 +00:00
extraBuildFlags += ( " $i " )
; ;
2012-09-14 17:23:19 +00:00
--option)
j = " $1 " ; shift 1
k = " $1 " ; shift 1
2012-11-22 11:04:00 +00:00
extraBuildFlags += ( " $i " " $j " " $k " )
2012-09-14 17:23:19 +00:00
; ;
2010-01-03 13:36:23 +00:00
--fast)
2009-10-14 23:56:11 +00:00
buildNix =
2017-02-11 13:52:23 +00:00
fast = 1
2012-06-25 20:17:34 +00:00
; ;
2013-10-09 17:13:26 +00:00
--profile-name| -p)
if [ -z " $1 " ] ; then
2022-03-22 19:39:29 +00:00
log " $0 : ‘ --profile-name’ requires an argument "
2013-10-09 17:13:26 +00:00
exit 1
fi
if [ " $1 " != system ] ; then
profile = " /nix/var/nix/profiles/system-profiles/ $1 "
mkdir -p -m 0755 " $( dirname " $profile " ) "
fi
shift 1
; ;
2016-01-11 18:41:48 +00:00
--build-host| h)
buildHost = " $1 "
shift 1
; ;
--target-host| t)
targetHost = " $1 "
shift 1
; ;
2019-10-23 18:22:39 +00:00
--use-remote-sudo)
2021-11-03 11:37:39 +00:00
remoteSudo = 1
2019-10-23 18:22:39 +00:00
; ;
2019-09-13 16:02:44 +00:00
--flake)
flake = " $1 "
2021-05-16 14:17:42 +00:00
flakeFlags = ( --extra-experimental-features 'nix-command flakes' )
2019-09-13 16:02:44 +00:00
shift 1
; ;
2022-03-04 17:53:07 +00:00
--no-flake)
noFlake = 1
; ;
2020-02-05 15:00:58 +00:00
--recreate-lock-file| --no-update-lock-file| --no-write-lock-file| --no-registries| --commit-lock-file)
lockFlags += ( " $i " )
; ;
--update-input)
j = " $1 " ; shift 1
lockFlags += ( " $i " " $j " )
; ;
--override-input)
j = " $1 " ; shift 1
k = " $1 " ; shift 1
lockFlags += ( " $i " " $j " " $k " )
; ;
2010-01-03 13:36:23 +00:00
*)
2022-03-22 19:39:29 +00:00
log " $0 : unknown option \` $i ' "
2008-08-04 14:58:26 +00:00
exit 1
2012-06-25 20:17:34 +00:00
; ;
2010-01-03 13:36:23 +00:00
esac
2008-08-04 14:58:26 +00:00
done
2021-11-03 11:37:39 +00:00
if [ [ -n " $SUDO_USER " || -n $remoteSudo ] ] ; then
maybeSudo = ( sudo --preserve-env= " $preservedSudoVars " --)
2019-11-13 15:56:49 +00:00
fi
2021-11-29 03:48:23 +00:00
if [ [ -z " $buildHost " && -n " $targetHost " ] ] ; then
2016-01-11 18:41:48 +00:00
buildHost = " $targetHost "
fi
if [ " $targetHost " = localhost ] ; then
targetHost =
fi
if [ " $buildHost " = localhost ] ; then
buildHost =
fi
2022-03-08 15:59:45 +00:00
# log the given argument to stderr if verbose mode is on
logVerbose( ) {
if [ -n " $verboseScript " ] ; then
echo " $@ " >& 2
fi
}
# Run a command, logging it first if verbose mode is on
runCmd( ) {
logVerbose " $" " $@ "
" $@ "
}
2016-01-11 18:41:48 +00:00
buildHostCmd( ) {
if [ -z " $buildHost " ] ; then
2022-03-08 15:59:45 +00:00
runCmd " $@ "
2016-01-11 18:41:48 +00:00
elif [ -n " $remoteNix " ] ; then
2022-03-08 15:59:45 +00:00
runCmd ssh $SSHOPTS " $buildHost " " ${ maybeSudo [@] } " env PATH = " $remoteNix " :'$PATH' " $@ "
2016-01-11 18:41:48 +00:00
else
2022-03-08 15:59:45 +00:00
runCmd ssh $SSHOPTS " $buildHost " " ${ maybeSudo [@] } " " $@ "
2016-01-11 18:41:48 +00:00
fi
}
targetHostCmd( ) {
if [ -z " $targetHost " ] ; then
2022-03-08 15:59:45 +00:00
runCmd " ${ maybeSudo [@] } " " $@ "
2016-01-11 18:41:48 +00:00
else
2022-03-08 15:59:45 +00:00
runCmd ssh $SSHOPTS " $targetHost " " ${ maybeSudo [@] } " " $@ "
2016-01-11 18:41:48 +00:00
fi
}
copyToTarget( ) {
if ! [ " $targetHost " = " $buildHost " ] ; then
if [ -z " $targetHost " ] ; then
2022-03-08 15:59:45 +00:00
logVerbose " Running nix-copy-closure with these NIX_SSHOPTS: $SSHOPTS "
NIX_SSHOPTS = $SSHOPTS runCmd nix-copy-closure " ${ copyClosureFlags [@] } " --from " $buildHost " " $1 "
2016-01-11 18:41:48 +00:00
elif [ -z " $buildHost " ] ; then
2022-03-08 15:59:45 +00:00
logVerbose " Running nix-copy-closure with these NIX_SSHOPTS: $SSHOPTS "
NIX_SSHOPTS = $SSHOPTS runCmd nix-copy-closure " ${ copyClosureFlags [@] } " --to " $targetHost " " $1 "
2016-01-11 18:41:48 +00:00
else
2021-06-10 21:20:23 +00:00
buildHostCmd nix-copy-closure " ${ copyClosureFlags [@] } " --to " $targetHost " " $1 "
2016-01-11 18:41:48 +00:00
fi
fi
}
nixBuild( ) {
2022-03-08 15:59:45 +00:00
logVerbose "Building in legacy (non-flake) mode."
2016-01-11 18:41:48 +00:00
if [ -z " $buildHost " ] ; then
2022-03-08 15:59:45 +00:00
logVerbose "No --build-host given, running nix-build locally"
runCmd nix-build " $@ "
2016-01-11 18:41:48 +00:00
else
2022-03-08 15:59:45 +00:00
logVerbose " buildHost set to \" $buildHost \", running nix-build remotely "
2016-01-11 18:41:48 +00:00
local instArgs = ( )
local buildArgs = ( )
2021-06-10 22:14:49 +00:00
local drv =
2016-01-11 18:41:48 +00:00
while [ " $# " -gt 0 ] ; do
local i = " $1 " ; shift 1
case " $i " in
-o)
local out = " $1 " ; shift 1
buildArgs += ( "--add-root" " $out " "--indirect" )
; ;
-A)
local j = " $1 " ; shift 1
instArgs += ( " $i " " $j " )
; ;
2016-02-01 09:54:58 +00:00
-I) # We don't want this in buildArgs
2016-01-11 18:41:48 +00:00
shift 1
; ;
2016-02-01 09:54:58 +00:00
--no-out-link) # We don't want this in buildArgs
; ;
2016-01-11 18:41:48 +00:00
"<" *) # nix paths
instArgs += ( " $i " )
; ;
*)
buildArgs += ( " $i " )
; ;
esac
done
2022-03-08 15:59:45 +00:00
drv = " $( runCmd nix-instantiate " ${ instArgs [@] } " " ${ extraBuildFlags [@] } " ) "
2016-01-11 18:41:48 +00:00
if [ -a " $drv " ] ; then
2022-03-08 15:59:45 +00:00
logVerbose " Running nix-copy-closure with these NIX_SSHOPTS: $SSHOPTS "
NIX_SSHOPTS = $SSHOPTS runCmd nix-copy-closure --to " $buildHost " " $drv "
2016-01-11 18:41:48 +00:00
buildHostCmd nix-store -r " $drv " " ${ buildArgs [@] } "
else
2022-03-22 19:39:29 +00:00
log "nix-instantiate failed"
2016-01-11 18:41:48 +00:00
exit 1
fi
fi
}
2021-04-15 13:40:20 +00:00
nixFlakeBuild( ) {
2022-03-08 15:59:45 +00:00
logVerbose "Building in flake mode."
2022-06-26 10:56:54 +00:00
if [ [ -z " $buildHost " && -z " $targetHost " && " $action " != switch && " $action " != boot && " $action " != test && " $action " != dry-activate ] ]
2021-05-23 00:07:03 +00:00
then
2022-03-08 15:59:45 +00:00
runCmd nix " ${ flakeFlags [@] } " build " $@ "
2021-05-23 00:07:03 +00:00
readlink -f ./result
elif [ -z " $buildHost " ] ; then
2022-03-08 15:59:45 +00:00
runCmd nix " ${ flakeFlags [@] } " build " $@ " --out-link " ${ tmpDir } /result "
2021-04-15 13:40:20 +00:00
readlink -f " ${ tmpDir } /result "
else
local attr = " $1 "
shift 1
local evalArgs = ( )
local buildArgs = ( )
2021-06-10 22:14:49 +00:00
local drv =
2021-04-15 13:40:20 +00:00
while [ " $# " -gt 0 ] ; do
local i = " $1 " ; shift 1
case " $i " in
--recreate-lock-file| --no-update-lock-file| --no-write-lock-file| --no-registries| --commit-lock-file)
evalArgs += ( " $i " )
; ;
--update-input)
local j = " $1 " ; shift 1
evalArgs += ( " $i " " $j " )
; ;
--override-input)
local j = " $1 " ; shift 1
local k = " $1 " ; shift 1
evalArgs += ( " $i " " $j " " $k " )
; ;
2022-01-05 09:56:11 +00:00
--impure) # We don't want this in buildArgs, it's only needed at evaluation time, and unsupported during realisation
; ;
2021-04-15 13:40:20 +00:00
*)
buildArgs += ( " $i " )
; ;
esac
done
2022-03-08 15:59:45 +00:00
drv = " $( runCmd nix " ${ flakeFlags [@] } " eval --raw " ${ attr } .drvPath " " ${ evalArgs [@] } " " ${ extraBuildFlags [@] } " ) "
2021-04-15 13:40:20 +00:00
if [ -a " $drv " ] ; then
2022-03-08 15:59:45 +00:00
logVerbose " Running nix with these NIX_SSHOPTS: $SSHOPTS "
NIX_SSHOPTS = $SSHOPTS runCmd nix " ${ flakeFlags [@] } " copy --derivation --to " ssh:// $buildHost " " $drv "
2021-04-16 10:42:26 +00:00
buildHostCmd nix-store -r " $drv " " ${ buildArgs [@] } "
2021-04-15 13:40:20 +00:00
else
2022-03-22 19:39:29 +00:00
log "nix eval failed"
2021-04-15 13:40:20 +00:00
exit 1
fi
fi
}
2016-01-11 18:41:48 +00:00
2013-01-16 12:21:59 +00:00
if [ -z " $action " ] ; then showSyntax; fi
2007-02-06 13:09:25 +00:00
2014-04-15 09:47:41 +00:00
# Only run shell scripts from the Nixpkgs tree if the action is
# "switch", "boot", or "test". With other actions (such as "build"),
# the user may reasonably expect that no code from the Nixpkgs tree is
# executed, so it's safe to run nixos-rebuild against a potentially
# untrusted tree.
canRun =
2021-11-29 03:48:23 +00:00
if [ [ " $action " = switch || " $action " = boot || " $action " = test ] ] ; then
2014-04-15 09:47:41 +00:00
canRun = 1
fi
2020-09-25 15:22:11 +00:00
# If ‘ --upgrade’ or `--upgrade-all` is given,
# run ‘ nix-channel --update nixos’ .
2020-02-10 14:31:23 +00:00
if [ [ -n $upgrade && -z $_NIXOS_REBUILD_REEXEC && -z $flake ] ] ; then
2020-09-25 15:22:11 +00:00
# If --upgrade-all is passed, or there are other channels that
# contain a file called ".update-on-nixos-rebuild", update them as
# well. Also upgrade the nixos channel.
2015-04-13 10:41:31 +00:00
for channelpath in /nix/var/nix/profiles/per-user/root/channels/*; do
2020-09-25 15:22:11 +00:00
channel_name = $( basename " $channelpath " )
if [ [ " $channel_name " = = "nixos" ] ] ; then
2022-03-08 15:59:45 +00:00
runCmd nix-channel --update " $channel_name "
2020-09-25 15:22:11 +00:00
elif [ -e " $channelpath /.update-on-nixos-rebuild " ] ; then
2022-03-08 15:59:45 +00:00
runCmd nix-channel --update " $channel_name "
2020-09-25 15:22:11 +00:00
elif [ [ -n $upgrade_all ] ] ; then
2022-03-08 15:59:45 +00:00
runCmd nix-channel --update " $channel_name "
2015-04-13 10:41:31 +00:00
fi
done
2014-04-15 09:47:41 +00:00
fi
2014-06-10 18:09:48 +00:00
# Make sure that we use the Nix package we depend on, not something
# else from the PATH for nix-{env,instantiate,build}. This is
# important, because NixOS defaults the architecture of the rebuilt
# system to the architecture of the nix-* binaries used. So if on an
# amd64 system the user has an i686 Nix package in her PATH, then we
# would silently downgrade the whole system to be i686 NixOS on the
# next reboot.
if [ -z " $_NIXOS_REBUILD_REEXEC " ] ; then
export PATH = @nix@/bin:$PATH
fi
2014-04-15 09:47:41 +00:00
2019-09-19 12:40:24 +00:00
# Use /etc/nixos/flake.nix if it exists. It can be a symlink to the
# actual flake.
2022-03-04 17:53:07 +00:00
if [ [ -z $flake && -e /etc/nixos/flake.nix && -z $noFlake ] ] ; then
2019-09-19 12:40:24 +00:00
flake = " $( dirname " $( readlink -f /etc/nixos/flake.nix) " ) "
fi
2019-09-13 16:02:44 +00:00
# For convenience, use the hostname as the default configuration to
# build from the flake.
2019-09-20 16:37:17 +00:00
if [ [ -n $flake ] ] ; then
if [ [ $flake = ~ ^( .*) \# ( [ ^\# \" ] *) $ ] ] ; then
flake = " ${ BASH_REMATCH [1] } "
flakeAttr = " ${ BASH_REMATCH [2] } "
fi
if [ [ -z $flakeAttr ] ] ; then
2020-02-01 11:11:22 +00:00
read -r hostname < /proc/sys/kernel/hostname
2019-09-20 16:37:17 +00:00
if [ [ -z $hostname ] ] ; then
hostname = default
fi
flakeAttr = " nixosConfigurations.\" $hostname \" "
else
flakeAttr = " nixosConfigurations.\" $flakeAttr \" "
2019-09-13 16:02:44 +00:00
fi
fi
2022-01-08 10:12:11 +00:00
tmpDir = $( mktemp -t -d nixos-rebuild.XXXXXX)
cleanup( ) {
for ctrl in " $tmpDir " /ssh-*; do
ssh -o ControlPath = " $ctrl " -O exit dummyhost 2>/dev/null || true
done
rm -rf " $tmpDir "
}
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 p = $( runCmd nix-build --no-out-link --expr 'with import <nixpkgs/nixos> {}; config.system.build.nixos-rebuild' " ${ extraBuildFlags [@] } " ) ; then
SHOULD_REEXEC = 1
fi
else
runCmd nix " ${ flakeFlags [@] } " build --out-link " ${ tmpDir } /nixos-rebuild " " $flake # $flakeAttr .config.system.build.nixos-rebuild " " ${ extraBuildFlags [@] } " " ${ lockFlags [@] } "
if p = $( readlink -e " ${ tmpDir } /nixos-rebuild " ) ; then
SHOULD_REEXEC = 1
fi
fi
if [ [ -n $SHOULD_REEXEC ] ] ; then
export _NIXOS_REBUILD_REEXEC = 1
# Manually call cleanup as the EXIT trap is not triggered when using exec
cleanup
runCmd exec " $p /bin/nixos-rebuild " " ${ origArgs [@] } "
exit 1
fi
fi
2019-02-24 23:59:35 +00:00
# Find configuration.nix and open editor instead of building.
if [ " $action " = edit ] ; then
2020-02-07 14:26:12 +00:00
if [ [ -z $flake ] ] ; then
2022-03-08 15:59:45 +00:00
NIXOS_CONFIG = ${ NIXOS_CONFIG :- $( runCmd nix-instantiate --find-file nixos-config) }
2020-08-29 07:54:02 +00:00
if [ [ -d $NIXOS_CONFIG ] ] ; then
NIXOS_CONFIG = $NIXOS_CONFIG /default.nix
fi
2022-03-08 15:59:45 +00:00
runCmd exec ${ EDITOR :- nano } " $NIXOS_CONFIG "
2020-02-07 14:26:12 +00:00
else
2022-03-08 15:59:45 +00:00
runCmd exec nix " ${ flakeFlags [@] } " edit " ${ lockFlags [@] } " -- " $flake # $flakeAttr "
2020-02-07 14:26:12 +00:00
fi
2019-02-24 23:59:35 +00:00
exit 1
fi
2016-01-11 18:41:48 +00:00
SSHOPTS = " $NIX_SSHOPTS -o ControlMaster=auto -o ControlPath= $tmpDir /ssh-%n -o ControlPersist=60 "
2007-09-18 15:38:05 +00:00
# First build Nix, since NixOS may require a newer version than the
2014-04-15 10:03:30 +00:00
# current one.
2021-11-29 03:48:23 +00:00
if [ [ -n " $rollback " || " $action " = dry-build ] ] ; then
2014-04-15 09:47:41 +00:00
buildNix =
fi
2019-02-21 01:02:20 +00:00
nixSystem( ) {
machine = " $( uname -m) "
if [ [ " $machine " = ~ i.86 ] ] ; then
machine = i686
fi
echo $machine -linux
}
2016-01-11 18:41:48 +00:00
prebuiltNix( ) {
machine = " $1 "
if [ " $machine " = x86_64 ] ; then
2016-09-06 14:07:24 +00:00
echo @nix_x86_64_linux@
2016-01-11 18:41:48 +00:00
elif [ [ " $machine " = ~ i.86 ] ] ; then
2016-09-06 14:07:24 +00:00
echo @nix_i686_linux@
2021-05-14 12:53:57 +00:00
elif [ [ " $machine " = aarch64 ] ] ; then
echo @nix_aarch64_linux@
2016-01-11 18:41:48 +00:00
else
2022-03-22 19:39:29 +00:00
log " $0 : unsupported platform "
2016-01-11 18:41:48 +00:00
exit 1
fi
}
2019-09-13 16:02:44 +00:00
if [ [ -n $buildNix && -z $flake ] ] ; then
2022-03-22 19:39:29 +00:00
log "building Nix..."
2016-01-11 18:41:48 +00:00
nixDrv =
2022-03-08 15:59:45 +00:00
if ! nixDrv = " $( runCmd nix-instantiate '<nixpkgs/nixos>' --add-root " $tmpDir /nix.drv " --indirect -A config.nix.package.out " ${ extraBuildFlags [@] } " ) " ; then
if ! nixDrv = " $( runCmd nix-instantiate '<nixpkgs>' --add-root " $tmpDir /nix.drv " --indirect -A nix " ${ extraBuildFlags [@] } " ) " ; then
if ! nixStorePath = " $( runCmd nix-instantiate --eval '<nixpkgs/nixos/modules/installer/tools/nix-fallback-paths.nix>' -A " $( nixSystem) " | sed -e 's/^"//' -e 's/"$//' ) " ; then
2019-02-21 01:02:20 +00:00
nixStorePath = " $( prebuiltNix " $( uname -m) " ) "
fi
2022-03-08 15:59:45 +00:00
if ! runCmd nix-store -r " $nixStorePath " --add-root " ${ tmpDir } /nix " --indirect \
2017-03-06 14:53:34 +00:00
--option extra-binary-caches https://cache.nixos.org/; then
2022-03-22 19:39:29 +00:00
log "warning: don't know how to get latest Nix"
2017-03-06 14:53:34 +00:00
fi
# Older version of nix-store -r don't support --add-root.
2021-06-10 22:20:12 +00:00
[ -e " $tmpDir /nix " ] || ln -sf " $nixStorePath " " $tmpDir /nix "
2017-03-06 14:53:34 +00:00
if [ -n " $buildHost " ] ; then
2022-03-08 15:59:45 +00:00
remoteNixStorePath = " $( runCmd prebuiltNix " $( buildHostCmd uname -m) " ) "
2017-03-06 14:53:34 +00:00
remoteNix = " $remoteNixStorePath /bin "
2021-06-10 22:20:12 +00:00
if ! buildHostCmd nix-store -r " $remoteNixStorePath " \
2017-03-06 14:53:34 +00:00
--option extra-binary-caches https://cache.nixos.org/ >/dev/null; then
remoteNix =
2022-03-22 19:39:29 +00:00
log "warning: don't know how to get latest Nix"
2014-04-15 10:03:30 +00:00
fi
fi
2010-03-04 14:38:53 +00:00
fi
2008-03-13 10:17:42 +00:00
fi
2016-01-11 18:41:48 +00:00
if [ -a " $nixDrv " ] ; then
2021-06-10 22:20:12 +00:00
nix-store -r " $nixDrv " '!' "out" --add-root " $tmpDir /nix " --indirect >/dev/null
2016-01-11 18:41:48 +00:00
if [ -n " $buildHost " ] ; then
2021-06-10 21:20:23 +00:00
nix-copy-closure " ${ copyClosureFlags [@] } " --to " $buildHost " " $nixDrv "
2016-01-11 18:41:48 +00:00
# The nix build produces multiple outputs, we add them all to the remote path
for p in $( buildHostCmd nix-store -r " $( readlink " $nixDrv " ) " " ${ buildArgs [@] } " ) ; do
remoteNix = " $remoteNix ${ remoteNix : + : } $p /bin "
done
fi
fi
PATH = " $tmpDir /nix/bin: $PATH "
2008-01-02 15:30:31 +00:00
fi
2007-09-18 15:38:05 +00:00
2013-01-16 13:40:41 +00:00
# Update the version suffix if we're building from Git (so that
# nixos-version shows something useful).
2019-09-13 16:02:44 +00:00
if [ [ -n $canRun && -z $flake ] ] ; then
2022-03-08 15:59:45 +00:00
if nixpkgs = $( runCmd nix-instantiate --find-file nixpkgs " ${ extraBuildFlags [@] } " ) ; then
suffix = $( runCmd $SHELL " $nixpkgs /nixos/modules/installer/tools/get-version-suffix " " ${ extraBuildFlags [@] } " || true )
2016-08-09 12:11:29 +00:00
if [ -n " $suffix " ] ; then
echo -n " $suffix " > " $nixpkgs /.version-suffix " || true
2014-04-15 09:47:41 +00:00
fi
2013-01-16 13:40:41 +00:00
fi
fi
2015-03-09 15:23:23 +00:00
if [ " $action " = dry-build ] ; then
2013-01-16 15:11:51 +00:00
extraBuildFlags += ( --dry-run)
fi
2007-02-06 13:09:25 +00:00
# Either upgrade the configuration in the system profile (for "switch"
# or "boot"), or just build it and create a symlink "result" in the
# current directory (for "build" and "test").
2013-01-16 12:21:59 +00:00
if [ -z " $rollback " ] ; then
2022-03-22 19:39:29 +00:00
log "building the system configuration..."
2021-11-29 03:48:23 +00:00
if [ [ " $action " = switch || " $action " = boot ] ] ; then
2019-09-13 16:02:44 +00:00
if [ [ -z $flake ] ] ; then
pathToConfig = " $( nixBuild '<nixpkgs/nixos>' --no-out-link -A system " ${ extraBuildFlags [@] } " ) "
else
2021-04-15 13:40:20 +00:00
pathToConfig = " $( nixFlakeBuild " $flake # $flakeAttr .config.system.build.toplevel " " ${ extraBuildFlags [@] } " " ${ lockFlags [@] } " ) "
2019-09-13 16:02:44 +00:00
fi
2016-01-11 18:41:48 +00:00
copyToTarget " $pathToConfig "
targetHostCmd nix-env -p " $profile " --set " $pathToConfig "
2021-11-29 03:48:23 +00:00
elif [ [ " $action " = test || " $action " = build || " $action " = dry-build || " $action " = dry-activate ] ] ; then
2019-09-13 16:02:44 +00:00
if [ [ -z $flake ] ] ; then
pathToConfig = " $( nixBuild '<nixpkgs/nixos>' -A system -k " ${ extraBuildFlags [@] } " ) "
else
2021-04-15 13:40:20 +00:00
pathToConfig = " $( nixFlakeBuild " $flake # $flakeAttr .config.system.build.toplevel " " ${ extraBuildFlags [@] } " " ${ lockFlags [@] } " ) "
2019-09-13 16:02:44 +00:00
fi
2010-09-13 12:34:58 +00:00
elif [ " $action " = build-vm ] ; then
2019-09-13 16:02:44 +00:00
if [ [ -z $flake ] ] ; then
pathToConfig = " $( nixBuild '<nixpkgs/nixos>' -A vm -k " ${ extraBuildFlags [@] } " ) "
else
2021-04-15 13:40:20 +00:00
pathToConfig = " $( nixFlakeBuild " $flake # $flakeAttr .config.system.build.vm " " ${ extraBuildFlags [@] } " " ${ lockFlags [@] } " ) "
2019-09-13 16:02:44 +00:00
fi
2010-09-13 12:34:58 +00:00
elif [ " $action " = build-vm-with-bootloader ] ; then
2019-09-13 16:02:44 +00:00
if [ [ -z $flake ] ] ; then
pathToConfig = " $( nixBuild '<nixpkgs/nixos>' -A vmWithBootLoader -k " ${ extraBuildFlags [@] } " ) "
else
2021-04-15 13:40:20 +00:00
pathToConfig = " $( nixFlakeBuild " $flake # $flakeAttr .config.system.build.vmWithBootLoader " " ${ extraBuildFlags [@] } " " ${ lockFlags [@] } " ) "
2019-09-13 16:02:44 +00:00
fi
2009-08-19 15:04:19 +00:00
else
showSyntax
fi
2016-01-11 18:41:48 +00:00
# Copy build to target host if we haven't already done it
2021-11-29 03:48:23 +00:00
if ! [ [ " $action " = switch || " $action " = boot ] ] ; then
2016-01-11 18:41:48 +00:00
copyToTarget " $pathToConfig "
fi
2013-01-16 12:21:59 +00:00
else # [ -n "$rollback" ]
2021-11-29 03:48:23 +00:00
if [ [ " $action " = switch || " $action " = boot ] ] ; then
2016-01-11 18:41:48 +00:00
targetHostCmd nix-env --rollback -p " $profile "
2013-10-09 17:13:26 +00:00
pathToConfig = " $profile "
2021-11-29 03:48:23 +00:00
elif [ [ " $action " = test || " $action " = build ] ] ; then
2009-08-19 15:04:19 +00:00
systemNumber = $(
2016-01-11 18:41:48 +00:00
targetHostCmd nix-env -p " $profile " --list-generations |
2009-08-19 15:04:19 +00:00
sed -n '/current/ {g; p;}; s/ *\([0-9]*\).*/\1/; h'
)
2016-01-11 18:41:48 +00:00
pathToConfig = " $profile " -${ systemNumber } -link
if [ -z " $targetHost " ] ; then
ln -sT " $pathToConfig " ./result
fi
2009-08-19 15:04:19 +00:00
else
showSyntax
fi
2007-02-06 13:09:25 +00:00
fi
# If we're not just building, then make the new configuration the boot
# default and/or activate it now.
2021-11-29 03:48:23 +00:00
if [ [ " $action " = switch || " $action " = boot || " $action " = test || " $action " = dry-activate ] ] ; then
2021-06-10 22:20:12 +00:00
if ! targetHostCmd " $pathToConfig /bin/switch-to-configuration " " $action " ; then
2022-03-22 19:39:29 +00:00
log "warning: error(s) occurred while switching to the new configuration"
2014-08-14 23:57:36 +00:00
exit 1
fi
2007-02-06 13:09:25 +00:00
fi
2007-02-06 13:20:53 +00:00
2021-11-29 03:48:23 +00:00
if [ [ " $action " = build-vm || " $action " = build-vm-with-bootloader ] ] ; then
2009-08-11 01:35:56 +00:00
cat >& 2 <<EOF
2021-11-29 03:48:23 +00:00
Done. The virtual machine can be started by running $( echo " ${ pathToConfig } /bin/ " run-*-vm)
2009-08-11 01:35:56 +00:00
EOF
fi