mirror of
https://github.com/nix-community/nixos-generators.git
synced 2024-08-17 08:00:22 +03:00
135 lines
2.7 KiB
Plaintext
Executable File
135 lines
2.7 KiB
Plaintext
Executable File
#!/usr/bin/env nix-shell
|
|
#! nix-shell -i bash -p jq
|
|
set -euo pipefail
|
|
|
|
## Configuration
|
|
|
|
readonly libexec_dir="${0%/*}"
|
|
readonly format_dir=$libexec_dir/formats
|
|
|
|
configuration=${NIXOS_CONFIG:-$libexec_dir/configuration.nix}
|
|
format_path=
|
|
target_system=
|
|
cores=
|
|
run=
|
|
nix_args=(
|
|
"$libexec_dir/nixos-generate.nix"
|
|
)
|
|
|
|
## Functions
|
|
|
|
showUsage() {
|
|
cat <<USAGE
|
|
Usage: $0 [options]
|
|
|
|
Options:
|
|
|
|
* --help: shows this help
|
|
* -c, --configuration PATH:
|
|
select the nixos configuration to build. Default: $configuration
|
|
* -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
|
|
* --show-trace: show more detailed nix evaluation location information
|
|
* --system: specify the target system (eg: x86_64-linux)
|
|
* --cores : to control the maximum amount of parallelism. (see nix-build documentation)
|
|
* -I KEY=VALUE: Add a key to the Nix expression search path.
|
|
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=$2
|
|
shift
|
|
;;
|
|
--cores)
|
|
cores=$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
|
|
;;
|
|
--show-trace)
|
|
nix_args+=(--show-trace)
|
|
;;
|
|
--system)
|
|
target_system=$2
|
|
shift
|
|
;;
|
|
-I)
|
|
nix_args+=(-I "$2")
|
|
shift
|
|
;;
|
|
*)
|
|
abort "unknown option $1"
|
|
;;
|
|
esac
|
|
shift
|
|
done
|
|
|
|
if [[ -z $format_path ]]; then
|
|
abort "missing format. use --help for more details"
|
|
fi
|
|
|
|
nix_args+=(
|
|
-I "nixos-config=$configuration"
|
|
-I "format-config=$format_path"
|
|
)
|
|
|
|
if [[ -n $target_system ]]; then
|
|
nix_args+=(--argstr system "$target_system")
|
|
fi
|
|
|
|
if [[ -n $cores ]]; then
|
|
nix_args+=(--cores "$cores")
|
|
fi
|
|
|
|
formatAttr=$(nix-instantiate "${nix_args[@]}" --eval --json -A config.formatAttr | jq -r .)
|
|
filename=$(nix-instantiate "${nix_args[@]}" --eval --json -A config.filename | jq -r .)
|
|
|
|
out=$(nix-build "${nix_args[@]}" --no-out-link -A "config.system.build.$formatAttr")
|
|
|
|
if [[ -z $run ]]; then
|
|
# show the first file, ignoring nix-support
|
|
find "$out" -wholename "$filename" -type f -print -quit
|
|
else
|
|
runner=$(find "$out"/bin -type l -print -quit)
|
|
exec "$runner"
|
|
fi
|