diff options
Diffstat (limited to 'pkgs/build-support')
-rw-r--r-- | pkgs/build-support/vm/windows/bootstrap.nix | 61 | ||||
-rw-r--r-- | pkgs/build-support/vm/windows/default.nix | 68 |
2 files changed, 67 insertions, 62 deletions
diff --git a/pkgs/build-support/vm/windows/bootstrap.nix b/pkgs/build-support/vm/windows/bootstrap.nix new file mode 100644 index 000000000000..26aa6c7a6861 --- /dev/null +++ b/pkgs/build-support/vm/windows/bootstrap.nix @@ -0,0 +1,61 @@ +{ isoFile, productKey }: + +let + inherit (import <nixpkgs> {}) lib stdenv qemu; +in rec { + installedVM = import ./install { + inherit isoFile productKey; + }; + + runInVM = img: attrs: import ./controller (attrs // { + inherit (installedVM) sshKey; + qemuArgs = attrs.qemuArgs or [] ++ [ + "-boot order=c" + "-drive file=${img},index=0,media=disk" + ]; + }); + + runAndSuspend = let + drives = { + s = { + source = "nixstore"; + target = "/nix/store"; + }; + x = { + source = "xchg"; + target = "/tmp/xchg"; + }; + }; + + genDriveCmds = letter: { source, target }: [ + "net use ${letter}: '\\\\192.168.0.2\\${source}' /persistent:yes" + "mkdir -p '${target}'" + "mount -o bind '/cygdrive/${letter}' '${target}'" + "echo '/cygdrive/${letter} ${target} none bind 0 0' >> /etc/fstab" + ]; + in runInVM "winvm.img" { + command = lib.concatStringsSep " && " ([ + "net config server /autodisconnect:-1" + ] ++ lib.concatLists (lib.mapAttrsToList genDriveCmds drives)); + suspendTo = "state.gz"; + }; + + suspendedVM = stdenv.mkDerivation { + name = "cygwin-suspended-vm"; + buildCommand = '' + ${qemu}/bin/qemu-img create \ + -b "${installedVM}/disk.img" \ + -f qcow2 winvm.img + ${runAndSuspend} + ensureDir "$out" + cp winvm.img "$out/disk.img" + cp state.gz "$out/state.gz" + ''; + }; + + resumeAndRun = command: runInVM "${suspendedVM}/disk.img" { + resumeFrom = "${suspendedVM}/state.gz"; + qemuArgs = lib.singleton "-snapshot"; + inherit command; + }; +} diff --git a/pkgs/build-support/vm/windows/default.nix b/pkgs/build-support/vm/windows/default.nix index 9d870633ff17..8e8809f370f0 100644 --- a/pkgs/build-support/vm/windows/default.nix +++ b/pkgs/build-support/vm/windows/default.nix @@ -1,64 +1,5 @@ let - inherit (import <nixpkgs> {}) lib stdenv requireFile writeText qemu; - - winISO = /path/to/iso/XXX; - - installedVM = import ./install { - isoFile = winISO; - productKey = "XXX"; - }; - - runInVM = img: attrs: import ./controller (attrs // { - inherit (installedVM) sshKey; - qemuArgs = attrs.qemuArgs or [] ++ [ - "-boot order=c" - "-drive file=${img},index=0,media=disk" - ]; - }); - - runAndSuspend = let - drives = { - s = { - source = "nixstore"; - target = "/nix/store"; - }; - x = { - source = "xchg"; - target = "/tmp/xchg"; - }; - }; - - genDriveCmds = letter: { source, target }: [ - "net use ${letter}: '\\\\192.168.0.2\\${source}' /persistent:yes" - "mkdir -p '${target}'" - "mount -o bind '/cygdrive/${letter}' '${target}'" - "echo '/cygdrive/${letter} ${target} none bind 0 0' >> /etc/fstab" - ]; - in runInVM "winvm.img" { - command = lib.concatStringsSep " && " ([ - "net config server /autodisconnect:-1" - ] ++ lib.concatLists (lib.mapAttrsToList genDriveCmds drives)); - suspendTo = "state.gz"; - }; - - suspendedVM = stdenv.mkDerivation { - name = "cygwin-suspended-vm"; - buildCommand = '' - ${qemu}/bin/qemu-img create \ - -b "${installedVM}/disk.img" \ - -f qcow2 winvm.img - ${runAndSuspend} - ensureDir "$out" - cp winvm.img "$out/disk.img" - cp state.gz "$out/state.gz" - ''; - }; - - resumeAndRun = command: runInVM "${suspendedVM}/disk.img" { - resumeFrom = "${suspendedVM}/state.gz"; - qemuArgs = lib.singleton "-snapshot"; - inherit command; - }; + inherit (import <nixpkgs> {}) lib stdenv; builder = '' source /tmp/xchg/saved-env 2> /dev/null || true @@ -77,10 +18,13 @@ in { shell = "/bin/sh"; }; }; - in lib.overrideDerivation drv (attrs: { + in lib.overrideDerivation drv (attrs: let + bootstrap = import ./bootstrap.nix attrs.windowsImage; + in { requiredSystemFeatures = [ "kvm" ]; buildur = "${stdenv.shell}"; - args = ["-e" (resumeAndRun builder)]; + args = ["-e" (bootstrap.resumeAndRun builder)]; + windowsImage = bootstrap.suspendedVM; origArgs = attrs.args; origBuilder = if attrs.builder == attrs.stdenv.shell then "/bin/sh" |