在 Windows 上编译 Firefox

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

中文翻译基于此文档。

在 Windows 上编译 Firefox

感谢您帮助我们在世界上最受欢迎的操作系统上构建世界上最好的浏览器。 本文档将帮助您进行设置,以在本地计算机上构建和创造属于自己的 Firefox。

设置并不难,但可能要花一些时间——我们需要下载很多字节! 即使是高速互联网连接,这也可能需要花费10到15分钟的时间,而平均这些过程会花费超过一到两个小时。

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

做好准备

要在 Windows 上编译 Firefox,您需要64位版本的 Windows 7或更高版本、以及硬盘驱动器上大约40 GB的可用空间。 通过右键单击“开始”菜单中的“计算机”,单击“属性”,然后单击“系统”,确保 Windows 7是64位版本。 在 Windows 8.1和 Windows 10上,右键单击“ Windows”菜单按钮,然后选择“系统”将显示相同的信息。 您也可以在任何Windows版本的键盘上同时按下“ Windows”和“Pause Break”按钮。

接下来,我们要打下坚实的基础:确保您了解 Windows Update 的最新信息,然后我们会继续前进。

微软提供了一些带有 Visual Studio 和代码的 Windows 映像:https://developer.microsoft.com/zh-cn/windows/downloads/virtual-machines/

Visual Studio 2019

如同 Bug 1483835 所述,Windows 默认情况下使用 clang-cl 作为编译器。 Visual Studio 作为编译工具,标头和SDK仍然是必需的。

自动化构建版本仍使用 Visual Studio 2017,因此在我们升级之前可能会有一些差异。 Bug 1581930 跟踪2019年构建中的各种问题。请在此处提交问题,如果遇到构建失败,请在此期间降级。

下载并安装 Visual Studio 2019 的社区版本。如果您拥有专业版或企业版,我们也支持它们。

安装时,必须勾选以下组件:

  • “Desktop development with C++”(在 Windows group 下)

  • “Game development with C++ ”(在 Mobile & Gaming group 下)

此外,转到“Individual Components tab”选项卡,并确保在“ SDKs, libraries, and frameworks”组下选择了以下组件:

  • “Windows 10 SDK”(最低版本为 10.0.17134.0
  • “C++ ATL for v142 build tools (x86 and x64)”(如果要为 ARM64 构建,请选择 ARM64)

确保在安装后运行一次 Visual Studio,以便它完成所有首次运行的任务并将安装与您的帐户相关联。

如果已经安装了 Visual Studio 2019,则可以通过其菜单“工具”→“获取工具和功能”进入安装程序。

其他必备工具

MozillaBuild

最后,从 Mozilla 下载 MozillaBuild 软件包。 接受默认设置,特别是默认安装目录: c:\mozilla-build\。 在某些 Windows 版本上,错误对话框将为您提供“使用正确的设置重新安装”的选项——您应该同意并继续。

完成此操作后,在桌面上创建 c:\mozilla-build\start-shell.bat 的快捷方式将使您的生活更轻松。

获取源码

这是最后一步。 在 c:\mozilla-build(或您在上面创建的快捷方式)中双击 start-shell.bat 将打开一个终端窗口。

首先在 C:\ 目录下创建一个“mozilla-source”目录,然后像下面这样 cd 进入该目录:

cd c:/

mkdir mozilla-source

cd mozilla-source

接下来,您可以使用 Mercurial 获取 Firefox 源代码。 有一个 Wiki 页面介绍如何使用 Mercurial 获取源代码,但是总而言之,如果您的网络连接足以下载1 GB以上的数据而无需中断,并且您想要主要的开发资料库,则可以使用:

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

在等待该过程完成时,请查看我们的 Mercurial 文档。 它说明了我们如何在 Mozilla 中使用版本控制软件来管理代码并更改对源代码树的更改。

编译 Firefox!

现在我们将它们联系在一起。 在终端窗口中,像以前一样 cd 进入源码目录并键入

cd mozilla-central

./mach bootstrap

./mach build

./mach bootstrap 步骤是本文档中未涵盖的所有依赖项的全部内容。请注意,引导程序仅适用于源代码的 Mercuial 存储库,不适用于源代码 tar ball 或 Github 镜像。 如果您在 Firefox 或为 Firefox for Android 前端工作,或者在不进行任何更改的情况下编译 Firefox,请在 ./mach bootstrap 中的第一个问题中选择 Artifact Builds(神器编译)。Artifact builds 将更快完成工作!Artifact builds 不适合使用 C++ 或 Rust 的开发人员。

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

你准备好了

当 mach 编译完成后,您将得到通过你硬盘驱动器上源代码编译的自制 Firefox 版本,并可以运行。 您可以使用以下命令来运行

./mach run

现在,您拥有了自己的自制 Firefox 版本。

如果您在此处看到错误,请在本文档的“疑难解答”部分中进一步查找——一些防病毒软件组织了我们的某些测试,因此您需要为“mozilla-source”和“mozilla-build”目录创建例外。 不要关闭防病毒软件!只需添加例外。

详细信息和故障排除

硬件和软件要求

Firefox 的编译过程既需要大量 I / O操作,也需要占用大量 CPU 资源,即使在现代硬件上编译也可能需要很长时间。 Mozilla 开发的最低和建议的硬件要求是:

  • 至少4 GB 的 RAM。 建议使用8 GB 或更大的容量,并且更大更好。
  • 35 GB 可用磁盘空间。 该磁盘空间可容纳 Visual Studio 2019 社区版,必需的 SDK,MozillaBuild 程序包,Mercurial 源码存储库以及足够的可用磁盘空间进行编译。 建议使用固态硬盘,因为 Firefox 的编译过程需要大量 I / O 操作。
  • 64位 Windows 7(Service Pack 1)或更高版本。 您仍然可以在64位 Windows 上编译32位 Firefox。

总览

Mozilla 编译过程需要大多数 Windows 系统上未预安装的许多工具。 除了 Visual Studio 外,还安装 MozillaBuild ——一个软件包,其中包括 bash,GNU make,autoconf,Mercurial 等所需的组件。

编译 Firefox 61+ 要求 Visual Studio 2017 Update 6 或更高版本。

使用 Visual Studio 2015 编译 Firefox 48至60。Visual Studio 2017 也可用编译 Firefox 58 或更高版本。

Firefox 37至47使用 Visual Studio 2013(VC12)以及可能支持的 Visual Studio 2015 进行编译(尽管 Visual Studio 2015 可能不能编译每个修订版)。

Firefox 的早期版本通过 Visual Studio 的早期版本编译。

安装编译所需的必备组件

请完成每个步骤,否则可能无法成功编译。以下是这些必备组件的安装说明。

  1. 通过 Windows Update 确保您的系统是最新的。
  2. 安装 Visual Studio Community 2019(免费)。或者,您也可以使用 Visual Studio 的付费版本。如上文“Visual Studio 2019”部分所述,编译 Firefox 可能需要一些其他组件。不支持 Visual Studio 的早期版本。 Firefox 代码库依赖于早期版本中不支持的 C++ 功能。
  3. 可选地,除了 VS2019,您可能还想安装 Visual C++ 2008 Express(免费)来编译编译系统中使用的一些 Python 扩展,因为默认情况下,Windows 的 Python 2.7.x 是使用该编译器编译的。请注意,如果要在本地使用“mach resource-usage”,“mach doctor”,“mach android-emulator”或运行 talos 测试,则应安装它以编译 psutil。
  4. 下载并安装包含其他编译工具的 MozillaBuild 软件包。如果您安装了 Cygwin,请阅读“提示”部分中的注释。如果看到 Windows 错误对话框,提示您可以使用“正确的设置”重新安装,请在 MozillaBuild 的安装程序退出后选择该选项,然后一切正常。 https://wiki.mozilla.org/MozillaBuild 上提供了有关 MozillaBuild 的更多信息以及较新版本的链接。

故障排除

在某些情况下,可能会出现以下问题:

一些防病毒和系统保护软件可能会大大减慢或破坏编译过程

已知 Windows Defender 和某些扫描防病毒产品会对编译时间产生重大影响。例如,如果您成功克隆了 mozilla-central,但是 ./mach build 无法报告丢失的文件,则您可能遇到了此问题。我们针对著名安全漏洞的回归测试包括一些防病毒软件将其识别为威胁的代码示例,这些示例所涉及的文件将被隔离或破坏。要解决此问题,您需要将源码目录和对象目录(mozilla-source 目录和 mozilla-build 目录)添加到 Windows Defender 或防病毒软件的允许列表中,如果缺少文件,请使用 “hg update-C” 命令。一旦完成,下一步中的 ./mach build 应该成功完成。

以不同于系统的其他语言安装 Visual Studio 可能会导致问题

  • 例如,当系统语言为英文时使用法语的 Visual Studio 会导致编译时报错并以错误提示结束。

注意:如果安装工具文件夹的路径中包含空格或其他非法字符(例如加号、引号或元字符),则 Mozilla 将不会被编译。 Visual Studio tools 和 SDKs 是一个例外——它们可能可以安装在包含空格的目录中。 但强烈建议您接受所有安装位置的默认设置。

MozillaBuild

MozillaBuild 软件包包含编译 Mozilla 所需的必备组件,包括 MSYS 编译环境、Mercurial、autoconf-2.13、CVS、Python、YASM、NSIS 和 UPX,以及可选但有用的工具,例如 wget 和 emacs。

下载最新的 MozillaBuild 软件包

默认情况下,该软件包安装到 c:\mozilla-build,建议使用默认路径。 不要使用包含空格的路径。 安装程序不会修改 Windows 注册表。 请注意,某些二进制文件可能需要运行 Visual C++ 可再发行程序包

MozillaBuild 命令提示符期望说明:请注意,MozillaBuild 提供的“类UNIX”环境仅对编译和提交 Mozilla 源代码真正有用。 您在现代 Linux 发行版中期望的大多数命令行工具都不存在,并且提供的那些工具可能已经使用了十年左右(特别是 MSYS 提供的工具)。 特别是那些古老的工具可能会引起问题,因为它们的行为通常不符合预期,存在故障或不支持多年来被认为是理所当然的命令行参数。 例如,由于 cp 版本太旧,使用 cp -rf src1 src2 复制源码树无法正常工作(它为某些文件显示“cp: will not create hard link”错误)。 简而言之,MozillaBuild 支持开发人员与 Mozilla 代码进行必要的交互,但是除此之外,如果它以各种令人兴奋和出乎意料的方式使您失望,也不要感到惊讶。

打开 MozillaBuild 命令提示符

安装必备组件后,在安装 MozillaBuild 的目录中使用 Windows 命令提示符启动 start-shell.bat 批处理文件(默认为 c:\mozilla-build)。 这将启动提示正确配置以编译 Firefox 的 MSYS/BASH 命令提示符。 所有其他命令应在此命令提示符窗口中执行。(请注意,这与您使用 Windows CMD.EXE shell 的用法不一样。)

注意:这与 Windows CMD.EXE shell 的用法不一样。

为源码创建目录

注意:如果 Firefox 源代码位于的路径中带有空格(例如“Documents and Settings”)的目录下,则将无法编译 Firefox 源代码。 您可以选择任何其他位置,例如新目录 c:/mozilla-sourcec:/thunderbird-src。 build 命令也可以容忍“c:”和“/c/”,但是前者在 Windows 命令提示符中造成混淆,后者在某些工具(至少是MOZ_OBJDIR)中被误解了。 请注意,从此处开始一直假设使用 MozillaBuild 命令提示符,因为它提供了已配置的环境和工具。

创建一个新的浅目录(例如专门用于代码的“c:/mozilla-source”)是一个明智的主意:

cd c:/; mkdir mozilla-source; cd mozilla-source

如果您遇到问题,请记住诊断提示。 现在您已经准备好获取 Firefox 源码并进行编译。

命令提示符的建议和警告

  • 要粘贴到该窗口中,必须右键单击该窗口的标题栏,将光标移至“编辑”菜单,然后单击“粘贴”。您还可以在“属性”菜单中设置“快速编辑模式”,然后右键单击该窗口以粘贴您的选择。
  • 如果已安装 Cygwin,请确保 MozillaBuild 目录位于由 start-shell-msvc2015.bat 增强的搜索路径中的任何 Cygwin 目录之前(使用 echo $ PATH 查看您的搜索路径)。
  • 在以 start-shell-msvc2015.bat 开头的 MSYS/BASH shell 中,UNIX 风格的正斜杠(/)用作路径分隔符,而不是 Windows 风格的反斜杠(\)。因此,如果要更改目录 c:\mydir 以更加清晰,可以使用 cd/c/mydir ,尽管 c:\mydirc:/mydir 都受支持。
  • 如果使用默认安装目录,则 MSYS 根目录位于 /c/mozilla-build/msys 中。最好不要在此目录下创建任何内容。而是使用类似 /c/mydir 之类的东西。

常见问题,提示和限制

  • 在 Windows 上调试 Firefox 常见问题解答:有关在 Windows 上调试 Mozilla 的建议。
  • 您安装的 MozillaBuild 可能太旧。 编译系统可能会假定您具有仅在较新版本的 MozillaBuild 中存在的新功能和错误修正。 可在此处找到有关如何更新 MozillaBuild 的说明。
  • 如果您的计算机配置了错误的体系结构,则编译可能会失败。 如果要构建64位 Firefox,请将以下两行添加到 mozconfig 文件中:
ac_add_options --target=x86_64-pc-mingw32
ac_add_options --host=x86_64-pc-mingw32
  • 如果您的 PATH 环境变量包含引号(“),则编译可能会失败。 引号传递给 MozillaBuild 子 shell 时,引号没有正确识别,通常不需要引号,因此可以将其删除。
  • 如果您设置了 PYTHON 环境变量,则编译可能会失败。 它几乎立即显示一个错误,提示“The system cannot find the file specified (系统找不到指定的文件)”。 在同一命令 shell 中运行 Mozilla 编译工具之前,键入“unset PYTHON”应该可以解决此问题。 确保未设置 PYTHON,而不是将其设置为空值。
  • 如果您安装了 Cygwin,则编译可能会失败。 确保 MozillaBuild 目录(/c/mozilla-build 和子目录)在 PATH 环境变量中的任何 Cygwin 目录之前。 如果这样做没有帮助,请从 PATH 中删除 Cygwin 目录,或尝试在没有 Cygwin 的干净 PC 上进行编译。
  • 不支持使用 NSIS 的版本(而不是 MozillaBuild 的最新受支持版本附带的版本)进行编译,否则可能会失败。
  • 如果打算将内部版本分发给其他人,请在 mozconfig 中设置 WIN32_REDIST_DIR=$VCINSTALLDIR\redist\x86\Microsoft.VC141.CRT 以获取与应用程序打包在一起的 Microsoft CRT DLLs。 请注意,确切的 .CRT 文件可能取决于您的 Visual Studio 版本。
  • Microsoft 反恶意软件可能会干扰编译,通常会在编译过程中表现为与 conftest.exe 有关的错误。 要解决此问题,请至少在反恶意软件白名单中添加排除设置。
  • 当将 intrin.h 和 windows.h 一起包含时,会遇到诸如“second C linkage of overloaded function ‘_interlockedbittestandset’ not allowed”之类的错误。 使用 #define 重新定义函数名称的一个实例。
  • 并行编译(-jN)在 Windows 上无法与 GNU make 一起使用。 您应该使用 MozillaBuild 当前版本附带的 mozmake 命令。 使用 mach 命令进行编译将始终使用最合适的 make 命令。
  • 如果遇到类似“ERROR: Cannot find makecab.exe”'的编译故障,请尝试从 bug 1383578 应用补丁,即将 SET PATH="%PATH%;!LLVMDIR!\bin" 更改为 SET "PATH=%PATH%;!LLVMDIR!\bin"
  • 如果遇到带有 LINK: fatal error LNK1181: cannot open input file ..\..\..\..\..\security\nss3.lib 报错的编译失败,则可能与您位于“用户”文件夹中(可能已加密)的 mozilla-centraling being 副本有关。 尝试将其移到“用户”文件夹之外。 文档推荐的路径 C:\mozilla-source\mozilla-central 应该可以工作。
  • 如果遇到编译错误并显示以下错误:ERROR: GetShortPathName returned a long path name.。您需要为具有空格的路径创建一个8.3文件名(8dot3name short name)。例如:fsutil file setshortname “C:\Program Files (x86)” PROGRA~2。 如果出现“access denied(访问被拒绝)”,请尝试将计算机重新启动到安全模式,然后重试。