手机版firefox浏览器fennec编译测试eg
fennec是firefox在嵌入式平台的简化版, 也被称为firefox的手机版,是Meego平台使用的浏览器。 因为被Meego使用的缘故, 它提供了一套基于Qt的界面实现。
fennec是一种生活在撒哈拉大沙漠里的长耳狐, 长得很是可耐, 上个片片给大家欣赏一下:
可耐到让俺很垂涎的地步。 应bug的要求, 尝试编译了一下这个工程。 既然fennec这么可耐, 咱爱屋及乌,当然编译这个浏览器也要尽心尽力拉。
下载+解压缩
俺一般用mc(midnight commander)去解压rpm和里面的cpio文件, 得到一组文件列表, 我们只用其中的fennec源码包, 如下:
tar jxvf fennec-tip-91da083f3478-af67cbcea09d.tar.bz2
解压出mozilla-central目录
构建
构建之前要设置环境变量设置:
$ export QTDIR=/usr/local/Trolltech/Qt-4.6.3
编译的命令: make -f client.mk build NSDISTMODE=copy
这个命令是autoconf+configure的集合体, 所以耗时很长, 大概要几分钟。 这个命令会在mozilla-central目录下创建一个qtdebug目录, 然后所有的Makefile都生成在这个目录里, 类似shadow build的效果。
如果你不幸在运行编译命令之前忘记export QTDIR了, 那么恭喜你, 前面等待的时间算是白费拉。 必须要make distclean才能让新的环境变量起作用。 环境清理的命令是:
$ make -f client.mk distclean
编译过程中的问题和解决方法
笔者在编译的过程中遇到了两个主要的问题, 一是找不到cpuid.h头文件。 出问题的代码在mozilla-central/xpcom/glue/SSE.h
240 #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)
241 #if 0//BJBJ
242 // cpuid.h is available on gcc 4.3 and higher on i386 and x86_64
243 #include <cpuid.h>
244 #define MOZILLA_SSE_HAVE_CPUID_DETECTION
……
这里对gcc的版本做了一个检测, 并认为gcc在4.3以上的话就会带有cpuid.h文件。 这个假设比较奇怪,因为笔者的系统上gcc确实是在4.3以上, 但却没有这个头文件, 太囧了! 没办法, 将这段代码注释掉, 一直注释到namespace mozilla结束。(简单看了一下代码, 应该没有什么影响。)
第二个问题是出现下面的编译错误:
mozilla-central/gfx/thebes/GLContextProviderEGL.cpp:600: error: ‘GLContextProviderEGL’ has not been declared
这个EGL相关的东西一看就是只有嵌入式上才有的, 我们在桌面编译当然不可能有拉, 翻了翻代码, 发现除了EGL的实现之外还有GLX(对应于X的GL)、WGL(windows的GL)和CGL(MAC下cocoa的GL), 应该是有个开关控制具体编译哪个GL支持。 再翻翻, 发现这个开关在gfx/thebes/目录下的Makefile.in中。 修改这部分代码如下:
397 ifeq ($(MOZ_WIDGET_TOOLKIT),qt)
398 ifdef MOZ_PLATFORM_MAEMO
399 GL_PROVIDER = EGL
400 else
401 GL_PROVIDER = GLX
402 endif
403 endif
看起来是比较神奇的代码,其实是从上面一段关于gtk的代码照抄过来的。 ^_^
修改Makefile.in之后不需要重新configure, 笔者的做法是直接到qtdebug目录里去make。 后面就是比较漫长的编译过程, 大概需要二十多分钟的时间。
运行
$ export LD_LIBRARY_PATH=/usr/local/Trolltech/Qt-4.6.3:path_to_fennec/mozilla-central/qtdebug/dist/lib
$ path_to_fennec/mozilla-central/qtdebug/dist/bin/fennec
第一行脚本指定运行时库的载入路径, 笔者的机器上需要加上Qt的路径, 因为系统里自带了4.3和笔者用的4.6会冲突。 其他就没什么特别的拉。 总的来说还算顺利~
来个帅帅的截图证明咱不是忽悠人的