{ pkgs ? import <nixpkgs> {}, diskImageSize ? "22G", qemuMem ? "4G", }: with pkgs; let windowsIso = fetchurl { url = "https://software-download.microsoft.com/download/sg/17763.107.101029-1455.rs5_release_svc_refresh_CLIENT_LTSC_EVAL_x64FRE_en-us.iso"; sha256 = "668fe1af70c2f7416328aee3a0bb066b12dc6bbd2576f40f812b95741e18bc3a"; }; anaconda = fetchurl { url = "https://repo.anaconda.com/archive/Anaconda3-2019.03-Windows-x86_64.exe"; sha256 = "1f9icm5rwab6l1f23a70dw0qixzrl62wbglimip82h4zhxlh3jfj"; }; escape = builtins.replaceStrings [ "\\" ] [ "\\\\" ]; qemu = import ./qemu.nix { inherit pkgs qemuMem; diskImage = "c.img"; }; # Double-escape because we produce a script from a shell heredoc ssh = cmd: qemu.ssh (escape cmd); scp = qemu.scp; sshCondaEnv = cmd: ssh "anaconda\\scripts\\activate && ${cmd}"; condaEnv = "artiq-env"; condaDepSpecs = builtins.concatStringsSep " " (map (s: "\"${s}\"") (import ../conda-artiq-deps.nix)); instructions = builtins.toFile "install.txt" (builtins.readFile ./install.txt); in stdenv.mkDerivation { name = "windows-installer"; src = windowsIso; setSourceRoot = "sourceRoot=`pwd`"; unpackCmd = '' ln -s $curSrc windows.iso ''; propagatedBuildInputs = qemu.inputs; dontBuild = true; installPhase = '' mkdir -p $out/bin $out/data ln -s $(readlink windows.iso) $out/data/windows.iso cat > $out/bin/windows-installer.sh << EOF #!/usr/bin/env bash set -e -m ${qemu.qemu-img} create -f qcow2 c.img ${diskImageSize} ${qemu.runQemu false [] [ "-boot" "order=d" "-drive" "file=c.img,index=0,media=disk,cache=unsafe" "-drive" "file=$out/data/windows.iso,index=1,media=cdrom,cache=unsafe" ]} & cat ${instructions} wait EOF cat > $out/bin/anaconda-installer.sh << EOF #!/usr/bin/env bash set -e -m ${qemu.runQemu false [] [ "-boot" "order=c" "-drive" "file=c.img,index=0,media=disk" ]} & sleep 10 ${ssh "ver"} ${scp anaconda "Anaconda.exe"} ${ssh "start /wait \"\" Anaconda.exe /S /D=%cd%\\anaconda"} ${sshCondaEnv "conda config --add channels conda-forge"} ${sshCondaEnv "conda config --add channels m-labs"} ( ${sshCondaEnv "conda update -y conda"} ) || true ${sshCondaEnv "conda update -y --all"} ${sshCondaEnv "conda create -y -n ${condaEnv}"} ${sshCondaEnv "conda install -y -n ${condaEnv} ${condaDepSpecs}"} ${ssh "shutdown /p /f"} echo "Waiting for qemu exit" wait EOF chmod a+x $out/bin/*.sh ''; }