MDN’s new design is in Beta! A sneak peek: https://blog.mozilla.org/opendesign/mdns-new-design-beta/

使用 Mingw32 交叉编译 Mozilla

这篇翻译不完整。请帮忙从英语翻译这篇文章

这篇文档阐述了如何使用 Linux 作为开发平台来构建 Windows 版本的 Mozilla。尽管这篇文章仅涵盖了编译 Firefox 的方法,但是编译其他的 Mozilla 项目,例如 Thunderbird 采用了相同的技术手段。

在你能运行 Windows 平台上代码的静态分析之前构建一个交叉编译器并编译 Mozilla 是很关键的。

构建一个 GCC + mingw 的交叉编译器

需求

  • GNU Binutils 2.23.1 是最低需求。更早的版本将不会正常工作。
  • GCC 4.9.0 作为 GCC 的版本。任何高于 4.5.1 版本的 GCC 都应该可以使用。
  • mingw-w64 是必须的,最好使用主干(trunk)版本。正如其名,这是一个支持 32 位和 64 位目标的 mingw 复刻。我们需要使用这个复刻是因为当前它比原始的 mingw 更好,也包含了构建 Firefox 所必须的很多补丁。Mozilla 的代码基经常添加不存在于 mingw-w64 中的新的头文件和库文件依赖。它们很快就会被上游所修复。这就是为什么最好使用主干版本来确保所有的补丁都能用。

下面的命令将确保所有必须的包都可用:

$ mkdir $HOME/mingw-w64-build
$ cd $HOME/mingw-w64-build
$ wget http://ftp.gnu.org/gnu/binutils/binutils-2.24.tar.bz2
$ tar -jxf binutils-2.24.tar.bz2
$ wget http://gcc.fyxm.net/releases/gcc-4.9.0/gcc-4.9.0.tar.bz2
$ tar -jxf gcc-4.9.0.tar.bz2
$ git clone git://git.code.sf.net/p/mingw-w64/mingw-w64

构建 Binutils

首先,交叉编译 binutils:

$ mkdir binutils-2.24-build32 && cd binutils-2.24-build32
$ ../binutils-2.24/configure --prefix=/usr/local/ --target=i686-w64-mingw32
$ make
# make install

当 binutils 安装完毕以后,将会有很多目录出现在 /usr/local 之中。其中有一个 bin/ 目录来存放二进制程序,比如 i686-w64-mingw32-as, i686-w64-mingw32-ld 等等。 值得注意的是你可以将 /usr/local 替换为你想要的位置(但是你必须在整个教程提到的地方都使用相同的位置)。同时也要确保 $PREFIX/bin 目录在你的 PATH 变量中。

安装 mingw-w64-headers

现在,你需要将 mingw 头文件安装到正确的地方。

$ mkdir mingw-w64-headers32 && cd mingw-w64-headers32
$ ../mingw-w64/mingw-w64-headers/configure --host=i686-w64-mingw32 --prefix=/usr/local/i686-w64-mingw32/ --enable-sdk=all --enable-secure-api --enable-idl
# make install

构建 GCC 本身

现在我们能够配置并构建 GCC 了。

$ mkdir gcc-4.9.0-mingw32 && cd gcc-4.9.0-mingw32
$ ../gcc-4.9.0/configure --prefix=/usr/local/ --target=i686-w64-mingw32 --with-gnu-ld --with-gnu-as --enable-languages=c,c++ --disable-multilib
$ make all-gcc
# make install-gcc

当 GCC 安装完毕以后,/usr/local/bin 中就会有更多的二进制程序。但是现在我们并没有得到一个完整的 GCC。

安装 mingw-w64-crt

我们需要在现在安装 mingw-w64 crt 包:

$ mkdir mingw-w64-crt32 && cd mingw-w64-crt32
$ ../mingw-w64/mingw-w64-crt/configure --host=i686-w64-mingw32 --prefix=/usr/local/i686-w64-mingw32/
$ make
# make install

完成 GCC 的安装

由于现在我们安装了 crt,我们就可以完成 GCC 的安装了:

$ cd gcc-4.9.0-mingw32
$ make
# make install

安装 widl(可选)

widl 是一款由 Wine 项目开发,并由 mingw-w64 提供的作为替代微软的 MIDL 的 IDL 编译器。这是构建 Mozilla 的辅助模块所必须的程序。你可以通过在你的 mozconfig 中添加 --disable-accessibility 来跳过这个步骤。

$ mkdir widl32
$ ../mingw-w64/mingw-w64-tools/widl/configure --prefix=/usr/local --target=i686-w64-mingw32
$ make
# make install

配置 Mozilla

你可以根据这里的说明来获得源代码。当你获得源代码之后,请在代码顶层目录创建一个 .mozconfig 文件。

这有一份 .mozconfig 文件的范例:

#指出是在交叉编译
export CROSS_COMPILE=1
ac_add_options --enable-application=browser
ac_add_options --target=i686-w64-mingw32
ac_add_options --enable-default-toolkit=cairo-windows
mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/../mozilla-mingw

ac_add_options  --enable-debug
ac_add_options  --disable-optimize

ac_add_options --disable-crashreporter
ac_add_options --disable-maintenance-service
ac_add_options --disable-webrtc
ac_add_options --without-intl-api
ac_add_options --disable-sandbox

# ac_add_options --disable-accessibility # 如果你没有安装 widl 的话,请去掉注释符

# 使用并行构建。根据你安装的处理器个数调整数字。
mk_add_options MOZ_MAKE_FLAGS=-j8

构建

去吧小宝贝:

./mach build

它很可能会出现失败。这是因为 mingw 构建的版本是 Tier-3 等级的,这意味着它们一直以来是没有任何担保可以正常工作的。这些问题通常会被很快的修复。你可能会在 Bugzilla 搜索这些包含了准备合并到 mozilla-central 的补丁的 bug。而且有时候也需要对 mingw-w64 进行修补。如果遇到了这种情况,请确保你在使用最新的主干版本。应对这种情况更新 Git 树并重新安装 mingw-w64 头文件和 crt 包(见上文)应该足够了, 一般来说没有必要重新安装整个 GCC 及 binutils 包。

生成 64 位程序

为了编译出 64 位的 Mozilla,操作步骤几乎是完全一致的。在上述构建工具链的说明中替换 i686-w64-mingw32 为 x86_64-w64-mingw32 作为 host 及 target 的选项并且修改 mozconfig 来构建 64 位的 Mozilla。

问题

我怎么调试编译出的 Firefox 呢?

你可以使用 Mingw 的 GDB 来在 Windows 的机器上调试编译出的 Firefox。可以从这里下载。

你同样也需要在你的用来调试的机器上下载 Mozilla 的源代码来进行代码级的调试。

 

为什么构建系统并不把我的 i686-w64-mingw32-gcc 作为交叉编译器来使用呢?

配置脚本用来判断一个编译器是否是一个交叉编译器的方法是:它能编译一个简单的 c 程序并且能够在 shell 中执行。如果结果程序是可以运行的,那么配置系统会认为这个编译器不是一个交叉编译器。但是在一些例如 Ubuntu 的 Linux 发行版上,当你安装 wine 之后,你可以直接在 shell 上运行 Windows 程序,而这会导致配置测试的失败。

 

其他问题

请在新闻组 mozilla.dev.builds 中提问。

文档标签和贡献者

 此页面的贡献者: CNAmira
 最后编辑者: CNAmira,