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