构建和测试 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