Mac OS X 构建说明
Mac OS X 上的先决条件
- 在 Intel 硬件上运行的 10.10.x (Yosemite) 或更高版本(**不**支持 PowerPC 硬件,也不支持构建 X11 变体)。
- 与您的 Mac OS X 版本匹配的 Xcode (http://developer.apple.com/tools/download/)。直到最近,官方构建都使用 Xcode 6.2 完成(您可以使用 tools/darwin.amd64/bin/xcode-6.2-extractor.sh 脚本在更高版本的 OS X 上“安装”必要的组件)。
- 来自 MacPorts 的一些组件 (http://www.macports.org/)。
安装 MacPorts 后,请务必确保以下两行在您的~/.profile
或~/.zprofile
文件中,并且实际加载到您正在使用的 shell 中export PATH=/opt/local/bin:/opt/local/sbin:$PATH export MANPATH=/opt/local/share/man:$MANPATH
然后执行以下命令
sudo port install libidl acpica yasm subversion doxygen texlive texlive-latex-extra texlive-fonts-extra x86_64-elf-gcc
Doxygen、texlive* 和 x86_64-elf-gcc 是可选的(前两者用于文档,后者用于验证工具包)。
- 在较新版本的 OS X 上加载自建内核扩展 (kexts) 可能需要更改系统配置,除非您拥有 kext 签名证书并且运行的是 10.14 (High Sierra) 或更早版本。对于 10.11 (El Capitan) 及更高版本,请启动到恢复分区并启用未签名 kext 的加载
csrutil enable --without kext
或完全禁用 SIPcsrutil disable
对于 10.15 (Catalina) 及更高版本,您还需要禁用重启要求(同样从恢复分区操作)spctl kext-consent disable
如果您运行的是 10.10 (Yosemite),有一个 boot-args 选项允许加载未签名 kext。运行以下命令并重启sudo nvram boot-args="kext-dev-mode=1"
构建 VirtualBox
- 进入源代码的根目录并执行 configure 脚本
./configure --disable-hardening
如果出现与架构相关的问题,您可以手动设置目标架构为--target-arch=x86
或amd64
。
如果它找到所有需要的东西,它将创建一个名为
!AutoConfig.kmk
的文件,其中包含您系统上各种工具的路径。此外,它还将创建一个名为 env.sh 的环境设置脚本。此步骤只需执行一次(如果您的构建工具设置发生更改,您可能需要重复此步骤,但请记住这两个输出文件都将被覆盖)。
- 每当您想构建 VirtualBox 时,您都必须打开一个 shell 并 source 生成的环境设置脚本
env.sh
,即执行. ./env.sh
- 要构建,请键入
kmk
默认是发布版本构建,如果您希望进行调试或性能分析构建,请将BUILD_TYPE=debug
或BUILD_TYPE=profile
添加为kmk
的参数,或将其作为环境变量导出到您的 shell 中。
运行 VirtualBox
- 加载所有内核扩展模块。这些模块位于
out/darwin.x86/release/dist
中,同时还有一个用于加载它们的小脚本 (loadall.sh
)。执行并确保模块成功加载。 - 进入
out/darwin.x86/release/dist/VirtualBox.app/Contents/MacOS/
。 - 运行
./VirtualBox
为分发构建 OSE 包
在创建用于再分发的包时,**切勿**禁用强化(参见上一节)。
强化需要一些额外的配置和构建后步骤。VirtualBox 的默认安装目录是 /Applications/VirtualBox.app/
。如果您想更改它,例如更改为 /Applications/OpenSource/VirtualBox.app/
,您需要在 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"
禁用一些仅用于开发的内容(例如测试用例)可能也有意义。将以下内容添加到 LocalConfig.kmk
VBOX_WITH_TESTSUITE= VBOX_WITH_TESTCASES=
从 VirtualBox 4.1 开始,会创建额外的调试符号。您可以通过将以下内容添加到 LocalConfig.kmk
来阻止此行为
kBuildGlobalDefaults_LD_DEBUG=
接下来重建 VirtualBox 并将其安装到 /Applications/OpenSource/
。不支持将 VirtualBox 安装到目标目录。只需将文件复制到目标位置。现在请确保 setuid 存根具有正确的权限
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
强化的另一个要求是 VirtualBox.app/
父目录的每个路径组件都归 root
所有,并且不可由 world
写入。请确保情况如此。
所用库中的相对路径与绝对路径
如果在启动 VirtualBox 时看到类似以下错误,则需要将所用库更改为使用绝对路径。
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
在 Mac OS X 上,当可执行文件是 setuid 时,不允许使用相对路径的库来引用其他库。您可以通过以下命令显示所有链接的库
otool -L /Applications/VirtualBox.app/Contents/MacOS/VirtualBox.dylib
接下来,假设 Qt 已安装在 /Applications/VirtualBox.app/Contents/Frameworks/
中,您可以使用此命令更改路径
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
第一个命令更改库本身的标识符。第二个命令更改对其他库的引用。其中,第一个路径是旧的引用路径,第二个是新路径,最后一个路径是要更改的文件(参见 man install_name_tool
)。请注意,您需要对所有涉及的库重复此操作(至少包括 VirtualBox.dylib
、QtCore
、QtGui
、QtNetwork
、QtOpenGl
)。