Record build firefox

修改:     README.md
	新文件:   firefox.md

Signed-off-by: Xu, Shunxuan <sxxu@linx-info.com>
This commit is contained in:
Xu, Shunxuan
2018-06-22 15:01:39 +08:00
parent 1f99adb272
commit 25e7bc8043
2 changed files with 884 additions and 0 deletions

View File

@@ -44,3 +44,5 @@
## [升级700内核到光盘环境及系统环境](record-update-to-700.md)
## [研发一部服务器信息](linx1_server_info.md)
## [firefox编译过程记录](firefox.md)

882
firefox.md Normal file
View File

@@ -0,0 +1,882 @@
# 编译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命令进行安装。