diff --git a/lib/nixos.nix b/lib/nixos.nix index d9f8367..11bb823 100644 --- a/lib/nixos.nix +++ b/lib/nixos.nix @@ -117,13 +117,13 @@ in rec { nixosSystem ? inputs.nixpkgs.lib.nixosSystem, # If provided, this will be set as »config.nixpkgs.buildPlatform« for all hosts, which in turn enables cross-compilation for all hosts whose »config.nixpkgs.hostPlatform« (the architecture they will run on) does not expand to the same value. Without this, building for other platforms may still work (slowly) if »boot.binfmt.emulatedSystems« on the building system is configured for the respective target(s). buildPlatform ? null, - ## The platforms for which the setup scripts (installation & maintenance/debugging) will be defined. SHould include the ».buildPlatform« and/or the target system's »config.nixpkgs.hostPlatform«. + ## The platforms for which the setup scripts (installation & maintenance/debugging) will be defined. Should include the ».buildPlatform« and/or the target system's »config.nixpkgs.hostPlatform«. setupPlatforms ? if inputs?systems then import inputs.systems else [ "aarch64-linux" "x86_64-linux" ], ## If provided, then change the name of each output attribute by passing it through this function. Allows exporting of multiple variants of a repo's hosts from a single flake (by then merging the results): renameOutputs ? false, ... }: let getName = if renameOutputs == false then (name: name) else renameOutputs; - otherArgs = (builtins.removeAttrs args [ "renameOutputs" "systems" ]) // { + otherArgs = (builtins.removeAttrs args [ "systems" "moduleInputs" "overlayInputs" "renameOutputs" ]) // { inherit inputs modules overlays moduleArgs nixosSystem buildPlatform extraModules; nixosArgs = (args.nixosArgs or { }) // { modules = (args.nixosArgs.modules or [ ]) ++ [ { imports = [ (args: { ${installer}.outputName = getName args.config._module.args.name; @@ -263,7 +263,7 @@ in rec { generic-arg-help "${ownPath}" "$functionDoc" ${esc description} ${esc notesAndExamples} ${esc usageLine} || exit ) ; \exit 0 ; fi - generic-arg-verify || \exit 3 + undeclared=x-.* exitCode=3 generic-arg-verify || \exit # either call »argv[0]« with the remaining parameters as arguments, or if »$1« is »-c« eval »$2«. if [[ ''${args[trace]:-} ]] ; then set -x ; fi diff --git a/lib/setup-scripts/install.sh b/lib/setup-scripts/install.sh index e23fc82..a9f7e36 100644 --- a/lib/setup-scripts/install.sh +++ b/lib/setup-scripts/install.sh @@ -63,7 +63,7 @@ function prepare-installer { # 1: diskPaths done if [[ ${SUDO_USER:-} && $( PATH=$hostPath which su 2>/dev/null ) ]] ; then # use Nix as the user who called this script, as Nix may not be set up for root - function nix {( set +x ; declare -a args=("$@") ; PATH=$hostPath su - "$SUDO_USER" -c "$(declare -p args)"' ; nix "${args[@]}"' )} + function nix {( set +x ; declare -a args=("$@") ; PATH=$hostPath su - "$SUDO_USER" -s "@{native.bashInteractive!getExe}" -c "$(declare -p args)"' ; nix "${args[@]}"' )} else # use Nix by absolute path, as it won't be on »$PATH« PATH=$PATH:@{native.nix}/bin fi @@ -72,7 +72,7 @@ function prepare-installer { # 1: diskPaths } -declare-flag install-system vm-shared "" "When installing inside the VM, specifies a host path that is read-write mounted at »/tmp/shared« inside the VM." +declare-flag install-system vm-shared "dir-path" "When installing inside the VM, specifies a host path that is read-write mounted at »/tmp/shared« inside the VM." ## Re-executes the current system's installation in a qemu VM. function reexec-in-qemu { @@ -125,7 +125,7 @@ function nixos-install-cmd {( # 1: mnt, 2: topLevel LC_ALL=C PATH=$PATH:@{native.util-linux}/bin @{native.nixos-install-tools}/bin/nixos-enter --silent --root "$1" -c "${_set_x:-:} ; @{config.system.build.installBootLoader} $2" || exit )} -declare-flag install-system toplevel "" "Optional replacement for the actual »config.system.build.toplevel«." +declare-flag install-system toplevel "store-path" "Optional replacement for the actual »config.system.build.toplevel«." declare-flag install-system no-inspect "" "Do not inspect the (successfully) installed system before unmounting its filesystems." declare-flag install-system inspect-cmd "script" "Instead of opening an interactive shell for the post-installation inspection, »eval« this script." diff --git a/lib/setup-scripts/utils.sh b/lib/setup-scripts/utils.sh index 39daca6..edc1e00 100644 --- a/lib/setup-scripts/utils.sh +++ b/lib/setup-scripts/utils.sh @@ -40,8 +40,8 @@ function generic-arg-help { # 1: name, 2?: args, 3?: description, 4?: suffix, 5? # Entries in »allowedArgs« should have the form »[--name]="description"« for boolean flags, and »[--name=VAL]="description"« for string arguments. # »description« is used by »generic-arg-help«. Boolean flags may only have the values »1« (as set by »generic-ags-parse« for flags without value) or be empty. # »VAL« is purely nominal. Any argument passed that is not in »allowedArgs« raises an error. -function generic-arg-verify { # 1: exitCode - local exitCode=${1:-1} +function generic-arg-verify { # 1?: exitCode + local exitCode=${exitCode:-${1:-1}} local names=' '"${!allowedArgs[@]}" for name in "${!args[@]}" ; do if [[ ${allowedArgs[--$name]:-} ]] ; then @@ -49,6 +49,7 @@ function generic-arg-verify { # 1: exitCode echo "Argument »--$name« should be a boolean, but its value is: ${args[$name]}" 1>&2 ; \return $exitCode fi if [[ $names == *' --'"$name"'='* || $names == *' --'"$name"'[='* ]] ; then continue ; fi + if [[ ${undeclared:-} && $name =~ $undeclared ]] ; then continue ; fi echo "Unexpected argument »--$name«.${allowedArgs[help]:+ Call with »--help« for a list of valid arguments.}" 1>&2 ; \return $exitCode done }