WebKit编译小结
在Windows平台上利用微软的VS编译WebKit,然后在VS IDE里设置断点跟踪WebKit的运行,是一件很好玩的事情。到目前为止,我们至少可以通过两个开源项目来做这件事情:Apple的WebKit开源项目(http://webkit.org)和Google的Chromium开源项目(http://code.google.com/chromium)。前者我一共编译过3次,每次都要磕磕绊绊,相比而言后者的编译过程要顺利得多。
所以针对Safari的WebKit自己写个小结,希望下次再编译时能快点。
网上已经有很多先烈——先人?也不合适,还是前人吧——指明了一条最容易犯的错误:千万别自作聪明,要严格按照官方指导,从安装编译工具开始(http://webkit.org/building/tools.html),亦步亦趋的来,不然到了出错时再反过来找错误的原因就比较头疼了。
所以还是按照官方指导的顺序来说吧。
Installing the Developer Tools 安装编译工具
- http://webkit.org/building/tools.html
1. 微软有免费(不是试用)的Visual Studio 2005 Express Edition可以下载使用,注意指导上说了新版本尚不支持。我有个朋友一开始就跳过了这一步(他用了显然是盗版的VS 2008并且还自鸣得意可以少花点时间),最后不但人崩溃了,机器也崩溃了。另外网上也有不少攻略会告诉你,VS 2008也能编译,但对于具体怎么配置似乎语焉不详,况且你不希望好不容易编译过了调试又崩溃了吧?
2. 官指(官方指导)上提到的Windows补丁,以及Service Pack,Security Update,都需要老老实实安装。安装Platform SDK时还得跳到微软的官网去看How-to,包括VS IDE的环境配置,烦人得很...这里需要注意一下,最好全都使用缺省的安装目录,否则编译时找不到这个头文件那个库文件很头疼,当然如果对VS开发环境比较熟悉倒也不是什么大问题。
3. 关于Cygwin组件。苹果利用了Cygwin中的一些脚本和工具去调用VS来编译WebKit,理论上你完全可以直接在VS IED里打开WebKit的工程文件来编译之,前提是你曾经用VS开发过一些大型工程。在这一步常出的错误在于Cygwin中各个组件的版本。几年前第一次编译时由于自己机器上已经安装了Cygwin,就自作聪明的跳过了这一步,导致一些莫名的编译错误。官指中的cygwin-downloader.zip其实已经指定了编译所需要的组件的最小集合,老老实实的安照要求先下载最新版本到本地然后选择本地安装即可。
4. QuickTime SDK也是必须的,谁让它是Apple的呢。我也曾自作聪明跳过了这一步,然后在安装时又自定义了目录...DirectX SDK也是必须的,Windows版本的WebKit画图时需要用到它的一些头文件和库。
5. 终于有一个不是必须的了:WinDbg和NTSD
这一部分最花时间的是Visual Studio和Windows SDK和DirectX SDK的下载,好像一共有3-4G——其实也就相当于一部半高清的电影。
Getting WebKit 下载源码
- http://webkit.org/building/checkout.html
1. 这一步问题不大,选择的余地不小。你可以
a. 在Cygwin环境下通过SVN来检出(check out)完整的代码
b. 下载这个完整包:http://nightly.webkit.org/files/WebKit-SVN-source.tar.bz2。早先的时候只有200多M,现在急剧增长到了800M,其实代码文件基本没变化,多出来的都是些测试和bug fix相关的文件。
c. 还有一种最快捷的办法:仅下载源文件包,大概只有10几M,缺点是源文件里不带SVN信息,所以是没法进行渐进式SVN代码更新和编译的。在这里:http://nightly.webkit.org/builds/trunk/src/1 或通过 WebKit Nightly Builds (http://nightly.webkit.org/) -> Source #View all available builds.
2. 安装WebKit Support Libraries,这是Apple预编译好的一套Windows上的动态库,包括基础/网络/图形库等,只需按照官方指导上所说的,下载后存放到WebKit源码的根目录下,然后在Cygwin环境下运行update-webkit来下载更新最新的头文件和库文件即可。如果下一步编译时提示某个头文件或库文件有错,可以先到WebKit Support Libraries这个目录下看看是否属于这里,如果是的话或许可以通过升级到最新版本来解决这类编译问题。
注意update-webkit这个脚本还可能会替你更新代码,如果你使用的代码里带有SVN信息的话。
Building WebKit 编译
- http://webkit.org/building/build.html
完成了以上步骤,至少半天就过去了,但很可能你才走出了第一步,因为运气不好的话,后边还会有一堆的编译错误在等着你。
如果运气足够好,只要在Cygwin环境下通过build-webkit脚本就可以得到编译结果。常见的错误包括但不限于:
1. 找不到一些头文件或库文件
- 首先通过文件名猜测或是网上搜索一下,看看这个文件大概完成什么功能,属于哪部分(例如是Windows SDK还是Apple自己提供的基础库),只要知道它应属的位置甚至目录名,就不难解决问题了:要么重新下载正确的版本,要么在VS IDE里设置正确的包含路径,或者Windows环境变量
2. 提示注册表里找不到某个key
- 可能是对应的SDK或库文件没有正确安装
3. 看不太明白的错误... 其实编译错误信息在这里: .../WebKit/WebKitBuild/buildfailed 这个文件里说明了最近一次编译错误的模块名project,然后到以下对应的文件可以查看更具体的错误: .../WebKit/WebKitBuild/obj/<project>/Debug/BuildLog.htm
5. 最后记住一点,不管出什么错,都不要怀疑代码本身;错误都是由编译环境和你自己导致的。
如果你看到以下提示,恭喜你,任务完成了。
===========================================================
WebKit is now built (56m:16s).
To run Safari with this newly-built code, use the
"WebKit/WebKitTools/Scripts/run-safari" script.
===========================================================
Running WebKit 运行
早先的时候直接执行 WebKit/WebKitTools/Scripts/debug-safari 就能启动VS IDE,后者会自动找到并启动Safari Shell,同时加载你先前编译好的各种库文件。
但在最新版本中这个命令好像仅仅启动了VS IDE,那就自己通过 WebKit/WebKitBuild/bin 目录下自己编译出来的 Safari.exe 来启动Safari吧,然后在VS IDE里attach process就可以设置断点跟踪调试了。
============================
题外话:第一次编译WebKit的时候,我受了某位WebKit开源贡献者(source contributor)的影响,认为Apple这个公司不太地道,既然都开源了为什么还很小气的设了很多人为的障碍来捣乱,要知道有多少同学冲着WebKit的名声满腔热血的冲上来,最后被这一个又一个挫折击退了。后来自己也经历过一次WebKit开源,也写了step by step的编译步骤,才明白这个一个复杂的系统,其依赖的库和编译环境,甚至编译工具,也都是在动态变化的;最重要的是,有些内容你(包括Apple)并不希望开源——或许这是导致编译步骤加倍复杂的根本原因——这也是我提到的那位开源贡献者对Apple WebKit开发组“不爽”之处。
2010/12/30 补记:有人问为什么要编译WebKit?我想可能因为:
1. WebKit现在颇为流行
2. 好玩
3. 学习
4. 最重要的,如果你有基于WebKit的开发或移植工作,那么在VS IDE里跟踪调试最新的WebKit代码绝对是一件事半功倍的事情
为什么基于Safari调试?因为Safari的debug模式自带了很多开发功能,包括查看每个页面元素的具体信息(例如布局和事件监听Event Listener等),JavaScript调试等。当然,Google的Chrome也有相应的功能。严格来讲,如果你专注于WebCore引擎本身,那么使用哪个Browser Shell其实关系不大;如果你更关注狭义上的WebKit,也就是平台相关的部分,那么Chrome可能是更好的选择,因为它完全开源。至于Qt,如果你的工作与它完全无关,最好还是绕开它吧...