在 macOS 上编译 Firefox

英文文档已转移: https://firefox-source-docs.mozilla.org/setup/macos_build.html

中文翻译基于此文档。

在 macOS 上 编译 Firefox

本文档将帮助您进行设置以在自己的计算机上编译 Firefox。 设置并不难,但可能要花一些时间——我们需要下载很多字节! 即使是高速互联网连接,这也可能需要花费10到15分钟的时间,而平均这些过程会花费超过一到两个小时。

详细信息在此页面的下方,但此快速入门指南应使您入门并顺利编译运行:

快速入门 (先尝试一下这个!)

必备组件

你会需要:

  1. Apple ID,用于下载和安装下面提到的 Apple 提供的开发人员工具
  2. 从5分钟到1个小时的时间下载并安装 Xcode,它很大
  3. 下载并安装特定 macOS SDK 版本的本地副本

您将需要计算机的管理员权限才能安装这些必备组件。 (您可以在系统偏好设置 -> 用户和组中验证您是否具有这些权限。)

请参阅 1.1 安装 Xcode 和 Xcode 命令行工具1.2 获取 macOS SDK,以获取有关如何安装这些必备组件的更多信息。

获取源码

首先,您需要创建一个目录并获取将完成其余工作的引导脚本:

# 引导脚本需要此目录,但是稍后您可以为 Mozilla 源码选择其他目标目录
cd ~ && mkdir -p src && cd src

# 下载引导脚本
curl https://hg.mozilla.org/mozilla-central/raw-file/default/python/mozboot/bin/bootstrap.py -o bootstrap.py

然后在您的终端从该目录中启动引导程序,如下所示:

python bootstrap.py

…并按照提示进行操作。 这将使用 mercurial 克隆源代码。 如果您更喜欢使用 git,请改用以下命令:

python bootstrap.py --vcs=git

如果您没有安装 HomebrewPorts ——软件包管理器可让我们安装一些我们需要的程序 ——将要求您选择一个。 两者都可以使用,但是大多数Mozilla开发人员都使用 Homebrew。

如果您不让 bootstrap.py 脚本为您克隆源,请确保在进行下一步之前先手动进行此操作。

编译 Firefox!

现在我们将它们联系在一起。

在终端窗口中,cd 到之前选择的 Mozilla 源目录(mozilla-unified)并键入:

# 创建一个最小的构建选项文件
echo "ac_add_options --with-macos-sdk=$HOME/SDK-archive/MacOSX10.11.sdk" >> mozconfig

./mach bootstrap

./mach build

./mach bootstrap 步骤是本文档中未涵盖的所有依赖项的全部内容。 如果您正在使用Firefox 前端或不做任何更改就构建 Firefox,请在 ./mach bootstrap 中的第一个问题中选择 Artifact Builds(神器编译)。Artifact builds 将更快完成工作!Artifact builds 不适合使用 C++ 的开发人员。

您正在路上。 如果需要一段时间,不要气馁; 即使在最快的现代计算机上也要花费一些时间,而在较旧的硬件上则要花费两个小时或更长时间。 Firefox 很大,因为 Web 很大。

现在,乐趣开始了

您已经有了代码,并已经编译了 Firefox。 用 ./mach run 启动它,您就可以开始极客之旅了。

编译步骤(详细信息)

在 macOS 上编译分为以下步骤:

  1. 在本地安装 Apple 提供的开发人员工具 —— Xcode,Xcode 命令行工具和 macOS SDK
  2. 安装额外的构建工具
  3. 获取 Mozilla 源代码的副本
  4. 配置 Mozilla 源代码树以满足您的需求
  5. 编译 Firefox

1.1 安装 Xcode 和 Xcode 命令行工具

首先,您需要安装 Xcode,您有两个选择,但是都需要使用 Apple ID 登录:

  • Apple Developer 下载页面。 安装最新版本的 Xcode(非beta版),打开 Xcode.xip然后在运行提取的 Xcode.app 之前,将其从下载文件夹移至 / Applications。 (从其他位置运行它可能会破坏各种编译路径,Homebrew 编译等。可以通过运行 sudo xcode-select-switch / Applications / Xcode.app 进行修复)
  • Mac App Store

打开 /Applications/Xcode.app,让它进行最初的首次运行和设置。

通过在终端中运行 xcode-select --install 来安装 Xcode命令行工具。

1.2 获取 macOS SDK

Firefox 当前需要 macOS 10.11 SDK 的本地副本来完成编译(所有其他应用仍将使用此SDK 的最新版本,很可能与您的 macOS 版本匹配)。

使用其他 SDK 构建 Mozilla 源代码时会遇到各种问题,因此我们建议使用此特定版本。

要获取 10.11 SDK,请首先从 Apple 开发人员的更多下载页面下载 Xcode 7.3.1。 下载完成后,挂载 .dmg 文件。 然后在终端中运行以下命令:

mkdir -p $HOME/SDK-archive
cp -a /Volumes/Xcode/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk $HOME/SDK-archive/MacOSX10.11.sdk

2. 安装额外的构建工具

Mozilla 的源代码树需要大量第三方工具和应用程序来编译。 您需要先安装这些组件,然后才能编译任何东西。

您可以选择如何安装所有这些组件。 您可以使用 Homebrew 或 Ports 等软件包管理器。 或者,您可以单独获取,编译并安装它们。 为了简化并节省时间,建议使用程序包管理器。 以下各节描述如何使用现有的软件包管理器安装软件包。 选择您喜欢的任何软件包管理器来完成这些工作。

2.1a 通过 Homebrew 安装依赖项

Homebrew 是“ macOS 缺少的软件包管理器”。 它提供了一个简单的命令行界面来安装软件包,通常通过从源代码进行编译来安装它们。

第一步是安装 Homebrew。 参见 https://brew.sh/

安装 Homebrew 后,您需要运行以下程序:

brew install yasm mercurial gawk ccache python

您还需要 Autoconf 2.13,但是默认情况下核心 Homebrew 存储库将安装较新的版本,因此在安装时需要指定版本:

brew install autoconf@2.13

如果您在尝试构建时遇到错误,则意味着您安装了另一个版本的 Autoconf,并将其用作默认版本。 要使用 Autoconf 2.13,请运行:

brew link --overwrite autoconf@2.13

2.1b 通过 MacPorts 安装依赖项

MacPorts 是 macOS 的软件包管理器。 如果您正在运行 Homebrew,则可以忽略此部分。

要安装 MacPorts,请转到其安装页面,为您的平台下载 .dmg 并进行安装。 如果您已经安装了 MacPorts,请通过运行以下命令确保它是最新的:

sudo port selfupdate
sudo port sync

这些命令中的第一个将要求您输入 root 密码。

常见错误包括:

  • sudo 不接受空白密码:在系统偏好设置中为您的帐户创建密码。
  • 找不到 port 命令:将其添加到您的路径中(请参阅下面的故障排除部分)。

使用 MacPorts 安装编译 Firefox 所需的软件包:

sudo port install libidl autoconf213 yasm

然后,随着 MacPorts 下载并安装这些软件包及其依赖项,您会看到很多输出——这将需要一段时间,所以去喝杯咖啡吧。

默认情况下,这将安装 Python 2.7,这反过来又将引入所有X11库,这可能需要一段时间才能完成安装。 您不需要任何这些库来编译 Firefox; 您可能需要考虑在安装行中添加 + no_tkinter 来安装不支持 X11 UI 软件包的 python。 这将使安装更快完成。

对于较旧版本的 Xcode(例如6.4),您可能需要使用 MacPorts 来获取正确版本的 clang,例如 clang-3.6 或更高版本。 请参阅 Core 和 Build Config 中有关 clang 的错误。

2.2 安装 Mercurial

Mozilla 的源代码托管在 Mercurial 存储库中。 您使用 Mercurial 与这些存储库进行交互。 有多种方法可在 macOS 上安装 Mercurial:

  1. 从 Selenic 安装官方版本
  2. 通过 MacPorts 安装:
sudo port install mercurial
  1. 通过 Homebrew 安装:

brew install mercurial
  1. 通过 Pip 安装:

easy_install pip && pip install mercurial

安装 Mercuria l后,请运行以下命令进行测试:

hg version

如果成功,那么恭喜! 您需要配置 Mercurial 设置以匹配其他开发人员。 请参阅使用 Mercurial  获取 Mozilla 源代码

如果此操作失败并显示错误“ValueError:unknown locale:UTF-8”,则请参阅 Mercurial Wiki 的 Unix Install 页面上的解决方法

尝试克隆存储库时,您可能会收到 HTTP 500 错误(内部服务器错误)。 这似乎是由于 Mac Mercurial 发送到服务器的原因(MacPort 和 selenic.com Mercurial 二进制文件均已观察到)。 尝试重新启动 shell,计算机或重新安装 Mercurial(按此顺序),然后在此处报告有效的方法。

3. 获取 Mozilla 源代码的副本

您可能需要阅读使用 Mercurial 获取 Mozilla 源代码以获取完整说明。

如果仅对 Firefox 开发感兴趣,请运行以下命令,该命令将在当前目录中创建一个新目录 mozilla-central,其中包含远程存储库的内容。

使用下面的命令将需要花费几分钟,因为它将通过互联网复制数百兆的数据。

hg clone https://hg.mozilla.org/mozilla-central/
cd mozilla-central

(如果您正在构建 Android 的 Firefox,则现在应该返回 Android 的编译说明。)

4. 配置编译选项

在签出的源代码树中创建一个新文件 mozconfig,其中将包含您的编译选项。 有关此文件的更多信息,请参见配置编译选项

为了快速入门,请创建包含以下内容的文件:

# Define where build files should go. This places them in the directory
# "obj-ff-dbg" under the current source directory
mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/obj-ff-dbg

# Enable debug builds
ac_add_options --enable-debug

# Use the local copy of specific version of macOS SDK compatible with Mozilla source code
ac_add_options --with-macos-sdk=$HOME/SDK-archive/MacOSX10.11.sdk

Firefox 将不再使用 gcc 4.8 或更早的版本进行编译,但是如果 PATH 中可用,则编译系统应自动选择 clang。 如果不是这种情况,则需要设置 CC 和 CXX。 例如,如果您是通过 Homebrew 安装的 Clang 9,则需要在 mozconfig 中包含它:

CC=clang-9
CXX=clang++-9

如果您使用上面链接的 Homebrew 安装的 Autoconf 2.13,则可能需要在 mozconfig 中添加以下内容:

mk_add_options AUTOCONF=/usr/local/Cellar/autoconf@2.13/2.13/bin/autoconf213

5. 编译

设置好 mozconfig 文件后,就可以编译了!

./mach build

如果编译步骤顺利进行,则应该可以在 obj-ff-dbg/dist/ 中找到已编译的应用程序。 如果使用 --enable-debug 编译浏览器,则应用程序的名称为 NightlyDebug.app。 要启动该应用程序,请尝试运行以下命令:

./mach run

编译后的应用程序也可能以您建立的分支命名。 例如,如果您更改了这些说明以获取 mozilla-1.9.2 分支,则该应用程序将命名为 Namoroka.appNamorokaDebug.app

硬件要求

没有特定的硬件要求,只要该硬件可以容纳构建 Firefox 所需的所有软件即可。 Firefox 可能需要很长时间才能完成编译,因此始终建议使用更多的 CPU,更多的 RAM 和快速磁盘。

  • 处理器:需要 Intel CPU。 不支持在 PowerPC 架构编译。
  • 内存:最小2GB RAM,建议8GB。
  • 磁盘空间:至少30GB的可用磁盘空间。

软件需求

  • 操作系统:Mac OS X 10.9或更高版本。 建议通过运行Apple菜单中的软件更新来升级到最新的版本。 您将需要管理权限才能设置您的开发环境。
  • 开发环境:Xcode。 您可以从 App Store 获取。
  • 软件包管理:MacPorts 或 Homebrew。

这些选项特定于针对 macOS 的 Mozilla 编译。 有关编译选项和 mozconfig 文件的更详细的概述,请参阅配置编译选项。 有关配置以编译通用二进制文件的特定信息,请参阅 Mac OS X 通用二进制文件

  • 编译器:Firefox 将不再使用 gcc-4.8 或更早版本编译。 需要 clang 的最新副本。

    • 关于从哪里获得 clang 有一些选择:

      • 较新版本的Xcode。 Xcode 7.0 或更高版本中的一个以及开放源代码3.6版本应该可以使用。 (Xcode 6.4 基于 clang 3.6 的预发布版本,与要求不符。)

      • 按照 clang 网站的说明获取有关如何获取它的信息。

      • 使用某些程序包管理器(请参见上文)。

    • 一旦安装了 clang,请确保它在 PATH 上,并且 configure 应该使用它。

ac_add_options 指定的以下选项是旨在添加到您的 mozconfig 文件中的行。

  • macOS SDK:选择要编译的系统标头和库的版本,以确保您编译的结果能够在较不完整的 API 可用的较旧系统上运行。 选择带有此选项的 SDK 会覆盖 /usr/include/usr/lib/System/Library 中的默认头文件和库。 通过在安装程序的“自定义”屏幕中选择“交叉开发”类别,可以在 Xcode 安装过程中将 macOS SDK 安装在 /Developer/SDK 中。
    ac_add_options --with-macos-sdk=/path/to/SDK

Official trunk builds use ``/Developer/SDKs/MacOSX10.11.sdk``. Check
```build/macosx/universal/mozconfig.common`` <https://dxr.mozilla.org/mozilla-central/source/build/macosx/cross-mozconfig.common#23>`_
for the SDK version used for official builds of any particular source
release.

Applications built against a particular SDK will usually run on
earlier versions of Mac macOS as long as they are careful not to use
features or frameworks only available on later versions. Note that
some frameworks (notably AppKit) behave differently at runtime
depending on which SDK was used at build time. This may be the source
of bugs that only appear on certain platforms or in certain builds.

对于 macOS 编译,定义如下:

  • XP_MACOSX 已定义
  • XP_UNIX 已定义
  • 未定义 XP_MACXP_MAC 已过时,并已从源代码树中删除(请参阅 Bug(281889))。 它用于经典(X之前的)Mac OS 的 CFM(non-Mach-O)编译。

在为不包含 Mac 的 Unix 平台编写代码时,需要格外小心:

#if defined(XP_UNIX) && !defined(XP_MACOSX)

故障排除

  • 如果 configure(或通常使用 clang 进行构建)失败并显示 “致命错误:找不到'stdio.h'文件”:请确保通过运行安装了 Xcode 命令行工具。 xcode-select --install 。吉尔伯特(jgilbert)发现在安装 10.9 的过程中这是必需的。
  • 对于配置阶段中的莫名其妙的错误:在 .bash_profile,.bash_rc 或用于所选 Shell 的任何配置文件中查看对 PATH 的所有修改。 删除所有修改,然后一个接一个地重新添加,可以缩小问题的范围。