From 830e9db5ddfec4c2f8708318d566874eae83c7a3 Mon Sep 17 00:00:00 2001 From: aszlig 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 2736c603a48..6fc9dcf4bc2 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 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 6fc9dcf4bc2..f0b9e7d078e 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 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 f0b9e7d078e..16ff38b4bcb 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 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 16ff38b4bcb..07f0aae746e 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 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 07f0aae746e..e28d3893652 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 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 e28d3893652..70d4bc07276 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 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 70d4bc07276..ddbb58e55fb 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 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 ddbb58e55fb..ce81ff3bf9f 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