about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--pkgs/build-support/vm/windows/bootstrap.nix61
-rw-r--r--pkgs/build-support/vm/windows/default.nix68
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"