2019-01-20 22:57:14 +03:00
|
|
|
#!/usr/bin/env nix-shell
|
|
|
|
#! nix-shell -i bash -p jq
|
2019-01-17 17:18:00 +03:00
|
|
|
set -euo pipefail
|
|
|
|
|
|
|
|
## Configuration
|
|
|
|
|
|
|
|
libexec_dir="${0%/*}"
|
|
|
|
configuration_path=${NIX_CONFIG:-$libexec_dir/config.nix}
|
|
|
|
format_dir=$libexec_dir/formats
|
|
|
|
format_path=
|
2019-01-17 21:41:50 +03:00
|
|
|
target_system=
|
2019-01-17 17:18:00 +03:00
|
|
|
run=
|
|
|
|
|
|
|
|
## Functions
|
|
|
|
|
|
|
|
showUsage() {
|
|
|
|
cat <<USAGE
|
|
|
|
Usage: $0 [options]
|
|
|
|
|
|
|
|
Options:
|
|
|
|
|
|
|
|
* --help: shows this help
|
|
|
|
* -c, --configuration PATH:
|
|
|
|
select the nixos configuration to build. Default: $configuration_path
|
|
|
|
* -f, --format NAME: select one of the pre-determined formats
|
|
|
|
* --format-path PATH: pass a custom format
|
|
|
|
* --list: list the available built-in formats
|
|
|
|
* --run: runs the configuration in a VM
|
|
|
|
only works for the "vm" and "vm-no-gui" formats
|
2019-01-17 21:41:50 +03:00
|
|
|
* --system: specify the target system (eg: x86_64-linux)
|
2019-01-17 17:18:00 +03:00
|
|
|
USAGE
|
|
|
|
}
|
|
|
|
|
|
|
|
listFormats() {
|
|
|
|
for format in "$format_dir"/*.nix; do
|
|
|
|
basename "$format" ".nix"
|
|
|
|
done
|
|
|
|
}
|
|
|
|
|
|
|
|
abort() {
|
|
|
|
echo "aborted: $*" >&2
|
|
|
|
exit 1
|
|
|
|
}
|
|
|
|
|
|
|
|
## Main ##
|
|
|
|
|
|
|
|
while [[ $# -gt 0 ]]; do
|
|
|
|
case "$1" in
|
|
|
|
-c | --configuration)
|
|
|
|
configuration_path=$2
|
|
|
|
shift
|
|
|
|
;;
|
|
|
|
-f | --format)
|
|
|
|
format_path=$format_dir/$2.nix
|
|
|
|
shift
|
|
|
|
;;
|
|
|
|
--format-path)
|
|
|
|
format_path=$2
|
|
|
|
shift
|
|
|
|
;;
|
|
|
|
--help)
|
|
|
|
showUsage
|
|
|
|
exit
|
|
|
|
;;
|
|
|
|
--list)
|
|
|
|
listFormats
|
|
|
|
exit
|
|
|
|
;;
|
|
|
|
--run)
|
|
|
|
run=1
|
|
|
|
# default to the VM format
|
|
|
|
if [[ -z $format_path ]]; then
|
|
|
|
format_path=$format_dir/vm.nix
|
|
|
|
fi
|
|
|
|
;;
|
2019-01-17 21:41:50 +03:00
|
|
|
--system)
|
|
|
|
target_system=$2
|
|
|
|
shift
|
|
|
|
;;
|
2019-01-17 17:18:00 +03:00
|
|
|
*)
|
|
|
|
abort "unknown option $1"
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
shift
|
|
|
|
done
|
|
|
|
|
|
|
|
if [[ -z $format_path ]]; then
|
|
|
|
abort "missing format. use --help for more details"
|
|
|
|
fi
|
|
|
|
|
|
|
|
if [[ ! -e $format_path ]]; then
|
|
|
|
abort "format '$format_path' not found"
|
|
|
|
fi
|
|
|
|
|
2019-01-20 23:11:10 +03:00
|
|
|
configuration_path=$(realpath "$configuration_path")
|
|
|
|
format_path=$(realpath "$format_path")
|
|
|
|
|
2019-01-17 17:18:00 +03:00
|
|
|
args=(
|
|
|
|
"$libexec_dir/eval-format.nix"
|
|
|
|
--arg configuration "$configuration_path"
|
|
|
|
--arg formatConfig "$format_path"
|
|
|
|
)
|
|
|
|
|
2019-01-17 21:41:50 +03:00
|
|
|
if [[ -n $target_system ]]; then
|
|
|
|
args+=(--argstr system "$target_system")
|
|
|
|
fi
|
|
|
|
|
2019-01-17 17:18:00 +03:00
|
|
|
formatAttr=$(nix-instantiate "${args[@]}" --eval --json -A config.formatAttr | jq -r .)
|
|
|
|
|
|
|
|
out=$(nix-build "${args[@]}" --no-out-link -A "config.system.build.$formatAttr")
|
|
|
|
|
|
|
|
if [[ -z $run ]]; then
|
|
|
|
# show the first file
|
|
|
|
find "$out" -type f -print -quit
|
|
|
|
else
|
|
|
|
"$out/bin/run-nixos-vm"
|
|
|
|
fi
|