Mac OS X build instructions
Prerequisites on Mac OS X
- Mac OS X 10.4.x (Tiger), 10.5.x (Leopard), 10.6.x (Snow Leopard) or 10.7.x (Lion) running on Intel hardware (PowerPC hardware is not supported).
Please note that Tiger support was dropped with the 3.1 release. Also building a X11 variant of VirtualBox on Mac OS X is not supported.
- Xcode matching your Mac OS X version ( http://developer.apple.com/tools/download/):
- 2.4.1 or later for Tiger
- 3.1.0 or later for Leopard
- 3.2.0 or later for Snow Leopard
- 4.1.x for Lion (4.2 and later will not work!)
- Some things from MacPorts ( http://www.macports.org/).
After installing MacPorts, do not forget to add the following two lines to your ~/.profile
export PATH=/opt/local/bin:/opt/local/sbin:$PATH export MANPATH=/opt/local/share/man:$MANPATH
Then perform the following command:
for < Snow Leopardsudo port install libidl doxygen texlive texlive-latex-extra texlive-fonts-extra cdrtools
for >= Snow Leopard (32 Bit)sudo port install libidl +universal doxygen texlive texlive-latex-extra texlive-fonts-extra cdrtools
Doxygen and texlive* are optional. On 10.5 you may need a newer OpenSSL version than the one provided by the system. If so, perform:sudo port install openssl
- Qt/Mac ( http://qt.nokia.com/downloads/qt-for-open-source-cpp-development-on-mac-os-x)
Carbon 4.4.x upwards for Tiger
Cocoa 4.5.x upwards for Leopard/Snow Leopard/Lion
- LaTeX ("sudo port install texlive texlive-fonts-extra texlive-latex-extra texlive-latex-recommended") for building the documentation
Some words on 32bit vs. 64bit host operation systems
Starting with 10.6 Mac OS X is available in 64bit mode and with 10.7 most graphical application runs in 64bit mode. However, we have to distinct between the user and the kernel space. As VirtualBox is using its own kernel extensions, it has to be build and run in a version which match the kernel variant. You can check the current kernel mode by executing uname -m. If this shows i386 it runs in 32bit and if it shows x86_64 it runs the 64bit kernel. For switching between these modes on boot (on supported hardware) see this kb article. If the build system doesn't correct detect the right kernel mode, you can use --target-arch= to overwrite it. Please also note that VirtualBox can execute 64bit guest operation systems, even when itself is 32bit.
- Change to the root directory of the sources and execute the configure script:
./configure --disable-hardeningYou can manually set the target architecture with --target-arch=x86 or amd64, if some architecture related problems occur.
If it finds everything it needs, it will create a file called !AutoConfig.kmk containing paths to the various tools on your system. Also, it will create an environment setup script called env.sh. This step only has to be done once (if something changes in your build tool setup, you might have to repeat it but keep in mind that both output files will be overwritten). For additional options like providing a path to the OpenSSL library see ./configure --help.
- Whenever you want to build VirtualBox, you have to open a shell and source the generated environment setup script env.sh, i.e. do
- To build type
kmkThe default is to a release build, should you wish to do a debug or profile build add BUILD_TYPE=debug or BUILD_TYPE=profile as argument to kmk or export it as an environment variable in your shell.
Tips for building VirtualBox on Snow Leopard 32bit
For backward compatibility (that is Leopard) VirtualBox is build against the 10.5 SDK even on Snow Leopard (32bit). This can be problematic if you are using e.g. OpenSSL from MacPorts which is build against the 10.6 SDK. You have two possibilities to solve this problem:
- Build all dependencies yourself and point them to the 10.5 SDK. Use e.g. ./configure --with-openssl-dir=/path/to/self/build/OpenSSL before building VirtualBox.
- If you don't care about backwards compatibility, you can force VirtualBox to be build against the 10.6 SDK. For this include the following into a file called LocalConfig.kmk, which should be located in the top level directory of the VirtualBox build tree:
VBOX_DEF_MACOSX_VERSION_MIN = 10.6 VBOX_DARWIN_NO_COMPACT_LINKEDIT = VBOX_MACOS_10_5_WORKAROUND =
- Load all the kernel extension modules. These can be found in out/darwin.x86/release/dist along with a small script (loadall.sh) to load them. Execute and make sure the modules loads successfully.
- Enter out/darwin.x86/release/dist/VirtualBox.app/Contents/MacOS/.
- Run ./VirtualBox
Building OSE packages for distribution
Never disable hardening (see previous section) when creating packages for redistribution.
Hardening needs some additional configuration and post-build steps. The default install directory of VirtualBox is /Applications/VirtualBox.app/. If you like to change that, say into /Applications/OpenSource/VirtualBox.app/, you need to add the following to the LocalConfig.kmk:
VBOX_PATH_APP_PRIVATE = "/Applications/OpenSource/VirtualBox.app/Contents/MacOS" VBOX_PATH_APP_PRIVATE_ARCH = "/Applications/OpenSource/VirtualBox.app/Contents/MacOS" VBOX_PATH_SHARED_LIBS = "/Applications/OpenSource/VirtualBox.app/Contents/MacOS" VBOX_PATH_APP_DOCS = "/Applications/OpenSource/VirtualBox.app/Contents/MacOS"
It may also make sense to disable some of the development only stuff, like test cases. Add the following to LocalConfig.kmk:
Starting with VirtualBox 4.1, extra debug symbols are created. You can prevent that by adding the following to LocalConfig.kmk:
Next rebuild VirtualBox and install it into /Applications/OpenSource/. There isn't any support for installing VirtualBox into a target directory. Just copy the files to the destination. Now make sure that the setuid stubs have the correct permissions:
sudo chown -R root:admin /Applications/OpenSource/VirtualBox.app/ sudo chmod u+s /Applications/OpenSource/VirtualBox.app/Contents/MacOS/VirtualBox sudo chmod u+s /Applications/OpenSource/VirtualBox.app/Contents/MacOS/VirtualBoxVM sudo chmod u+s /Applications/OpenSource/VirtualBox.app/Contents/MacOS/VBoxHeadless sudo chmod u+s /Applications/OpenSource/VirtualBox.app/Contents/MacOS/VBoxNetAdpCtl sudo chmod u+s /Applications/OpenSource/VirtualBox.app/Contents/MacOS/VBoxNetDHCP
Another requirement of hardening is that every path component of the parent directory of VirtualBox.app/ is owned by root and not world writable. Make sure this is the case.
Relative vs. absolute paths in the used libraries
If you see something like the following error when starting VirtualBox you need to change the used libraries to use absolute paths.
VirtualBox: supR3HardenedMainGetTrustedMain: dlopen("/Applications/VirtualBox.app/Contents/MacOS/VirtualBox.dylib",) failed: \ dlopen(/Applications/VirtualBox.app/Contents/MacOS/VirtualBox.dylib, 10): Library not loaded: QtCore.framework/Versions/4/QtCore Referenced from: /Applications/VirtualBox.app/Contents/MacOS/VirtualBox.dylib Reason: unsafe use of relative rpath QtCore.framework/Versions/4/QtCore in /Applications/VirtualBox.app/Contents/MacOS/VirtualBox.dylib with restricted binary
On Mac OS X it isn't allowed to use libraries with relative paths for referencing to other libraries when the executable is setuid. You can display all linked libraries by the following command:
otool -L /Applications/VirtualBox.app/Contents/MacOS/VirtualBox.dylib
Next, assuming Qt is installed in /Applications/VirtualBox.app/Contents/Frameworks/, you can change the path by using this:
install_name_tool -id /Applications/VirtualBox.app/Contents/Frameworks/QtGui.framework/Versions/4/QtGui \ /Applications/VirtualBox.app/Contents/Frameworks/QtGui.framework/Versions/4/QtGui install_name_tool -change @executable_path/../Frameworks/QtCore.framework/Versions/4/QtCore \ /Applications/VirtualBox.app/Contents/Frameworks/QtCore.framework/Versions/4/QtCore \ /Applications/VirtualBox.app/Contents/Frameworks/QtGui.framework/Versions/4/QtGui
The first command changes the identifier of the library itself. The second changes references to other libraries. There, the first path is the old referenced path, the second one is the new path and the last path is the file to change (see man install_name_tool). Note, you need to repeat this with every library involved (at least VirtualBox.dylib, QtCore, QtGui, QtNetwork, QtOpenGl).