构建和测试 SpiderMonkey¶
第一步是运行我们的“引导”脚本,以帮助确保您拥有适合您操作系统的正确构建工具。这也有助于您获取源代码副本。但是,您现在不需要运行“mach build”命令。
本指南向您展示如何使用 mach
构建 SpiderMonkey,mach
是 Mozilla 的多用途构建工具。这取代了以前建议直接运行“configure”脚本的指南。
这些说明假设您已克隆了 mozilla-unified 并且有兴趣构建 JS shell。
开发人员(调试)版本¶
为了开发和调试 SpiderMonkey 本身,最好同时拥有一个调试版本(用于日常调试)和一个优化版本(用于性能测试),分别位于不同的构建目录中。我们将首先介绍如何创建调试版本。
设置 MOZCONFIG¶
首先,我们将创建一个 MOZCONFIG
文件。此文件描述了您希望 mach 创建的构建的特性。由于您可能会有几个 MOZCONFIGs
,所以像 $HOME/mozconfigs
这样的目录是一个有用的东西。
一个用于进行调试构建的基本 MOZCONFIG
文件,放置在 $HOME/mozconfigs/debug
中,如下所示
# Build only the JS shell
ac_add_options --enable-project=js
# Enable the debugging tools: Assertions, debug only code etc.
ac_add_options --enable-debug
# Enable optimizations as well so that the test suite runs much faster. If
# you are having trouble using a debugger, you should disable optimization.
ac_add_options --enable-optimize
# Use a dedicated objdir for SpiderMonkey debug builds to avoid
# conflicting with Firefox build with default configuration.
mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/obj-debug-@CONFIG_GUESS@
要激活特定的 MOZCONFIG
,请设置环境变量
export MOZCONFIG=$HOME/mozconfigs/debug
构建¶
通过设置环境变量激活 MOZCONFIG
后,您就可以请求位于检出目录顶层的 mach
执行构建
$ cd <path to mozilla-central>
$ ./mach build
注意
如果您在 Mac 上并且 baldrdash 无法编译,出现类似以下错误
/usr/local/Cellar/llvm/7.0.1/lib/clang/7.0.1/include/inttypes.h:30:15: fatal error: 'inttypes.h' file not found
这是因为,从 Mojave 开始,头文件不再安装在 /usr/include
中。请参阅 发行说明 中的命令行工具 -> 新功能部分
发行说明还指出,此兼容性包在不久的将来将不再提供,因此 macOS 上的构建系统必须适应在 SDK 中查找头文件
在那之前,以下内容应该有所帮助:
open /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pk
成功构建 shell 后,您可以使用 mach run
运行它。
测试¶
构建完成后,您可以使用 mach
运行 jit-tests
$ ./mach jit-test
类似地,您也可以运行 jstests
。这些包括所有 test262 测试的本地、间歇更新的副本。
$ ./mach jstests
有关更多详细信息,请参阅 运行自动化的 JavaScript 测试。
优化版本¶
要切换到优化版本(例如用于性能测试),只需拥有一个优化版本的 MOZCONFIG
,然后激活它即可。一个示例 $HOME/mozconfigs/optimized
MOZCONFIG
如下所示
# Build only the JS shell
ac_add_options --enable-project=js
# Enable optimization for speed
ac_add_options --enable-optimize
# Disable debug checks to better match a release build of Firefox.
ac_add_options --disable-debug
# Use a separate objdir for optimized builds to allow easy
# switching between optimized and debug builds while developing.
mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/obj-opt-@CONFIG_GUESS@
Android aarch64 上的 SpiderMonkey¶
在 Android 上构建 SpiderMonkey¶
首先,运行 mach bootstrap 并在询问您要构建哪个项目时回答 GeckoView/Firefox for Android。这将下载最新的 Android NDK,确保存在编译 Android 所需的所有构建依赖项等。
确保 $MOZBUILD_DIR/android-sdk-linux/platform-tools 存在于您的 PATH 环境中。您可以通过在 shell 中运行以下行或将其添加到 shell 配置文件初始化文件中来实现此目的
$ export PATH="$PATH:~/.mozbuild/android-sdk-linux/platform-tools"
创建一个用于编译 SpiderMonkey 的典型 mozconfig 文件,如 设置 MOZCONFIG 文档中所述,并包含以下行
$ ac_add_options --target=aarch64-linux-android
然后像往常一样使用 mach build 和此 MOZCONFIG 文件进行编译。
在 Android 上运行 jit-tests¶
将您的 Android 设备连接到如上所述为 aarch64 编译 shell 的机器,或确保它与主机位于同一子网中。它应该出现在 adb 看到的设备列表中
$ adb devices
此命令应显示设备 ID 和设备名称。如果未显示,请确保您已在设备上启用了开发者选项,以及 在设备上启用了 USB 调试。
使用 android-aarch64 MOZCONFIG 文件运行 mach jit-test –remote {JIT_TEST_ARGS}。这会将 JS shell 及其依赖项上传到 Android 设备,位于临时目录(截至 2020-09-02 为 /data/local/tmp/test_root/bin)中。然后它将开始运行 jit-test 套件。
在 Android 上调试 jit-tests¶
Android 上的调试使用 GDB 远程调试协议,因此我们将在 Android 设备上设置一个 GDB 服务器,该服务器将由主机远程控制。
使用主机上的以下命令将 NDK 中预编译的 gdbserver 二进制文件上传到 Android 设备
$ adb push \
~/.mozbuild/android-ndk-r23c/prebuilt/android-arm64/gdbserver/gdbserver \
/data/local/tmp/test_root/bin
确保主机上安装了 ncurses5 库。在类似 Debian 的发行版上,可以使用 sudo apt install -y libncurses5 来实现。
设置 GDB 端口的端口转发,从 Android 设备到主机,这样我们就可以从主机连接到本地端口,而无需查找 Android 设备的 IP 地址
$ adb forward tcp:5039 tcp:5039
在手机上启动 gdbserver,并将 JS shell 命令行参数传递给 gdbserver
$ adb shell export LD_LIBRARY_PATH=/data/local/tmp/test_root/bin '&&' /data/local/tmp/test_root/bin/gdbserver :5039 /data/local/tmp/test_root/bin/js /path/to/test.js
注意
请注意,这将使 gdbserver 在所有网络接口上的 5039 端口上侦听。特别是,gdbserver 将可以从与您的手机位于同一网络中的所有其他设备访问。由于 gdbserver 协议不安全,强烈建议在退出 shell 时仔细检查 gdbserver 进程是否已正确终止,并且不要在超出必要范围时运行它。
注意
您可以通过向其提供 -s 参数找到 jit_test.py 脚本正在使用的完整命令行,并将该命令复制/粘贴作为上面 gdbserver 调用的最终参数。
在主机上,启动与您的主机架构匹配的 NDK 预编译版本的 GDB,并将编译路径传递给它 mach 以上的 shell
$ ~/.mozbuild/android-ndk-r23c/prebuilt/linux-x86_64/bin/gdb /path/to/objdir-aarch64-linux-android/dist/bin/js
然后远程连接到 Android 设备上侦听的 GDB 服务器
$(gdb) target remote :5039
$(gdb) continue