{ config, lib, options, pkgs, ... }: { options = { virtualisation = { runAsRoot = lib.mkOption { type = lib.types.bool; default = false; }; }; }; config = { virtualisation = let vmConfig = { boot.loader.efi.efiSysMountPoint = lib.mkVMOverride "/boot"; }; in { vmVariant = vmConfig; vmVariantWithBootLoader = vmConfig; }; # Replace native `qemu` with `remote-viewer` system.build = { vm = let packageName = "custom-nixos-vm"; mergedSystem = with options.system; lib.mergeDefinitions build.loc build.type (lib.lists.forEach ( builtins.filter (item: !(lib.path.hasPrefix ./. (/. + item.file))) build.definitionsWithLocations) (item: { inherit (item) file value; })); in lib.mkForce ( if (mergedSystem.mergedValue.vm.name == packageName) then mergedSystem.mergedValue.vm else let prefix = lib.concatStringsSep " " (lib.optional config.virtualisation.runAsRoot "sudo"); wrapped = pkgs.writeShellApplication { name = "run-${config.system.name}-vm"; text = '' ${prefix} ${mergedSystem.mergedValue.vm}/bin/run-${config.system.name}-vm ''; }; in # Rename package to `nixos-vm` pkgs.symlinkJoin { name = packageName; paths = [ wrapped ]; }); }; }; }