From 830e9db5ddfec4c2f8708318d566874eae83c7a3 Mon Sep 17 00:00:00 2001
From: aszlig <aszlig@redmoonstudios.org>
Date: Fri, 17 Aug 2012 12:36:43 +0200
Subject: [PATCH 1/8] virtualbox: Use Linux's kbuild to build modules.

Don't rely on VirtualBox's in-tree build scripts to set include paths correctly
and use the official way of the Linux kernel to build the modules. That way we
don't need to make ugly symlinks in the kernel tree or heavily patch VirtualBox.
---
 .../virtualization/virtualbox/default.nix     | 42 ++++++++-----------
 1 file changed, 17 insertions(+), 25 deletions(-)

diff --git a/pkgs/applications/virtualization/virtualbox/default.nix b/pkgs/applications/virtualization/virtualbox/default.nix
index 2736c603a48d..6fc9dcf4bc22 100644
--- a/pkgs/applications/virtualization/virtualbox/default.nix
+++ b/pkgs/applications/virtualization/virtualbox/default.nix
@@ -45,7 +45,7 @@ stdenv.mkDerivation {
     ./configure --with-qt4-dir=${qt4} \
       ${optionalString (!javaBindings) "--disable-java"} \
       ${optionalString (!pythonBindings) "--disable-python"} \
-      --disable-pulse --disable-hardening \
+      --disable-pulse --disable-hardening --disable-kmods \
       --with-mkisofs=${xorriso}/bin/xorrisofs
     sed -e 's@PKG_CONFIG_PATH=.*@PKG_CONFIG_PATH=${libIDL}/lib/pkgconfig:${glib}/lib/pkgconfig ${libIDL}/bin/libIDL-config-2@' \
         -i AutoConfig.kmk
@@ -63,51 +63,43 @@ stdenv.mkDerivation {
 
   enableParallelBuilding = true;
 
-  preBuild = ''
+  buildPhase = ''
     source env.sh
     kmk
-    cd out/linux.*/release/bin/src
-    export KERN_DIR=${kernel}/lib/modules/*/build
   '';
 
-  postBuild = ''
-    cd ../../../../..
-  '';
-    
   installPhase = ''
     libexec=$out/libexec/virtualbox
-  
+
     # Install VirtualBox files
     cd out/linux.*/release/bin
     mkdir -p $libexec
     cp -av * $libexec
-    
-    # Install kernel module
-    cd src
-    kernelVersion=$(cd ${kernel}/lib/modules; ls)
-    export MODULE_DIR=$out/lib/modules/$kernelVersion/misc
-    
-    # Remove root ownership stuff, since this does not work in a chroot environment
-    for i in `find . -name Makefile`; do
-	sed -i -e "s|-o root||g" \
-               -e "s|-g root||g" $i
-    done
-    
+
     # Install kernel modules
-    make install
-    
+    curdir="$(pwd)"
+    for makefile in $curdir/out/linux.*/release/bin/src/*/Makefile \
+                    $curdir/out/linux.*/release/bin/additions/src/*/Makefile
+    do
+      mod="$(dirname "$makefile")"
+      name="$(basename "$mod")"
+      export INSTALL_MOD_PATH="$out"
+      export INSTALL_MOD_DIR=misc
+      make -C "$MODULES_BUILD_DIR" "M=$mod" DEPMOD= modules_install
+    done
+
     # Create wrapper script
     mkdir -p $out/bin
     for file in VirtualBox VBoxManage VBoxSDL VBoxBalloonCtrl VBoxBFE VBoxHeadless; do
         ln -s "$libexec/$file" $out/bin/$file
     done
-    
+
     # Create and fix desktop item
     mkdir -p $out/share/applications
     sed -i -e "s|Icon=VBox|Icon=$libexec/VBox.png|" $libexec/virtualbox.desktop
     ln -sfv $libexec/virtualbox.desktop $out/share/applications
   '';
-  
+
   meta = {
     description = "PC emulator";
     homepage = http://www.virtualbox.org/;

From 31d8a9a1f4043205978e5b2587b53aba841850d5 Mon Sep 17 00:00:00 2001
From: aszlig <aszlig@redmoonstudios.org>
Date: Fri, 17 Aug 2012 14:45:14 +0200
Subject: [PATCH 2/8] virtualbox: Fix wrong path when recursing modules.

The for loop didn't find $curdir, because it was set _after_ the directory has
been changed. The variable is now called $srcroot and is set before the
installPhase is changing directories.
---
 pkgs/applications/virtualization/virtualbox/default.nix | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/pkgs/applications/virtualization/virtualbox/default.nix b/pkgs/applications/virtualization/virtualbox/default.nix
index 6fc9dcf4bc22..f0b9e7d078e6 100644
--- a/pkgs/applications/virtualization/virtualbox/default.nix
+++ b/pkgs/applications/virtualization/virtualbox/default.nix
@@ -69,6 +69,7 @@ stdenv.mkDerivation {
   '';
 
   installPhase = ''
+    srcroot="$(pwd)"
     libexec=$out/libexec/virtualbox
 
     # Install VirtualBox files
@@ -77,9 +78,8 @@ stdenv.mkDerivation {
     cp -av * $libexec
 
     # Install kernel modules
-    curdir="$(pwd)"
-    for makefile in $curdir/out/linux.*/release/bin/src/*/Makefile \
-                    $curdir/out/linux.*/release/bin/additions/src/*/Makefile
+    for makefile in $srcroot/out/linux.*/release/bin/src/*/Makefile \
+                    $srcroot/out/linux.*/release/bin/additions/src/*/Makefile
     do
       mod="$(dirname "$makefile")"
       name="$(basename "$mod")"

From e32d7843da1dd53cde43c938cb83c109f57de0b0 Mon Sep 17 00:00:00 2001
From: aszlig <aszlig@redmoonstudios.org>
Date: Fri, 17 Aug 2012 14:47:25 +0200
Subject: [PATCH 3/8] virtualbox: Set depmod path to /do_not_use_depmod.

The scripts/depmod.sh checks whether the path in $DEPMOD is executable and only
executes it if that's the case. So, by setting DEPMOD to "/do_not_use_depmod"
the destination path doesn't exist _and_ thus isn't executable aswell.
---
 pkgs/applications/virtualization/virtualbox/default.nix | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pkgs/applications/virtualization/virtualbox/default.nix b/pkgs/applications/virtualization/virtualbox/default.nix
index f0b9e7d078e6..16ff38b4bcba 100644
--- a/pkgs/applications/virtualization/virtualbox/default.nix
+++ b/pkgs/applications/virtualization/virtualbox/default.nix
@@ -85,7 +85,7 @@ stdenv.mkDerivation {
       name="$(basename "$mod")"
       export INSTALL_MOD_PATH="$out"
       export INSTALL_MOD_DIR=misc
-      make -C "$MODULES_BUILD_DIR" "M=$mod" DEPMOD= modules_install
+      make -C "$MODULES_BUILD_DIR" "M=$mod" DEPMOD=/do_not_use_depmod modules_install
     done
 
     # Create wrapper script

From 3e62a02b17096cf44050e1e5d197234c7abe0f9b Mon Sep 17 00:00:00 2001
From: aszlig <aszlig@redmoonstudios.org>
Date: Sat, 18 Aug 2012 16:47:13 +0200
Subject: [PATCH 4/8] virtualbox: Separate modules build and install.

First of all, modules won't install when there is no "make modules" prior to it,
so we're doing this now with a new function called forEachModule, so we can
avoid duplication as much as possible.

In addition this sets $sourcedir to the current directory of the configurePhase,
so we're able to find the source tree later on, after several chdir()s.
---
 .../virtualization/virtualbox/default.nix     | 28 +++++++++++--------
 1 file changed, 16 insertions(+), 12 deletions(-)

diff --git a/pkgs/applications/virtualization/virtualbox/default.nix b/pkgs/applications/virtualization/virtualbox/default.nix
index 16ff38b4bcba..07f0aae746e0 100644
--- a/pkgs/applications/virtualization/virtualbox/default.nix
+++ b/pkgs/applications/virtualization/virtualbox/default.nix
@@ -8,9 +8,19 @@
 
 with stdenv.lib;
 
-let version = "4.1.18"; in
-
-stdenv.mkDerivation {
+let
+  version = "4.1.18";
+  forEachModule = action: ''
+    for makefile in $sourcedir/out/linux.*/release/bin/src/*/Makefile \
+                    $sourcedir/out/linux.*/release/bin/additions/src/*/Makefile
+    do
+      mod="$(dirname "$makefile")"
+      export INSTALL_MOD_PATH="$out"
+      export INSTALL_MOD_DIR=misc
+      make -C "$MODULES_BUILD_DIR" "M=$mod" DEPMOD=/do_not_use_depmod ${action}
+    done
+  '';
+in stdenv.mkDerivation {
   name = "virtualbox-${version}-${kernel.version}";
 
   NIX_CFLAGS_COMPILE="-I${kernel}/lib/modules/${kernel.modDirVersion}/build/include/generated";
@@ -42,6 +52,7 @@ stdenv.mkDerivation {
   '';
 
   configurePhase = ''
+    sourcedir="$(pwd)"
     ./configure --with-qt4-dir=${qt4} \
       ${optionalString (!javaBindings) "--disable-java"} \
       ${optionalString (!pythonBindings) "--disable-python"} \
@@ -66,6 +77,7 @@ stdenv.mkDerivation {
   buildPhase = ''
     source env.sh
     kmk
+    ${forEachModule "modules"}
   '';
 
   installPhase = ''
@@ -78,15 +90,7 @@ stdenv.mkDerivation {
     cp -av * $libexec
 
     # Install kernel modules
-    for makefile in $srcroot/out/linux.*/release/bin/src/*/Makefile \
-                    $srcroot/out/linux.*/release/bin/additions/src/*/Makefile
-    do
-      mod="$(dirname "$makefile")"
-      name="$(basename "$mod")"
-      export INSTALL_MOD_PATH="$out"
-      export INSTALL_MOD_DIR=misc
-      make -C "$MODULES_BUILD_DIR" "M=$mod" DEPMOD=/do_not_use_depmod modules_install
-    done
+    ${forEachModule "modules_install"}
 
     # Create wrapper script
     mkdir -p $out/bin

From 9fb1d2e6fc16d64264fd5ef96cda4fb230a538f3 Mon Sep 17 00:00:00 2001
From: aszlig <aszlig@redmoonstudios.org>
Date: Sat, 18 Aug 2012 16:50:15 +0200
Subject: [PATCH 5/8] virtualbox: Remove redundant NIX_CFLAGS_COMPILE.

The "include/generated" stuff is already added to the search path by the kernel
modules build system, so no need to hack it in like this.
---
 pkgs/applications/virtualization/virtualbox/default.nix | 2 --
 1 file changed, 2 deletions(-)

diff --git a/pkgs/applications/virtualization/virtualbox/default.nix b/pkgs/applications/virtualization/virtualbox/default.nix
index 07f0aae746e0..e28d38936524 100644
--- a/pkgs/applications/virtualization/virtualbox/default.nix
+++ b/pkgs/applications/virtualization/virtualbox/default.nix
@@ -23,8 +23,6 @@ let
 in stdenv.mkDerivation {
   name = "virtualbox-${version}-${kernel.version}";
 
-  NIX_CFLAGS_COMPILE="-I${kernel}/lib/modules/${kernel.modDirVersion}/build/include/generated";
-
   src = fetchurl {
     url = "http://download.virtualbox.org/virtualbox/${version}/VirtualBox-${version}.tar.bz2";
     sha256 = "e650e4fdc23581b9edc0e5d5705cc596c76796851ebf65ccda0edb8e413fa3b7";

From 1b8ec2eeec021ad6a60bb0644cb93c0bcaad1142 Mon Sep 17 00:00:00 2001
From: aszlig <aszlig@redmoonstudios.org>
Date: Sat, 18 Aug 2012 16:52:51 +0200
Subject: [PATCH 6/8] virtualbox: Don't build modules for guests.

We're the host so we don't need the kernel modules for the guest additions, as
they're build with in a separate derivation anyway.
---
 pkgs/applications/virtualization/virtualbox/default.nix | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/pkgs/applications/virtualization/virtualbox/default.nix b/pkgs/applications/virtualization/virtualbox/default.nix
index e28d38936524..70d4bc072763 100644
--- a/pkgs/applications/virtualization/virtualbox/default.nix
+++ b/pkgs/applications/virtualization/virtualbox/default.nix
@@ -11,8 +11,7 @@ with stdenv.lib;
 let
   version = "4.1.18";
   forEachModule = action: ''
-    for makefile in $sourcedir/out/linux.*/release/bin/src/*/Makefile \
-                    $sourcedir/out/linux.*/release/bin/additions/src/*/Makefile
+    for makefile in $sourcedir/out/linux.*/release/bin/src/*/Makefile
     do
       mod="$(dirname "$makefile")"
       export INSTALL_MOD_PATH="$out"

From 0f9a5eb0273f64ff14944c61be4d9c1b5bb1213a Mon Sep 17 00:00:00 2001
From: aszlig <aszlig@redmoonstudios.org>
Date: Sat, 18 Aug 2012 19:20:28 +0200
Subject: [PATCH 7/8] virtualbox: Add symbol versions to all modules.

Copy all symbol versions from the ones generated in the vboxdrv build.
---
 .../virtualization/virtualbox/default.nix         | 15 +++++++++++----
 1 file changed, 11 insertions(+), 4 deletions(-)

diff --git a/pkgs/applications/virtualization/virtualbox/default.nix b/pkgs/applications/virtualization/virtualbox/default.nix
index 70d4bc072763..ddbb58e55fb7 100644
--- a/pkgs/applications/virtualization/virtualbox/default.nix
+++ b/pkgs/applications/virtualization/virtualbox/default.nix
@@ -11,11 +11,18 @@ with stdenv.lib;
 let
   version = "4.1.18";
   forEachModule = action: ''
-    for makefile in $sourcedir/out/linux.*/release/bin/src/*/Makefile
+    for mod in \
+      $sourcedir/out/linux.*/release/bin/src/vboxdrv \
+      $sourcedir/out/linux.*/release/bin/src/vboxpci \
+      $sourcedir/out/linux.*/release/bin/src/vboxnetadp \
+      $sourcedir/out/linux.*/release/bin/src/vboxnetflt
     do
-      mod="$(dirname "$makefile")"
-      export INSTALL_MOD_PATH="$out"
-      export INSTALL_MOD_DIR=misc
+      if [ "x$(basename "$mod")" != xvboxdrv -a ! -e "$mod/Module.symvers" ]
+      then
+        cp -v $sourcedir/out/linux.*/release/bin/src/vboxdrv/Module.symvers \
+              "$mod/Module.symvers"
+      fi
+      INSTALL_MOD_PATH="$out" INSTALL_MOD_DIR=misc \
       make -C "$MODULES_BUILD_DIR" "M=$mod" DEPMOD=/do_not_use_depmod ${action}
     done
   '';

From 347e8c32a32fba2b9f171d109dc943173bb5cf52 Mon Sep 17 00:00:00 2001
From: aszlig <aszlig@redmoonstudios.org>
Date: Sat, 18 Aug 2012 19:31:34 +0200
Subject: [PATCH 8/8] virtualbox: Remove unused variable $srcroot.

Thanks to @shlevy for mentioning this.
---
 pkgs/applications/virtualization/virtualbox/default.nix | 1 -
 1 file changed, 1 deletion(-)

diff --git a/pkgs/applications/virtualization/virtualbox/default.nix b/pkgs/applications/virtualization/virtualbox/default.nix
index ddbb58e55fb7..ce81ff3bf9fe 100644
--- a/pkgs/applications/virtualization/virtualbox/default.nix
+++ b/pkgs/applications/virtualization/virtualbox/default.nix
@@ -85,7 +85,6 @@ in stdenv.mkDerivation {
   '';
 
   installPhase = ''
-    srcroot="$(pwd)"
     libexec=$out/libexec/virtualbox
 
     # Install VirtualBox files