#!/usr/bin/env nix-shell #! nix-shell -i bash -p jq set -euo pipefail ## Configuration libexec_dir="${0%/*}" configuration_path=${NIX_CONFIG:-$libexec_dir/config.nix} format_dir=$libexec_dir/formats format_path= target_system= run= ## Functions showUsage() { cat <&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 ;; --system) target_system=$2 shift ;; *) 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 configuration_path=$(realpath "$configuration_path") format_path=$(realpath "$format_path") args=( "$libexec_dir/eval-format.nix" --arg configuration "$configuration_path" --arg formatConfig "$format_path" ) if [[ -n $target_system ]]; then args+=(--argstr system "$target_system") fi 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 runner=$(find "$out"/bin -type l -print -quit) exec "$runner" fi