Files
documents/firefox.md
Xu, Shunxuan 25e7bc8043 Record build firefox
修改:     README.md
	新文件:   firefox.md

Signed-off-by: Xu, Shunxuan <sxxu@linx-info.com>
2018-06-22 15:01:39 +08:00

883 lines
36 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 编译firefox38全过程
firefox编译过程需时较久建议在服务器上搭建最小环境进行编译。此处创建最小环境4.2.41-20160506
挂载dev proc sys后chroot到最小环境中。
编译流程:(在环境配置、源码、及依赖包均已准备就绪的情况下)
```
# 进入编译目录
cd gecko-dev
# 添加及修改firefox自带编译配置
vi .mozconfig
# 开始编译
./mach build
# 本地化包
# compare-locales
easy_install -U compare-locales
# build en_US package first
cd obj-linux-unknow-linux-gnu
make package
# import zh_CN files
cd obj-linux-unknow-linux-gnu/browser/locales
make merge-zh-CN LOCALE_MERGEDIR=$(pwd)/mergedir
# build zh_CN package
make installers-zh-CN LOCALE_MEGEDIR=$(pwd)/mergedir
# build zh-CN langpack not use
make langpack-zh-CN LOCALE_MERGEDIR=$(pwd)/mergedir
```
## 1 获取firefox源码
### 1.1 浏览器代码库
公司内部git库镜像
```
git@gitlab.rd.in.linx:mozilla/gecko-dev.git
```
或者github上的git库只读镜像
```
https://github.com/mozilla/gecko-dev.git
```
或者官方hg代码库
```
https://hg.mozilla.org/mozilla-central/
```
本次使用公司内部git库镜像将master分支git clone下来后选择切换到38版的最后一个esr版本。
切换到origin/GECKO3880esr_2016042017_RELBRANCH分支。
```
git checkout -b GECKO3880esr origin/GECKO3880esr_2016042017_RELBRANCH
```
GECKO38即为firefox38。
Fierfox有两种版本普通版和ESRExtended Support Release延长支持版。
ESR版本是Mozilla专门为那些无法或不愿每隔六周就升级一次的企业打造。Firefox ESR版的升级周期为42周。普通Firefox的升级周期为6周。
### 1.2 汉化包支持
由于下载后需要使用hg进行管理。
编译mercurial(hg的源码包)。
Mercurial requires Python 2.6 or later.
需安装python2.6或以上版本。
编译Python2.7.12编译安装到/usr/local下,配置环境变量后可编译通过mercurial。本次配置直接将Python2.7和之后所述的gcc5.2相关环境配置添加到.bashrc中。
```
export PATH=/usr/local/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/lib
```
使用hg clone http://hg.mozilla.org/releases/l10n/mozilla-release/zh-CN 克隆下汉化包,然后切换到对应的分支。
查找对应firefox38esr的zh_CN
```
cd zh_CN
hg tags | grep -i firefox | grep -i esr | grep 38
```
## 2 firefox编译配置
### 2.1 配置文件.mozconfig
编译firefox之前需要先配置firefox的编译配置配置文件名称.mozconfig。确定编译选项配置。
此处为编译使用的配置文件拷贝到gecko-dev目录下即可。配置文件示例
``` bash
#!/bin/bash
if [ "x$IS_NIGHTLY" = "xyes" ]; then
# Some nightlies (eg: Mulet) don't want these set.
MOZ_AUTOMATION_UPLOAD_SYMBOLS=${MOZ_AUTOMATION_UPLOAD_SYMBOLS-1}
MOZ_AUTOMATION_UPDATE_PACKAGING=${MOZ_AUTOMATION_UPDATE_PACKAGING-1}
MOZ_AUTOMATION_SDK=${MOZ_AUTOMATION_SDK-1}
fi
. "$topsrcdir/build/mozconfig.common"
# some b2g desktop builds still happen on i686 machines, and the tooltool
# toolchain is x86_64 only.
# We also deal with valgrind builds here, they don't use tooltool manifests at
# all yet.
#if [ -z "$no_tooltool" ]
#then
# CC="$topsrcdir/gcc/bin/gcc"
# CXX="$topsrcdir/gcc/bin/g++"
#
# # We want to make sure we use binutils and other binaries in the tooltool
# # package.
# mk_add_options PATH="$topsrcdir/gcc/bin:$PATH"
#else
# CC="/tools/gcc-4.7.3-0moz1/bin/gcc"
# CXX="/tools/gcc-4.7.3-0moz1/bin/g++"
#fi
#禁用破解,禁止为节省几毫秒而减少二进制的大小
ac_add_options --disable-elf-hack
#禁用编译选项pluseaudio
ac_add_options --disable-pulseaudio
# Avoid dependency on libstdc++ 4.7
ac_add_options --enable-stdcxx-compat
#指定编译本地化汉化包目录
ac_add_options --with-l10n-base=$topsrcdir/../zh-CN
ac_add_options --with-google-api-keyfile=/builds/gapi.data
# 关闭升级
ac_add_options --disable-updater
# 指定编译 firefox
ac_add_options --enable-application=browser
#add this application name will be firefox not nightly
#avliable are
#aurora
#nightly
#official
#unofficial
# 指定编译的版本
export MOZILLA_OFFICIAL=1
export MOZ_APP_DISPLAYNAME=firefox
mk_add_options MOZ_MAKE_FLAGS="-j16"
mk_add_options AUTOCONF=autoconf2.13
# $topsrcdir/gtk3 comes from tooltool, when the tooltool manifest contains it.
if [ -d "$topsrcdir/gtk3" ]; then
# PKG_CONFIG_LIBDIR is appropriately overridden in mozconfig.linux32
export PKG_CONFIG_LIBDIR=/usr/lib64/pkgconfig:/usr/share/pkgconfig
export PKG_CONFIG_SYSROOT_DIR="$topsrcdir/gtk3"
export PKG_CONFIG_PATH="$topsrcdir/gtk3/usr/local/lib/pkgconfig"
export PATH="$topsrcdir/gtk3/usr/local/bin:${PATH}"
# Ensure cairo, gdk-pixbuf, etc. are not taken from the system installed packages.
LDFLAGS="-L$topsrcdir/gtk3/usr/local/lib"
mk_add_options "export LD_LIBRARY_PATH=$topsrcdir/gtk3/usr/local/lib"
ac_add_options --enable-default-toolkit=cairo-gtk3
fi
export SOCORRO_SYMBOL_UPLOAD_TOKEN_FILE=/builds/crash-stats-api.token
mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/obj-@CONFIG_GUESS@
#选择编译器2级优化. 在大多数情况下, 这个选项可能不会得到预期的结果, 除非你对 Mozilla 的代码非常了解.
ac_add_options --enable-optimize=-O2
#使能调试宏和其它用于调试的代码. 这个选项会显著的拉长编译时间, 但是在写补丁程序的时候会非常有用
ac_add_options --enable-debug
#在源码树上还有许多可选的代码, 这些代码放在 目录下. 许多扩展现在被认为使浏览器的一部分. 对每一个suit有一个默认的extetions清单并且对每一个应用细节mozconfig都会指定一个不同的设置。一些extensions不是对每一个应用都是兼容的。举例说明cookie 和thunderbird是不兼容的。typeaheadfind和任何toolkit应用都不兼容。除非你知道哪个extensions和哪个应用相兼容否则不要用--enable-extensions选项build系统将会为extensions自动的选择合适的设置.
ac_add_options --enable-extensions=default
#禁止编译pulseaudio相关
ac_add_options --disable-pulseaudio
#禁止升级
ac_add_options --disable-updater
#
ac_add_options --enable-strip
ac_add_options --enable-install-strip
ac_add_options --enable-official-branding
ac_add_options --enable-safe-browsing
ac_add_options --enable-system-cairo
ac_add_options --enable-system-ffi
ac_add_options --enable-system-pixman
ac_add_options --with-pthreads
#启用ccache便于编译调试
ac_add_options --with-ccache=/usr/bin/ccache
ac_add_options --with-system-bz2
ac_add_options --with-system-zlib
# Package js shell.
export MOZ_PACKAGE_JSSHELL=1
. "$topsrcdir/build/mozconfig.common.override"
```
### 2.2 配置ccache
由于firefox编译过程用时较长建议配置ccache可更快调试编译firefox。
首先配置环境变量:
```
export CCACHE_COMPRESS=""
```
然后配置firefox编译配置文件.mozconfig打开ccache配置选项。
```
#启用ccache便于编译调试
ac_add_options --with-ccache=/usr/bin/ccache
```
## 3 编译过程及报错解决办法
此段详细记录了编译过程中遇到的报错及解决报错问题的方法。
### 3.1 autoconf-2.13问题
准备好环境和源码包后
```
linx:~/gecko-dev # ./mach build/
We're assuming the 'build/' command is 'build' and we're executing it for you.
0:00.73 /usr/bin/make -f client.mk -s
0:01.26 client.mk:201: /root/gecko-dev/obj-x86_64-unknown-linux-gnu/.mozconfig.mk: 没有那个文件或目录
0:01.73 Clobber not needed.
0:03.21 Adding client.mk options from :
0:03.21 MOZ_OBJDIR=/root/gecko-dev/obj-x86_64-unknown-linux-gnu
0:03.21 OBJDIR=/root/gecko-dev/obj-x86_64-unknown-linux-gnu
0:03.23 /root/gecko-dev/client.mk:304: *** Could not find autoconf 2.13。 停止。
0:03.23 make: *** [build] 错误 2
0:03.25 0 compiler warnings present.
0:03.25 Failed to parse ccache stats output: cache hit 0
linx:~/gecko-dev # ./mach build
0:00.31 /usr/bin/make -f client.mk -s
0:01.79 Adding client.mk options from :
0:01.79 MOZ_OBJDIR=/root/gecko-dev/obj-x86_64-unknown-linux-gnu
0:01.79 OBJDIR=/root/gecko-dev/obj-x86_64-unknown-linux-gnu
0:01.81 /root/gecko-dev/client.mk:304: *** Could not find autoconf 2.13。 停止。
0:01.81 make: *** [build] 错误 2
0:01.83 0 compiler warnings present.
0:01.84 Failed to parse ccache stats output: cache hit 0
linx:~/gecko-dev # ls build/
```
解决:
借鉴如下,网上资料:
```
wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.13.tar.gz
tar -xvzf autoconf-2.13.tar.gz
cd autoconf-2.13/
./configure --program-suffix=2.13
make
sudo make install
You may need to export AUTOCONF=autoconf2.13 in your environment (e.g. put it in .profile in your home directory) or add this line to your .mozconfig file:
```
修改为autoconf2.13进行编译,安装到/usr/local下,并在安装目录创建软链接 ln -s autoconf2.13 autoconf
在.mozconfig中配置autoconf2.13
```
mk_add_options AUTOCONF=autoconf2.13
```
### 3.2 .mozconfig 里设置字体位置
```
configure:1177: checking host system type
0:06.68 configure:1198: checking target system type
0:06.68 configure:1216: checking build system type
0:06.68 configure:1295: checking for mawk
0:06.68 configure:1295: checking for gawk
0:06.68 configure:1380: checking for python2.7
0:06.68 configure:1490: checking Python environment is Mozilla virtualenv
0:06.68 configure: error: Invalid value --with-l10n-base, /root/gecko-dev/../l10n-central doesn't exist
0:06.68 *** Fix above errors and then restart with\
0:06.68 "/usr/bin/make -f client.mk build"
0:06.68 make[2]: *** [configure] Error 1
0:06.69 make[1]: *** [/root/gecko-dev/obj-x86_64-unknown-linux-gnu/Makefile] Error 2
0:06.69 make: *** [build] Error 2
0:06.72 0 compiler warnings present.
0:06.72 Failed to parse ccache stats output: cache hit 0
linx:~/gecko-dev # ls
```
解决:
注意字体包目录的位置以下为例gecko-dev在/root下zh-CN在/root/zh-CN下
```
linx:~/gecko-dev # pwd
/root/gecko-dev
linx:~/gecko-dev # cd ../zh-CN/zh-CN/
linx:~/zh-CN/zh-CN # pwd
/root/zh-CN/zh-CN
```
在.mozconfig中配置指定字体位置
```
ac_add_options --with-l10n-base=$topsrcdir/../zh-CN
```
### 3.3. gcc版本升级
```
0:04.04 configure:3787: checking for otool
0:04.04 configure: error: Only GCC 4.7 or newer supported
0:04.04 *** Fix above errors and then restart with\
0:04.04 "/usr/bin/make -f client.mk build"
0:04.04 make[2]: *** [configure] Error 1
0:04.04 make[1]: *** [/root/gecko-dev/obj-x86_64-unknown-linux-gnu/Makefile] Error 2
0:04.04 make: *** [build] Error 2
0:04.09 0 compiler warnings present.
0:05.09 Failed to parse ccache stats output: cache hit
```
解决:
由于有编译好的可用的gcc-5.2故安装gcc-5.2。并配置环境变量。
安装gcc-5.2到/usr/lolcal下需要配置环境变量。
```
export PATH=/usr/local/gcc-5.2/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/gcc-5.2/lib64:$LD_LIBRARY_PATH
```
### 3.4 libffi >= 3.0.9 (编译依赖,运行依赖)
```
0:11.11 configure:15516: checking for BZ2_bzread in -lbz2
0:11.11 configure:15535: /usr/bin/ccache gcc -o conftest -std=gnu99 -fgnu89-inline -fno-strict-aliasing -ffunction-sections -fdata-sections -fno-math-errno -pthread -lpthread -Wl,-z,noexecstack -Wl,-z,text -Wl,--build-id conftest.c -lbz2 -ldl 1>&5
0:11.11 configure:15967: checking for pkg-config
0:11.11 configure:16011: checking for libffi >= 3.0.9
0:11.11 configure: error: Library requirements (libffi >= 3.0.9) not met; consider adjusting the PKG_CONFIG_PATH environment variable if your libraries are in a nonstandard prefix so pkg-config can find them.
0:11.11 *** Fix above errors and then restart with\
0:11.11 "/usr/bin/make -f client.mk build"
0:11.11 make[2]: *** [configure] 错误 1
0:11.11 make[1]: *** [/root/gecko-dev/obj-x86_64-unknown-linux-gnu/Makefile] 错误 2
0:11.11 make: *** [build] 错误 2
0:11.14 0 compiler warnings present.
0:12.14 Failed to parse ccache stats output: cache hit 0
linx:~/gecko-dev #
```
解决:
直接在当前最小环境下编译即可。
创建libffi目录在目录下下载源码libffi-3.2.1.tar.gz然后mkpkgfile再进行编译即可。
安装需要 -f 参数安装。
```
linx:~/libffi # pkgadd libffi#3.2.1-x86_64-linx-Rocky4.2.pkg.tar.gz
usr/lib64/libffi.a
usr/lib64/libffi.la
usr/lib64/libffi.so
usr/share/info/dir
pkgadd: listed file(s) already installed (use -f to ignore and overwrite)
```
### 3.5 gtk-2.18 (编译依赖,运行依赖)
```
0:09.46 configure:16018: checking MOZ_FFI_CFLAGS
0:09.46 configure:16023: checking MOZ_FFI_LIBS
0:09.46 configure:16236: checking for application to build
0:09.46 configure:16394: checking if app-specific confvars.sh exists
0:09.46 configure:17404: checking for gtk+-2.0 >= 2.18.0 gtk+-unix-print-2.0 glib-2.0 >= 2.22 gobject-2.0 gdk-x11-2.0
0:09.46 configure: error: Library requirements (gtk+-2.0 >= 2.18.0 gtk+-unix-print-2.0 glib-2.0 >= 2.22 gobject-2.0 gdk-x11-2.0) not met; consider adjusting the PKG_CONFIG_PATH environment variable if your libraries are in a nonstandard prefix so pkg-config can find them.
0:09.46 *** Fix above errors and then restart with\
0:09.46 "/usr/bin/make -f client.mk build"
0:09.46 make[2]: *** [configure] 错误 1
0:09.46 make[1]: *** [/root/gecko-dev/obj-x86_64-unknown-linux-gnu/Makefile] 错误 2
0:09.46 make: *** [build] 错误 2
0:09.49 0 compiler warnings present.
0:10.49 Failed to parse ccache stats output: cache hit 45
linx:~/gecko-dev # ls
```
需直接在当前环境下进行编译gtk2-2.18.9
注意需使用我们的applications.git库中的编译目录及方法进行。去掉Pkgfile中gtkclipboard.patch
pkgadd -u gtk2... 安装。
注意此包的lib64下的库文件在最后打包firefox时需要添加到firefox包中。
### 3.6 pango >= 1.22.0(编译依赖,运行依赖)
```
0:09.45 configure:17411: checking MOZ_GTK2_CFLAGS
0:09.45 configure:17416: checking MOZ_GTK2_LIBS
0:09.45 configure:18883: checking for pango >= 1.22.0
0:09.45 configure: error: Library requirements (pango >= 1.22.0) not met; consider adjusting the PKG_CONFIG_PATH environment variable if your libraries are in a nonstandard prefix so pkg-config can find them.
0:09.45 *** Fix above errors and then restart with\
0:09.45 "/usr/bin/make -f client.mk build"
0:09.45 make[2]: *** [configure] 错误 1
0:09.45 make[1]: *** [/root/gecko-dev/obj-x86_64-unknown-linux-gnu/Makefile] 错误 2
0:09.45 make: *** [build] 错误 2
0:09.48 0 compiler warnings present.
0:10.49 Failed to parse ccache stats output: cache hit 90
linx:~/gecko-dev # pkginfo -i |grep pango
```
此包编译方法与上述gtk2编译相同。此处编译pango-1.26.2
注意此包的lib64下的库文件在最后打包firefox时需要添加到firefox包中。
### 3.7 cairo >= 1.10
```
0:09.52 ------ config.log ------
0:09.52 configure:26618: checking _FONTCONFIG_LIBS
0:09.52 configure:26764: checking for pixman-1 >= 0.19.2
0:09.52 configure:26771: checking PIXMAN_CFLAGS
0:09.53 configure:26776: checking PIXMAN_LIBS
0:09.53 configure:26817: checking for stdint.h
0:09.53 configure:26830: /usr/bin/ccache gcc -c -std=gnu99 -fgnu89-inline -fno-strict-aliasing -ffunction-sections -fdata-sections -fno-math-errno -pthread -pipe conftest.c 1>&5
0:09.53 configure:26817: checking for inttypes.h
0:09.53 configure:26830: /usr/bin/ccache gcc -c -std=gnu99 -fgnu89-inline -fno-strict-aliasing -ffunction-sections -fdata-sections -fno-math-errno -pthread -pipe conftest.c 1>&5
0:09.53 configure:26817: checking for sys/int_types.h
0:09.53 configure:26830: /usr/bin/ccache gcc -c -std=gnu99 -fgnu89-inline -fno-strict-aliasing -ffunction-sections -fdata-sections -fno-math-errno -pthread -pipe conftest.c 1>&5
0:09.53 configure:26824:27: fatal error: sys/int_types.h: No such file or directory
0:09.53 compilation terminated.
0:09.53 configure: failed program was:
0:09.53 #line 26822 "configure"
0:09.53 #include "confdefs.h"
0:09.53
0:09.53 #include <sys/int_types.h>
0:09.53 int main() {
0:09.53
0:09.53 ; return 0; }
0:09.53 configure:27084: checking for cairo >= 1.10
0:09.53 configure:27091: checking CAIRO_CFLAGS
0:09.53 configure:27096: checking CAIRO_LIBS
0:09.53 configure:27177: checking for cairo-tee >= 1.10
0:09.53 configure: error: Library requirements (cairo-tee >= 1.10) not met; consider adjusting the PKG_CONFIG_PATH environment variable if your libraries are in a nonstandard prefix so pkg-config can find them.
0:09.53 *** Fix above errors and then restart with\
0:09.53 "/usr/bin/make -f client.mk build"
0:09.53 make[2]: *** [configure] Error 1
0:09.53 make[1]: *** [/root/gecko-dev/obj-x86_64-unknown-linux-gnu/Makefile] Error 2
0:09.53 make: *** [build] Error 2
0:09.54 0 compiler warnings present.
0:10.54 Failed to parse ccache stats output: cache hit 191
linx:~/gecko-dev # echo $PATH
```
需在干净的虚拟机环境下编译此包在编firefox的环境中编译失败。
使用git库中的cairo包即可在configure的选项后添加"--enable-tee"进行编译。然后升级安装。
### 3.8 需修改源码内容的编译失败报错
```
0:09.49 host_stdc++compat.o
0:09.80 /root/gecko-dev/build/unix/stdc++compat/stdc++compat.cpp:49:86: error: no member function '_S_construct_aux_2' declared in 'std::__cxx11::basic_string<char>'
0:09.80 template char *string::_S_construct_aux_2(size_type, char, allocator<char> const&);
0:09.80 ^
0:09.80 /root/gecko-dev/build/unix/stdc++compat/stdc++compat.cpp:51:96: error: no member function '_S_construct_aux_2' declared in 'std::__cxx11::basic_string<wchar_t>'
0:09.80 template wchar_t *wstring::_S_construct_aux_2(size_type, wchar_t, allocator<wchar_t> const&);
0:09.80 ^
0:09.88 In the directory /root/gecko-dev/obj-x86_64-unknown-linux-gnu/build/unix/stdc++compat
0:09.88 The following command failed to execute properly:
0:09.88 c++ -o host_stdc++compat.o -c -std=gnu++0x -MD -MP -MF .deps/host_stdc++compat.o.pp -DMOZ_LIBSTDCXX_VERSION=197653 -I/root/gecko-dev/build/unix/stdc++compat -I. -I../../../dist/include -I/root/gecko-dev/obj-x86_64-unknown-linux-gnu/dist/include/nspr /root/gecko-dev/build/unix/stdc++compat/stdc++compat.cpp
0:09.88 make[5]: *** [host_stdc++compat.o] Error 1
0:09.88 make[4]: *** [build/unix/stdc++compat/host] Error 2
0:09.88 make[3]: *** [export] Error 2
0:09.88 make[2]: *** [default] Error 2
0:09.88 make[1]: *** [realbuild] Error 2
0:09.88 make: *** [build] Error 2
0:09.93 0 compiler warnings present.
0:10.93 Failed to parse ccache stats output: cache hit 359
linx:~/gecko-dev #
```
解决:
参考链接https://bugzilla.mozilla.org/show_bug.cgi?id=1153109
修改方法
```
diff --git a/configure.in b/configure.in
index ef7a2b5..b529002 100644
--- a/configure.in
+++ b/configure.in
@@ -7431,6 +7431,8 @@ if test -n "$STDCXX_COMPAT"; then
eval $(CXX="$CXX" HOST_CXX="$HOST_CXX" $PYTHON -m mozbuild.configure.libstdcxx)
AC_SUBST(MOZ_LIBSTDCXX_TARGET_VERSION)
AC_SUBST(MOZ_LIBSTDCXX_HOST_VERSION)
+ CXXFLAGS="$CXXFLAGS -D_GLIBCXX_USE_CXX11_ABI=0"
+ HOST_CXXFLAGS="$HOST_CXXFLAGS -D_GLIBCXX_USE_CXX11_ABI=0"
fi
dnl ========================================================
```
### 3.9 需修改源码内容的编译失败报错
```
0:21.89 In file included from /root/gecko-dev/obj-x86_64-unknown-linux-gnu/tools/profiler/Unified_cpp_tools_profiler0.cpp:56:0:
0:21.89 /root/gecko-dev/tools/profiler/LulElf.cpp: In function 'bool lul::ElfClassBuildIDNoteIdentifier(const void*, int, uint8_t*)':
0:21.89 /root/gecko-dev/tools/profiler/LulElf.cpp:923:32: error: 'NT_GNU_BUILD_ID' was not declared in this scope
0:21.89 if (note_header->n_type == NT_GNU_BUILD_ID)
0:21.89 ^
0:21.90 In the directory /root/gecko-dev/obj-x86_64-unknown-linux-gnu/tools/profiler
0:21.90 The following command failed to execute properly:
0:21.91 /usr/bin/ccache c++ -o Unified_cpp_tools_profiler0.o -c -I../../dist/stl_wrappers -I../../dist/system_wrappers -include /root/gecko-dev/config/gcc_hidden.h -DSTATIC_EXPORTABLE_JS_API -DMOZILLA_INTERNAL_API -DIMPL_LIBXUL -DMOZ_GLUE_IN_PROGRAM -DAB_CD=en-US -DNO_NSPR_10_SUPPORT -I/root/gecko-dev/tools/profiler -I. -I/root/gecko-dev/docshell/base -I/root/gecko-dev/ipc/chromium/src -I/root/gecko-dev/mozglue/linker -I/root/gecko-dev/toolkit/crashreporter/google-breakpad/src -I/root/gecko-dev/xpcom/base -I../../dist/include -I/root/gecko-dev/obj-x86_64-unknown-linux-gnu/dist/include/nspr -I/root/gecko-dev/obj-x86_64-unknown-linux-gnu/dist/include/nss -I/usr/include/pixman-1 -fPIC -DMOZILLA_CLIENT -include ../../mozilla-config.h -MD -MP -MF .deps/Unified_cpp_tools_profiler0.o.pp -Wall -Wempty-body -Woverloaded-virtual -Wsign-compare -Wwrite-strings -Wno-invalid-offsetof -Wcast-align -fno-exceptions -fno-strict-aliasing -fno-rtti -ffunction-sections -fdata-sections -fno-exceptions -fno-math-errno -std=gnu++0x -pthread -D_GLIBCXX_USE_CXX11_ABI=0 -pipe -DDEBUG -DTRACING -g -O2 -fno-omit-frame-pointer /root/gecko-dev/obj-x86_64-unknown-linux-gnu/tools/profiler/Unified_cpp_tools_profiler0.cpp
0:21.91 make[5]: *** [Unified_cpp_tools_profiler0.o] Error 1
0:21.91 make[4]: *** [tools/profiler/target] Error 2
0:21.91 make[4]: *** Waiting for unfinished jobs....
```
解决:
修改方法
```
--- a/tools/profiler/LulElf.cpp
+++ b/tools/profiler/LulElf.cpp
@@ -899,6 +899,10 @@ bool FindElfSegment(const void *elf_mapped_base,
return false;
}
+#ifndef NT_GNU_BUILD_ID
+# define NT_GNU_BUILD_ID 3
+#endif
+
// (derived from)
// file_id.cc: Return a unique identifier for a file
```
### 3.10 需修改源码内容的编译失败报错
```
0:17.35 cd params; /usr/bin/make libs
0:17.35 /root/gecko-dev/security/sandbox/linux/Sandbox.cpp: In function 'void mozilla::SetMediaPluginSandbox(const char*)':
0:17.35 /root/gecko-dev/security/sandbox/linux/Sandbox.cpp:463:54: error: 'O_CLOEXEC' was not declared in this scope
0:17.36 gMediaPluginFileDesc = open(aFilePath, O_RDONLY | O_CLOEXEC);
0:17.36 ^
0:17.37 In the directory /root/gecko-dev/obj-x86_64-unknown-linux-gnu/security/sandbox/linux
0:17.37 The following command failed to execute properly:
0:17.37 /usr/bin/ccache c++ -o Sandbox.o -c -I../../../dist/system_wrappers -include /root/gecko-dev/config/gcc_hidden.h -DNS_NO_XPCOM -DMOZ_GLUE_IN_PROGRAM -DAB_CD=en-US -DNO_NSPR_10_SUPPORT -I/root/gecko-dev/security/sandbox/linux -I. -I/root/gecko-dev/security/sandbox/chromium-shim -I/root/gecko-dev/security/sandbox/chromium -I/root/gecko-dev/nsprpub -I../../../dist/include -I/root/gecko-dev/obj-x86_64-unknown-linux-gnu/dist/include/nspr -I/root/gecko-dev/obj-x86_64-unknown-linux-gnu/dist/include/nss -I/usr/include/pixman-1 -fPIC -DMOZILLA_CLIENT -include ../../../mozilla-config.h -MD -MP -MF .deps/Sandbox.o.pp -Wall -Wempty-body -Woverloaded-virtual -Wsign-compare -Wwrite-strings -Wno-invalid-offsetof -Wcast-align -fno-exceptions -fno-strict-aliasing -fno-rtti -ffunction-sections -fdata-sections -fno-exceptions -fno-math-errno -std=gnu++0x -pthread -D_GLIBCXX_USE_CXX11_ABI=0 -pipe -DDEBUG -DTRACING -g -O2 -fno-omit-frame-pointer /root/gecko-dev/security/sandbox/linux/Sandbox.cpp
0:17.37 make[5]: *** [Sandbox.o] Error 1
0:17.37 make[4]: *** [security/sandbox/linux/target] Error 2
0:17.37 make[4]: *** Waiting for unfinished jobs....
```
解决:
修改方法
```
--- a/security/sandbox/linux/Sandbox.cpp
+++ b/security/sandbox/linux/Sandbox.cpp
@@ -32,6 +32,10 @@
#include "sandbox/linux/services/android_ucontext.h"
#endif
+#ifndef O_CLOEXEC
+#define O_CLOEXEC 0x1000000
+#endif
+
#ifdef MOZ_ASAN
// Copy libsanitizer declarations to avoid depending on ASAN headers.
// See also bug 1081242 comment #4.
```
### 3.11 升级binutils到2.21以及升级libtool-2.4.6
```
0:11.63 /root/gecko-dev/config/rules.mk:1512: warning: overriding commands for target `../../../dist/bin/modules/LoginManagerParent.jsm'
0:11.63 /root/gecko-dev/config/rules.mk:1447: warning: ignoring old commands for target `../../../dist/bin/modules/LoginManagerParent.jsm'
0:15.16 make[6]: warning: -jN forced in submake: disabling jobserver mode.
0:15.16 Note: rebuild with "/usr/bin/make VERBOSE=1 " to show all compiler parameters.
0:15.17 /usr/bin/make[6]: Making `all' in `stubdata'
0:15.17 /usr/bin/make[6]: Making `all' in `common'
0:15.24 /usr/bin/make[6]: Making `all' in `i18n'
0:15.34 /usr/bin/make[6]: Making `all' in `tools'
0:15.35 /usr/bin/make[7]: Making `all' in `toolutil'
0:15.37 /usr/bin/make[7]: Making `all' in `ctestfw'
0:15.38 /usr/bin/make[7]: Making `all' in `makeconv'
0:15.39 /usr/bin/make[7]: Making `all' in `genrb'
0:15.41 /usr/bin/make[7]: Making `all' in `genbrk'
0:15.42 /usr/bin/make[7]: Making `all' in `gencnval'
0:15.43 /usr/bin/make[7]: Making `all' in `gensprep'
0:15.43 /usr/bin/make[7]: Making `all' in `icuinfo'
0:15.45 /usr/bin/make[7]: Making `all' in `genccode'
0:15.45 /usr/bin/make[7]: Making `all' in `gencmn'
0:15.46 /usr/bin/make[7]: Making `all' in `icupkg'
0:15.47 /usr/bin/make[7]: Making `all' in `pkgdata'
0:15.48 /usr/bin/make[7]: Making `all' in `gentest'
0:15.48 /usr/bin/make[7]: Making `all' in `gennorm2'
0:15.49 /usr/bin/make[7]: Making `all' in `gencfu'
0:15.50 /usr/bin/make[7]: Making `all' in `gendict'
0:15.52 /usr/bin/make[6]: Making `all' in `data'
0:15.65 SkBlitRow_opts_SSE4_x64_asm.o
0:15.66 SkBitmapProcState_matrixProcs.o
0:15.67 SkBlitter_A8.o
0:15.68 /root/gecko-dev/gfx/skia/trunk/src/opts/SkBlitRow_opts_SSE4_x64_asm.S: Assembler messages:
0:15.68 /root/gecko-dev/gfx/skia/trunk/src/opts/SkBlitRow_opts_SSE4_x64_asm.S:103: Error: suffix or operands invalid for `pblendvb'
0:15.68 /root/gecko-dev/gfx/skia/trunk/src/opts/SkBlitRow_opts_SSE4_x64_asm.S:132: Error: suffix or operands invalid for `pblendvb'
0:15.68 /root/gecko-dev/gfx/skia/trunk/src/opts/SkBlitRow_opts_SSE4_x64_asm.S:184: Error: suffix or operands invalid for `pblendvb'
0:15.68 /root/gecko-dev/gfx/skia/trunk/src/opts/SkBlitRow_opts_SSE4_x64_asm.S:225: Error: suffix or operands invalid for `pblendvb'
0:15.68 /root/gecko-dev/gfx/skia/trunk/src/opts/SkBlitRow_opts_SSE4_x64_asm.S:289: Error: suffix or operands invalid for `pblendvb'
0:15.68 /root/gecko-dev/gfx/skia/trunk/src/opts/SkBlitRow_opts_SSE4_x64_asm.S:314: Error: suffix or operands invalid for `pblendvb'
0:15.68 /root/gecko-dev/gfx/skia/trunk/src/opts/SkBlitRow_opts_SSE4_x64_asm.S:350: Error: suffix or operands invalid for `pblendvb'
0:15.68 /root/gecko-dev/gfx/skia/trunk/src/opts/SkBlitRow_opts_SSE4_x64_asm.S:387: Error: suffix or operands invalid for `pblendvb'
0:15.68 SkBlitter_ARGB32.o
0:15.68 /root/gecko-dev/gfx/skia/trunk/src/opts/SkBlitRow_opts_SSE4_x64_asm.S:412: Error: suffix or operands invalid for `pblendvb'
0:15.68 /root/gecko-dev/gfx/skia/trunk/src/opts/SkBlitRow_opts_SSE4_x64_asm.S:448: Error: suffix or operands invalid for `pblendvb'
0:15.68 make[5]: *** [SkBlitRow_opts_SSE4_x64_asm.o] Error 1
0:15.68 make[5]: *** Waiting for unfinished jobs....
```
解决:
升级binutils和libtool。
编译binutils-2.21到/usr/local/下改名为binutils2.11#2.11-...tar.gz
libtool-2.4.6直接在本环境下mkpkgfile然后pkgmk编译即可。
### 3.12 编译完成
综上,成功编译完成。
## 4 打包及本地化
编译完成后需先将编译结果打包成en_US版firefox然后再将其添加zh_CN并打包成zh_CN版的firefox包最后需将包解压并修改启动文件库和替换gtk/pango的库打包制作成我们的pkg包。
## 4.1 打包en_US版firefox
### 4.1.1 compare-locales
```
easy_install -U compare-locales
```
默认会使用Python2.5对应的easy_install但是本环境配置使用Python2.7故需在本环境配置下重新编译python-setuptools。即使用applications库中的源码在本环境下编译即可注意需修改包名并将其编译安装到/usr/local下。
由于执行easy_install连接不到python的官网故手动编译compare-locales安装包。在本环境下下载compare-locales-1.0然后mkpkgfile在Pkgfile中python setup.py install指定编译安装到/usr/local中。
安装python-setuptools和compare-locales后执行如下
```
linx:~/python-setuptools # easy_install -U compare-locales
Searching for compare-locales
Reading http://pypi.python.org/simple/compare-locales/
Download error: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590) -- Some packages may not be found!
Reading http://pypi.python.org/simple/compare-locales/
Download error: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590) -- Some packages may not be found!
Couldn't retrieve index page for 'compare-locales'
Scanning index of all packages (this may take a while)
Reading http://pypi.python.org/simple/
Download error: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590) -- Some packages may not be found!
Best match: compare-locales 1.0
Adding compare-locales 1.0 to easy-install.pth file
Installing compare-web-app script to /usr/local/bin
Installing compare-dirs script to /usr/local/bin
Installing compare-locales script to /usr/local/bin
Using /usr/local/lib/python2.7/site-packages
Processing dependencies for compare-locales
Finished processing dependencies for compare-locales
linx:~/python-setuptools #
```
### 4.1.2 生成en_US版firefox
执行如下命令,打包。
```
cd obj-x86_64-unknown-linux-gnu
make package
```
执行过后在obj-x86_64-unknown-linux-gnu/dist中会生成firefox-38.8.0.en-US.linux-x86_64.tar.bz2但是查看发现此包大小不对打包失败。当前目录下已经生成firefox的目录。
查看make package的打包过程。找到如下打包命令
```
cd ../../dist && (cd firefox && /root/gecko-dev/obj-x86_64-unknown-linux-gnu/_virtualenv/bin/python /root/gecko-dev/config/createprecomplete.py) && gnutar -c --owner=0 --group=0 --numeric-owner --mode=go-w --exclude=.mkdir.done -f - firefox | bzip2 -vf > firefox-38.8.0.en-US.linux-x86_64.tar.bz2
#
```
打包使用的是gnutar的命令。此命令打包失败。备份此命令然后创建软件接指向tar命令然后重新打包。
```
mv /bin/gnutar{,.bak}
ln -s /bin/tar /bin/gnutar
cd obj-x86_64-unknown-linux-gnu
make package
```
打包成功。
## 4.2 制作zh_CN版firefox
打包en_US后即可打包制作zh_CN版。执行如下
```
cd obj-x86_64-unknown-linux-gnu/browser/locales
#import zh-CN files
make merge-zh-CN LOCALE_MERGEDIR=$(pwd)/mergedir
#build zh-CN package
make installers-zh-CN LOCALE_MERGEDIR=$(pwd)/mergedir
#build zh-CN langpack not use
make langpack-zh-CN LOCALE_MERGEDIR=$(pwd)/mergedir
```
此处制作过程中曾出现报错原因时easy_install那一步寻找使用的python2.5中的模块,导致此时报错,如下:
```
linx:~/gecko-dev/obj-x86_64-unknown-linux-gnu/browser/locales # make merge-zh-CN LOCALE_MERGEDIR=$(pwd)/mergedir
rm -f -rf /root/gecko-dev/obj-x86_64-unknown-linux-gnu/browser/locales/mergedir
MACOSX_DEPLOYMENT_TARGET= compare-locales -m /root/gecko-dev/obj-x86_64-unknown-linux-gnu/browser/locales/mergedir /root/gecko-dev/browser/locales/l10n.ini /root/zh-CN zh-CN
Traceback (most recent call last):
File "/usr/bin/compare-locales", line 8, in <module>
load_entry_point('compare-locales==1.0', 'console_scripts', 'compare-locales')()
File "/usr/lib/python2.5/site-packages/pkg_resources.py", line 277, in load_entry_point
return get_distribution(dist).load_entry_point(group, name)
File "/usr/lib/python2.5/site-packages/pkg_resources.py", line 2180, in load_entry_point
return ep.load()
File "/usr/lib/python2.5/site-packages/pkg_resources.py", line 1913, in load
entry = __import__(self.module_name, globals(),globals(), ['__name__'])
File "/usr/lib/python2.5/commands.py", line 11, in <module>
A trailing newline is removed from the output string.
File "build/bdist.linux-x86_64/egg/compare_locales/compare.py", line 18, in <module>
ImportError: No module named simplejson
make: *** [merge-zh-CN] Error 1
linx:~/gecko-dev/obj-x86_64-unknown-linux-gnu/browser/locales # make merge zh-CN LOCALE_MERGEDIR=$(pwd)/mergedir
make: *** No rule to make target `merge'. Stop.
linx:~/gecko-dev/obj-x86_64-unknown-linux-gnu/browser/locales #
```
解决即如4.1.1所述,进行修改。
## 4.3 测试并制作rocky6.0.42系统的firefox38安装包
制作完成zh_CN版的firefox后接下来就可以整理打包成我们的rocky6.0.42系统中的安装包。
我们接下来要用到的包及库等内容有:
1.firefox—zh_CN编译完成包firefox-38.8.0.zh-CN.linux-x86_64.tar.bz2
2.在编译过程中需要的依赖包同时是运行依赖的包libffi gtk2 pango
### 4.3.1 添加运行依赖库并测试运行
解压firefox-38.8.0.zh-CN.linux-x86_64.tar.bz2到20160513版测试虚拟机的root下。
添加运行依赖库在解压后的目录firefox中创建新目录lib分别拷贝libffi-3.2.1/gtk2-2.18.9/pango-1.26.2的/usr/lib64/下的*.a/*.so库文件到firefox/lib下。使用如下命令拷贝软链接
```
rsync -l lib firefox/
```
修改firefox启动脚本中的运行依赖库修改firefox/run-mozilla.sh
```
--- run-mozilla.sh~ 2016-10-20 13:25:33.000000000 +0800
+++ run-mozilla.sh 2016-11-02 13:36:03.000000000 +0800
@@ -276,7 +276,7 @@ moz_should_set_ld_library_path()
}
if moz_should_set_ld_library_path
then
- LD_LIBRARY_PATH=${MOZ_DIST_BIN}:${MOZ_DIST_BIN}/plugins:${MRE_HOME}${LD_LIBRARY_PATH:+":$LD_LIBRARY_PATH"}
+ LD_LIBRARY_PATH=${MOZ_DIST_BIN}/lib:${MOZ_DIST_BIN}/plugins:${MRE_HOME}${LD_LIBRARY_PATH:+":$LD_LIBRARY_PATH"}
fi
if [ -n "$LD_LIBRARYN32_PATH" ]
```
然后可以运行./run-mozilla.sh ./firefox启动测试并测试输入中文可用。
### 4.3.2 制作rocky6.0.42系统安装包
创建工作目录work然后首先在其中创建opt目录并将4.3.1修改过的目录firefox放到opt目录下。
然后,创建如下所需目录:注意此处只是需要创建目录,文件在后续会有说明。
```
etc/
etc/ld.so.conf.d
etc/ld.so.conf.d/firefox.ld.conf
opt/
opt/firefox/
...
...
usr/
usr/bin
usr/bin/firefox
usr/share
usr/share/applications
usr/share/applications/firefox.desktop
usr/lib
usr/lib/mozilla
usr/lib/mozilla/plugins
usr/lib/mozilla/plugins/libnpjp2.so
var/
var/lib
var/lib/pkg
var/lib/pkg/firefox.post_add
```
firefox.ld.conf依赖库配置
```
#cat etc/ld.so.conf.d/firefox.ld.conf
/opt/firefox
```
firefox启动命令菜单软链接启动项及软链接库创建
```
linx:~/work/$ cat usr/bin/firefox
#!/bin/bash
/opt/firefox/run-mozilla.sh /opt/firefox/firefox
linx:~/work/$ ls -l usr/lib/mozilla/plugins/libnpjp2.so
lrwxrwxrwx 1 sxx sxx 40 5月 13 14:04 usr/lib/mozilla/plugins/libnpjp2.so -> /usr/lib64/jdk/jre/lib/amd64/libnpjp2.so
linx:~/work/$ cat usr/share/applications/firefox.desktop
[Desktop Entry]
Encoding=UTF-8
Name=Mozilla Firefox 40.0.3
Comment=Web Browser
Exec=/opt/firefox/run-mozilla.sh /opt/firefox/firefox
Icon=/opt/firefox/browser/icons/mozicon128.png
Terminal=false
Type=Application
Categories=Application;Network;
```
还需添加安装包的安装后执行的ldconfig
```
linx:~/work/$ cat var/lib/pkg/firefox.post_add
#!/bin/bash
ldconfig
```
按以上配置修改后,查看文件的属组及权限,并进行打包。
1.添加的脚本需要运行权限。
2.work目录下的各文件属组均为root.root
3.特别注意因work目录下的所有文件会安装到系统的/目录下故注意在work目录下执行ls -la时"."".."两个的属组为root.root权限均为755。
最后可以在work目录下执行打包命令
```
tar cfz ../firefox#38.8.0-x86_64-linx-Rocky4.3.pkg.tar.gz ./*
```
## 5 结束
最后获得的firefox#38.8.0-x86_64-linx-Rocky4.3.pkg.tar.gz安装包可直接用pkgadd命令进行安装。