summary refs log tree commit diff
path: root/pkgs/build-support
diff options
context:
space:
mode:
authoraszlig <aszlig@redmoonstudios.org>2014-02-17 02:10:00 +0100
committeraszlig <aszlig@redmoonstudios.org>2014-02-26 04:52:01 +0100
commitd8e66722a3c5e1fceb36ef956062efdbf5f55d20 (patch)
tree87a4b2d1242211bd3589f7fcce804c931ff38997 /pkgs/build-support
parente40f41e50562873fcdb78bec891a8f19141d4b42 (diff)
downloadnixlib-d8e66722a3c5e1fceb36ef956062efdbf5f55d20.tar
nixlib-d8e66722a3c5e1fceb36ef956062efdbf5f55d20.tar.gz
nixlib-d8e66722a3c5e1fceb36ef956062efdbf5f55d20.tar.bz2
nixlib-d8e66722a3c5e1fceb36ef956062efdbf5f55d20.tar.lz
nixlib-d8e66722a3c5e1fceb36ef956062efdbf5f55d20.tar.xz
nixlib-d8e66722a3c5e1fceb36ef956062efdbf5f55d20.tar.zst
nixlib-d8e66722a3c5e1fceb36ef956062efdbf5f55d20.zip
vm/windows: Factor out bootstrapping process.
This now isolates the vmTools integration from the bootstrap process and
thus removes our fixed Windows ISO and product key. The latter can now
be provided by an attribute "windowsImage" to runInWindowsVM.

Signed-off-by: aszlig <aszlig@redmoonstudios.org>
Diffstat (limited to 'pkgs/build-support')
-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"