【转载请注明Moon出品】
编译WebKit可谓历尽千辛万苦,多亏了老师的鼓励和督促、Ashod和师姐的帮助,才能最终历经九九八十一难,成功地将WebKit编译,得道升天…现将所有有关WebKit及其编译流程的知识以及经验总结如下,供大家分享和批评指正。
================================================================
SpiderMonKey:第一款JavaScript引擎,由Brendan Eich在Netscape Communications时编写,用于Mozilla Firefox 1.0~3.0版本。
Rhino:由Mozilla基金会管理,开放源代码,完全以Java编写。
TraceMonkey:基于实时编译的引擎,其中部份代码取自Tamarin引擎,用于Mozilla Firefox 3.5~3.6版本。
JaegerMonkey:德文Jäger原意为猎人,结合追踪和组合码技术大幅提高性能,部分技术借凿了V8、JavaScriptCore、WebKit,用于Mozilla Firefox 4.0以上版本。
Chakra (JScript引擎):中文译名为查克拉,用于Internet Explorer 9的32位版本。
Linear A:用于Opera 4.0~6.1版本。
Linear B:用于Opera 7.0~9.2版本。
Futhark:用于Opera 9.5~10.2版本。
Carakan:由Opera软件公司编写,自Opera10.50版本开始使用。
KJS:KDE的ECMAScript/JavaScript引擎,最初由Harri Porten开发,用于KDE项目的Konqueror网页浏览器中。
Narcissus:开放源代码,由Brendan Eich编写(他也参与编写了第一个SpiderMonkey)。
Tamarin:由Adobe Labs编写,Flash Player 9所使用的引擎。
一个典型的浏览器有两个必不可少的组成部分:渲染引擎和独立的JavaScript引擎。JavaScript引擎的独立性确保它能够被更方便的测试、重新生成或者在另一些项目中使用。例如Carakan被用在Presto中,Nitro被用在WebKit中,SpiderMonkey被用在Gecko中,KJS被用在KHTML中,Rhino默认不包含任何布局引擎。当然还有其他组合,例如V8与WebKit被用于Chrome浏览器中。
================================================================
Visual Studio 2010.
Windows SDK 7.1.(下载页面:http://www.microsoft.com/download/en/details.aspx?id=8442,下载链接: http://download.microsoft.com/download/F/1/0/F10113F5-B750-4969-A255-274341AC6BCE/GRMSDK_EN_DVD.iso,文件大小:567MB)
Visual Studio 2010 SP1.(下载页面:http://www.microsoft.com/download/en/details.aspx?id=23691,下载链接: http://download.microsoft.com/download/E/B/A/EBA0A152-F426-47E6-9E3F-EFB686E3CA20/VS2010SP1dvd1.iso,文件大小:1.48GB)
Visual C++ 2010 SP1 Compiler Update for the Windows SDK 7.1.(下载页面: http://www.microsoft.com/en-us/download/details.aspx?id=4422,下载链接: http://download.microsoft.com/download/7/5/0/75040801-126C-4591-BCE4-4CD1FD1499AA/VC-Compiler-KB2519277.exe,文件大小:121MB)
安装QuickTime SDK(下载页面:http://developer.apple.com/quicktime/download/,下载链接: http://adcdownload.apple.com/QuickTime/quicktime_7.3_sdk_for_windows/quicktimesdk.zip,文件大小:2.02MB)
安装DirectX SDK(下载页面:http://www.microsoft.com/downloads/en/details.aspx?displaylang=en&FamilyID=2c7da5fb-ffbb-4af6-8c66-651cbd28ca15,下载链接: http://download.microsoft.com/download/F/1/7/F178BCE4-FA19-428F-BB60-F3DEE1130BFA/DXSDK_Feb10.exe,文件大小:554MB)
至此,编译环境就算是搭建好了。接下来你要做的操作就是每次你选择新的源文件版本时都要进行的操作,这些操作都是在源文件文件夹中进行的。
================================================================
-
将WebKitSupportLibrary.zip拷贝到WebKitSource\下。注意,不要解压。
-
将vs2010-build-env.cmd拷贝到WebKitSource\下,修改其中set CYGWIN_SOURCE_DIR=C:\cygwin等号右边的值,即你电脑中Cygwin的安装目录。另外,我将CYGWIN_DIR设置为C:\cygwin_dir,你可以根据自己的需要修改。
-
将pdenenv拷贝到WebKitSource\Tools\Scripts\下覆盖原版。
-
将WebKitSource\Source\WebCore\Modules\quota\中的文件全部拷贝到WebKitSource\Source\WebCore\storage\中去。
-
用VS2010打开WebKitSource\Source\WebKit\win\WebKit.vcproj\WebKit.sln,IDE会弹出一个Conversion Wizard告知你需要对方案(solution)或工程(project)进行转换,点击下一步完成转换。
将WebKitSource\Tools\vcbin\下的cl.exe和midl.exe重命名为cl-.exe和midl-.exe(即让它们失效)。
-
打开WebKitLibraries\win\tools\vsprops\common.props,修改TreatWarningAsError为false。
-
打开 Source/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def,删除
-
其中的“?nullptr@@3Vnullptr_t@std@@A”。
-
找到 WebKitSource\Source\WebCore\platform\network\curl\CookieJarCurl.cpp和 WebKitSource\Source\WebCore\platform\image-decoders\ImageDecoder.cpp,右键打开Properties菜单,选择Configuration Properties>General,修改Item Tyep为C/C++ compiler。(10月9日后记:我尝试找了一下这两个源文件竟然没找到,我当初的确修改过,此问题留待修改)
-
打开WebCore\platform\LocalizedString.cpp,在264行和266行中有"Look Up “%@”"和"Look Up “<selection>”"注意%@和<selection>两边的双引号是全角的,然后删除这些全角的引号即可。
-
打开WebKitSource\Source\WebCore\platform\graphics\cg\目录下的ImageSourceCG.h、 WebKitSource\Source\WebCore\platform\network\cf\目录下的 SocketStreamHandle.h和 SocketStreamError.h三个头文件,在#define xxx_h(以ImageSourceCG.h为例xxx_h就是ImageSourceCG_h)这行后面添加:#ifndef ExportMacros_h#include "config.h"//你可以取消下面这行的注释,在编译过程中可能会看到我写的提示信息//#pragma message("===>缺少定义,手动引入config.h")#endif
-
在TestWebKitAPI工程的config.h(WebKitSource\Tools\TestWebKitAPI\config.h)首部添加:#define _ALLOW_ITERATOR_DEBUG_LEVEL_MISMATCH
Ashod编写(我添加了一些中文注释)的vs2010-build-env.cmd首先创建了一些链接,这样你就不必再把WebKitSource文件夹移动到Cygwin的用户目录下了;然后设置了一些必要的环境变量:WEBKITOUTPUTDIR(编译结果的输出目录)、WEBKITLIBRARIESDIR(WebKit相关库的目录)、VSINSTALLDIR(VS100COMNTOOLS是安装VS2010后自动添加的一个环境变量,set VSINSTALLDIR=%VS100COMNTOOLS%..\..就获得了VS2010的安装目录)、PATH(执行脚本的路径,在默认PATH的基础上添加了%WEBKIT_DIR%\Tools\Scripts和%CYGWIN_DIR%\bin);最后脚本直接启动了Cygwin。
第12步所做的操作是为了一个链接错误,这个错误产生的原因是编译时用Release模式去链接了一个Debug编译出的lib,或者用Debug模式链接了Release编译的lib。加入12中的那个宏就屏蔽了匹配检测,从而避免了这个错误。
================================================================
-
cpan HTTP::Date(这个操作可能只在第一次编译的时候要用到,事实上与环境相关)。
-
update-webkit(这个操作每个源文件文件夹第一次编译的时候要用到,下载并安装WebKitAuxiliaryLibrary.zip)。
-
build-webkit --debug | tee log.txt。
build-webkit --debug | tee log.txt是以Debug模式进行编译,同时将编译信息输出到Cygwin用户目录下log.txt中去。你完全可以写成C:\\log.txt或C:/log.txt以便查看log。另外,我在编译的过程中会使用tee logMMDDHHMM.txt(如log05211314.txt就代表5月21日13点14分的log),推荐大家这样做,保存log对于诊断并解决错误至关重要。
接下来,找本书看或者出去运动运动吧,编译要花一到两个小时,而且这段时间内你的电脑一直处于忙碌状态,别烦它。编译过程中还可能遇到一系列的错误,我在文章后面列出了各种错误的解决方法。
================================================================
==========================================================
总结
最后,希望本文对大家编译WebKit有所帮助,欢迎大家与我交流或提出宝贵意见,谢谢。
================================================================
C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppCommon.targets(103,5): error MSB3073: if not exist "C:\WebKit-r128959\Tools\MiniBrowser\MiniBrowserPreBuild.cmd" exit /b
这类MSB3073错误是由于之前有错误没有成功解决。只要你将前一个错误解决,这个错误就不会出现。所以,每次编译过程中,你要做的就是解决第一个错误!
================================================================
打开Cygwin\etc\profile文件,将其中的unset TMP, TEMP这一行注释掉,即在这行前面加上#。
================================================================
解决方法:执行一遍update-webit。
================================================================
解决方法:Cygwin中执行cpan HTTP::Date。
================================================================
..\platform\LocalizedStrings.cpp(264): error C2001: newline in constant
..\platform\LocalizedStrings.cpp(266): error C2001: newline in constant
..\platform\LocalizedStrings.cpp(264): fatal error C1057: unexpected end of file in macro expansion
打开\platform\LocalizedStrings.cpp,在264行和266行中有Look Up “%@”和Look Up “<selection>”(注意%@和<selection>两边的双引号是全角的),删除这些全角的引号即可。
================================================================
解决方法:将WebKitSource\Source\WebCore\Modules\quota\目录中的文件全部拷贝到WebKitSource\Source\WebCore\storage\中去。
================================================================
解决方法:在TestWebKitAPI工程的config.h首部添加:#define _ALLOW_ITERATOR_DEBUG_LEVEL_MISMATCH。
================================================================
解决方法:将VS80COMNTOOLS修改为VS100COMNTOOLS。
================================================================
将C:\Program Files\Microsoft Visual Studio 10.0\Common7\Tools\中的vsvars32.bat拷贝到你电脑系统变量VS100COMNTOOLS所指示的那个路径当中去。以为我为例,我将VS2010自定义安装在了D:\Softwares\VS2010\中,VS100COMNTOOLS就是D:\Softwares\VS2010\Common7\Tools\。
================================================================
my $zipFile = "$file.zip";
my $winCairoLibsURL = "http://dl.dropbox.com/u/39598926/$zipFile";
my $command = "$FindBin::Bin/update-webkit-dependency";
system("perl", $command, $winCairoLibsURL, ".") == 0 or die;
我也很希望能够通过修改perl脚本实现WebKitAuxiliaryLibrary.zip(https://developer.apple.com/opensource/internet/WebKitAuxiliaryLibrary.zip)、WinCairoRequirements.zip的本地安装,因为自己下载这些包相对来说速度更快也更方便。
================================================================
现在的编译只能实现build-webkit --debug,而且#define _ALLOW_ITERATOR_DEBUG_LEVEL_MISMATCH只是暂时屏蔽了匹配检测。接下来还要研究如何实现release版本的编译。
最初的编译目的是实现WebKit在VS2010下的断点调试,继续编译将继续进行。