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

36 KiB
Raw Blame History

编译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目录下即可。配置文件示例

#!/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命令进行安装。