这个工作已经很多人做过了,这里说说我的经验。
基本上,按照WebKit官网的指示进行,还比较顺利。有两点原则要坚持:
需要注意的是:
一、设置环境变量:
WEBKITLIBRARIESDIR=%WEBKITROOT%\WebKitLibraries\win
WEBKITOUTPUTDIR=%WEBKITROOT%\WebKitBuild
%WEBKITROOT%根据实际情况替换为WebKit项目根路径。
二、修改工程属性
WebKit的VS2005解决方案路径为:
%WEBKITROOT%\Source\WebKit\win\WebKit.vcproj\WebKit.sln
将解决方案里的各个工程属性里的“将警告视为错误”置为“否”,解决头文件编码问题(部分头文件注释中包含代码页936即GB2312不认识的编码,产生警告)。
这里需要修改的工程比较多,而且WebKit解决方案带有多套配置,每套配置都要重新设置一遍,相当繁琐。可以直接修改%WEBKITROOT%\WebKitLibraries\win\tools\vsprops\common.vsprops,将WarnAsError="true"项改成WarnAsError="false"。或者执行下面的脚本:
#!/bin/bash webkitroot=.. common_vsprops=WebKitLibraries/win/tools/vsprops/common.vsprops echo setting \"warning as error\" to false... sed -i 's/WarnAsError="true"/WarnAsError="false"/g' "${webkitroot}/${common_vsprops}"
将上面的脚本存成pre-build-webkit文件。在WebKit项目根路径建立ExternalScripts目录,将pre-build-webkit文件放在这个目录下。
执行pre-build-webkit脚本,则各个工程属性里的“将警告视为错误”全部被置为“否”。
三、重新生成.h、.cpp和.idl文件
这点很多人忽略,甚至有人在webkit-help的mailing-list里提问也得不到解答。
在WebKit项目中,部分.h、.cpp和.idl文件是由.in、.table、.json、.css等文件生成的。这部分自动生成的文件同样被传到了WebKit的svn上。目前svn上的这些文件与.in和.table等文件并不配对。
使用WebKit的nightly版本(从http://nightly.webkit.org/上下载的版本)代码编译可能不会出现问题,因为svn服务器上的这些不配对的.h文件,最后更新日期早于相应的.in和.table等文件,因此会被重新生成。
直接从svn上checkout下来的WebKit就不一样了,文件的最后更新时间不再是svn服务器上记录的时间,而是checkout时写入本地硬盘的时间,此时这些.h、.cpp和.idl文件的最后更新日期可能会晚于相应的.in和.table等文件,没有能够重新生成,与源文件不匹配。表现出来的现象是一些枚举或变量定义缺失,导致编译失败。比如下面的编译错误:
..\..\parser\Lexer.cpp(411) : error C2065: 'maxTokenLength' : undeclared identifier
就是一个叫Keywords.table的文件更新,而相应的.h和.cpp没有重新生成造成的。
使用touch命令更新.in和.table等文件的日期,使相应的.h文件重新生成。在上面提到的pre-build-webkit脚本里,添加下面的命令:
find ${webkitroot}/Source \( -name "*.in" -or -name "*.table" -or -name "*.json" -or -name "*.css" -or -name "*.y" -or -name "*.mm" \) -exec touch {} \; -exec echo touched {} \; find ${webkitroot}/Tools \( -name "*.in" -or -name "*.table" -or -name "*.json" -or -name "*.css" -or -name "*.y" -or -name "*.mm" \) -exec touch {} \; -exec echo touched {} \;
执行pre-build-webkit脚本即可。
四、解决WebKit项目脚本格式问题
其实可能是我自己的问题?%WEBKITROOT%\WebKitLibraries\win\tools\scripts\feature-defines.sh中,每行结尾包含\r字符(也就是说,这个脚本被存成了dos风格的文本)。在上述pre-build-webkit脚本中添加下面的命令避免所有这种问题:
find ${webkitroot}/WebKitLibraries -name "*.sh" -exec dos2unix {} \;
五、解决个别文件的编码问题
%WEBKITROOT%\Source\WebCore\platform\DefaultLocalizationStrategy.cpp里引用的常量字符串(非注释)中包含非ascii字符(具体来说是个全角引号),并不是GB2312编码,在默认编码为GB2312的中文环境下编译会出现错误(在无法识别文件编码的情况下,VS2005会采用系统默认编码来理解这个文件)。用UltraEdit打开后重新保存为带签名的UTF-8格式即可编译通过。
经过以上处理,WebKit的编译应该没什么问题了。以后我再讲讲wincairo配置的WebKit所依赖的其它第三方库文件的编译过程。