From b01c9624cf0c77837e1928a49778f74446ddfaa0 Mon Sep 17 00:00:00 2001 From: aszlig Date: Sun, 16 Feb 2014 22:42:10 +0100 Subject: [PATCH] vm/windows: Add new runInWindowsVM function. This function is quite similar to runInLinuxVM, but also ensures that the builder is run decoupled of the Nix store and using the userland inside the VM. We're now picking up the environment variables saved in the previous commit. The reason we suppress all errors from the source operation is that it would emit a ton of errors because we're trying to set read-only variables. Also, detecting whether the origBuilder is using the default builder from the stdenv is currently a bit of a workaround until we have a specialized pseudo-cross-stdenv someday in the future[TM]. Signed-off-by: aszlig --- pkgs/build-support/vm/windows/default.nix | 42 +++++++++++++++++++---- 1 file changed, 35 insertions(+), 7 deletions(-) diff --git a/pkgs/build-support/vm/windows/default.nix b/pkgs/build-support/vm/windows/default.nix index 8ca31bc39d7b..9d870633ff17 100644 --- a/pkgs/build-support/vm/windows/default.nix +++ b/pkgs/build-support/vm/windows/default.nix @@ -60,11 +60,39 @@ let inherit command; }; - runFromSuspended = command: stdenv.mkDerivation { - name = "cygwin-vm-run"; - buildCommand = '' - ${resumeAndRun command} - ''; - }; + builder = '' + source /tmp/xchg/saved-env 2> /dev/null || true + export NIX_STORE=/nix/store + export NIX_BUILD_TOP=/tmp + export TMPDIR=/tmp + export PATH=/empty + cd "$NIX_BUILD_TOP" + exec $origBuilder $origArgs + ''; -in runFromSuspended "uname -a" +in { + runInWindowsVM = drv: let + newDrv = drv.override { + stdenv = drv.stdenv.override { + shell = "/bin/sh"; + }; + }; + in lib.overrideDerivation drv (attrs: { + requiredSystemFeatures = [ "kvm" ]; + buildur = "${stdenv.shell}"; + args = ["-e" (resumeAndRun builder)]; + origArgs = attrs.args; + origBuilder = if attrs.builder == attrs.stdenv.shell + then "/bin/sh" + else attrs.builder; + + postHook = '' + PATH=/usr/bin:/bin:/usr/sbin:/sbin + SHELL=/bin/sh + eval "$origPostHook" + ''; + + origPostHook = attrs.postHook or ""; + fixupPhase = ":"; + }); +}