中国新歌声插播广告:我的笔记本 ? windows xp下Webkit编译过程总结
来源:百度文库 编辑:中财网 时间:2024/04/29 18:58:03
windows xp下Webkit编译过程总结
经过三次尝试,终于在windows平台上成功编译了webkit所有项目。回过头来看其实并没有什么根本性的难点,碰到的所有问题几乎都是对编译平台的 理解有问题,也就是说大项目开发的基本功的欠缺。大项目的结构,工程文件的编写事实上很重要,而往往被我们忽略,尤其在windows平台下,IDE工具 的使用掩盖了很多东西,使得我们对项目的控制力依附于各种菜单,而大项目往往需要脚本来控制编译流程和设置编译环境的。
上述几次尝试中碰到的问题其实只有一个:编译环境的搭建。第一、二次尝试的问题都是因为环境搭建不对。严格按照webkit官方文档(http://webkit.org/building/tools.html)的步骤(还要增加一个预备步骤)做的话不会有什么问题。
- 预 备步骤:清除系统中安装的其他编译器如gcc、解释器如python;或者在系统环境变量里去掉(或者像我一样在cygwin中重新设定PATH变量也行 export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local /sbin:/cygdrive/c/WINDOWS:/cygdrive/c/WINDOWS/system32)。
-
安装VS.net 2005:不需要安装很多组件,只需要选择Visual C++下的几个(可去除“智能设备xxx”)就行了;其他的全部不选。
-
安装Microsoft Visual Studio 2005 Team Suite Service Pack 1,注意选择语言为简体中文,否则安装不上。
- 安装cygwin:从webkit官网上下载cygwin-downloader,运行就会下载所有需要的cygwin软件包,安装时指定从本地安装,即刚才下载的目录。安装好后重新设定PATH,排除外界干扰。
- 安装QuickTime:从webkit官网的链接到apple网站上下载,安装。
- 下载源代码:可以在cygwin中用svn下载,但是svn的代码非常大,1G多,所以还是直接下tarball比较好。
注意:下载并解压后,一定要运行./WebKitTools/Scripts/update-webkit脚本,否则会出现“unicode/uchar.h,pthread.h,sched.h没有找到”之类的错误,这类错误很让人迷惑,容易引入歧路,浪费时间。
- 下载WebKitSupport库:下载后直接放到WebKit根目录下,不要解压缩。
-
运 行./WebkitTools/Scripts/build-webkit脚本:这时候应该会提示一些错误,在我的机器上是QtMovieWin、 WebCore和WebKit三个项目“treat warning as error”,而问题出在Quicktime sdk的文件中有不符合 cp936的字符。
可以直接修改
WebKit-r38240\WebCore\WebCore.vcproj\QTMovieWin.vcproj
WebKit-r38240\WebCore\WebCore.vcproj\WebCore.vcproj
WebKit-r38240\WebKit\win\WebKit.vcproj\WebKit.vcproj
这三个文件,把Debug、Release、Internal-Debug等发布形式的treat warning as error去掉。
当然,也可以用vs.net 2005的gui工具来修改,这需要实现在windows系统(不是cygwin)中设定环境变量WEBKITOUTPUTDIR和WEBKITLIBRARIESDIR,否则打开sln文件出错。修改后保存即可。
-
运行./WebKtiTools/Scripts/run-safari就可以在safari下运行这个新内核了。
感受:
还没有在windows下编译过大项目,对vs.net也不熟悉,因此经常被简单的问题困扰,但是我认为编译过程还是很重要的,可以帮助(确切的说是强 迫)你去熟悉项目的目录结构,脚本执行顺序,环境变量,子项目划分等等。试想,如果下载了源代码之后,运行一下build-webkit就全部搞定的话, 你又获得了什么呢?所以编译时碰到问题不要气馁,记住里维斯的话:“太棒了,这样的事情竟然发生在我的身上,又给了我一个成长的机会。凡事的发生必有其因果,必有助于我。”。
June 19th, 2009 | Tags: WebKit, 编译 | Category: WebKit | Comments are closed
Windows下编译webkit
第一次尝试
Webkit的文档很奇怪,在叙述步骤时不讲哪些是必须的哪些是可选的,把多个选择列成1,2,3,4步骤也列出1,2,3,4,让人迷惑。
安装了cygwin之后,编译时遇到错误,一些简单的错误,例如有些软件没有安装之类,直接用cygwin的安装程序添加即可,这里略过不提。
1,我的Webkit源码在e:\zhou\programs\build-webkit\WebKit中,在cygwin中的路径是/cygdrive/e/zhou/programs/build-webkit/WebKit/。如果在路径/cygdrive/e/zhou/programs/build-webkit/中运行./WebKit/WebKitTools/Script/build-webkit,如文档上说的那样,则出现很多错误,其根源应该是(WebKit目录和上述有差别,刚开始是这个目录,后来改了;但影响不大):
……
Building results into: /cygdrive/e/work/browser/WebKit-r38240/WebKitBuild
WEBKITOUTPUTDIR is set to: e:\work\browser\WebKit-r38240\WebKitBuild
WEBKITLIBRARIESDIR is set to: e:\work\browser\WebKit-r38240\WebKitLibraries\win
/cygdrive/c/Program Files/Microsoft Visual Studio 8/Common7/IDE/devenv.com win\W
ebKit.vcproj\WebKit.sln /build Release
Microsoft (R) Visual Studio 8.0.50727.42 版。
版权所有 (C) Microsoft Corp 1984-2005。保留所有权利。
1>—— 已启动生成: 项目: JavaScriptCoreGenerated, 配置: Release Win32 ——
1>正在执行生成文件项目操作
1> xcopy /y/d/e/i “..\..\..\WebKitLibraries\win\tools” “e:\work\browser\WebKit-r
38240\WebKitLibraries\win\tools”
1>不能执行周期性复制
1>复制了 0 个文件
1> touch “e:\work\browser\WebKit-r38240\WebKitBuild\buildfailed”
……
问题在于xcopy的执行,当目的文件夹就是源文件夹时会拒绝拷贝(后面将看到,这不是一个错误,因为在未设置环境变量WEBKITLIBRARIESDIR时默认的目标目录就是源目录,因此出现拷贝出错,但是文件已经在目标目录了。)。
2,修改了两个环境变量WEBKITOUTPUTDIR=“e:\temp\build-webkit” WEBKITLIBRARIESDIR=”e:\temp\build-webkitlib”之后,运行出现另外的错误:
……
文件: e:\zhou\programs\build-webkit\WebKit-bak\WebKit\win\WebKit.vcproj\Interfac
es.vcproj
行: 24
列: 4
错误信息:
属性表文件“$(WebKitLibrariesDir)\tools\vsprops\common.vsprops”未找到或无法加载
……
很显然,这个文件丢失;查看了该目录,发现存在这个文件,那么是无法加载还是变量$(WebKitLibrariesDir)有问题?还是这个变量的大小写有问题(因为环境变量设定是大写:WEBKITLIBRARIESDIR=”e:\temp\build-webkitlib”)?我把WEBKITLIBRARIESDIR改成WebKitLibrariesDir(但是WEBKITOUTPUTDIR没有改),清除了e:\temp\build-webkit和e:\temp\build-webkitlib两个目录下的内容,再次运行,仍然出错,从打印消息来看在运行xcopy之后复制了几个文件,然后立刻执行生成errorlog的操作,很奇怪:
1>复制了 8 个文件
1> touch “e:\temp\build-webkit\buildfailed”
1> bash build-generated-files.sh “e:\temp\build-webkit” “e:\temp\build-webkitlib”
1>Can’t locate Win32API/Registry.pm in @INC (@INC contains: /usr/lib/perl5/5.10/i686-cygwin /usr/lib/perl5/5.10 /usr/lib/perl5/site_perl/5.10/i686-cygwin /usr/lib/perl5/site_perl/5.10 /usr/lib/perl5/vendor_perl/5.10/i686-cygwin /usr/lib/perl5/vendor_perl/5.10 /usr/lib/perl5/vendor_perl/5.10 /usr/lib/perl5/site_perl/5.8 /usr/lib/perl5/vendor_perl/5.8 .) at ../../../WebKitTools/Scripts/num-cpus line 6.
1>BEGIN failed–compilation aborted at ../../../WebKitTools/Scripts/num-cpus line 6.
…….省略了一些打印信息
2>生成日志保存在“file://e:\temp\build-webkit\obj\record-memory-win\Release\BuildLog.htm”
2>record-memory-win – 0 个错误,0 个警告
1>make: *** [Grammar.cpp] Error 127
1>make: *** Waiting for unfinished jobs….
1>make: *** [Grammar.cpp] Error 127
1>make: *** Waiting for unfinished jobs….
1>Creating hashtable for /cygdrive/e/zhou/programs/BUILD-~1/WEBKIT~2/JAVASC~1/parser/Keywords.table
1>cpp.exe: /tmp/dftables-clvSkKao.in: No such file or directory
1>cpp.exe: warning: `-x c’ after last input file has no effect
1>cpp.exe: no input files
1>Use of uninitialized value $pcre_internal{”tables_length”} in printf at /cygdrive/e/zhou/programs/BUILD-~1/WEBKIT~2/JAVASC~1/pcre/dftables line 83.
1>Use of uninitialized value $pcre_internal{”lcc_offset”} in numeric ne (!=) at /cygdrive/e/zhou/programs/BUILD-~1/WEBKIT~2/JAVASC~1/pcre/dftables line 90.
1>Use of uninitialized value $pcre_internal{”fcc_offset”} in numeric ne (!=) at /cygdrive/e/zhou/programs/BUILD-~1/WEBKIT~2/JAVASC~1/pcre/dftables line 108.
1>fcc_offset != 128 at /cygdrive/e/zhou/programs/BUILD-~1/WEBKIT~2/JAVASC~1/pcre/dftables line 109.
1>make: *** [chartables.c] Error 1
1>NMAKE : fatal error U1077:
1>Stop.
1>Project : error PRJ0019: 工具从”正在执行生成文件项目操作”
1>生成日志保存在“file://e:\temp\build-webkit\obj\JavaScriptCoreGenerated\Release\BuildLog.htm”
1>JavaScriptCoreGenerated – 2 个错误,1 个警告
3>—— 已启动生成: 项目: WTF, 配置: Release Win32 ——
3>正在执行预生成事件…
然后查看其错误日志文件,即e:\temp\build-webkit\obj\JavaScriptCoreGenerated\Release\BuildLog.htm文件,它指出的错误不一样:
首先,由一个perl的模块没有找到,即Win32API/Registry.pm;然后,出现make error 127。
Can’t locate Win32API/Registry.pm in @INC (@INC contains: /usr/lib/perl5/5.10/i686-cygwin /usr/lib/perl5/5.10 /usr/lib/perl5/site_perl/5.10/i686-cygwin /usr/lib/perl5/site_perl/5.10 /usr/lib/perl5/vendor_perl/5.10/i686-cygwin /usr/lib/perl5/vendor_perl/5.10 /usr/lib/perl5/vendor_perl/5.10 /usr/lib/perl5/site_perl/5.8 /usr/lib/perl5/vendor_perl/5.8 .) at ../../../WebKitTools/Scripts/num-cpus line 6.
BEGIN failed–compilation aborted at ../../../WebKitTools/Scripts/num-cpus line 6.
。。。。。。
1>make: *** [Grammar.cpp] Error 127
1>make: *** Waiting for unfinished jobs….
先解决第一个问题,发现在cygwin中安装perl时还有一个perl的libwin32api库,应该就是他了,安装之,然后再次build webkit,依然错误,但是perl的这个模块是找对了:
1>Creating hashtable for /cygdrive/e/zhou/programs/BUILD-~1/WEBKIT~2/JAVASC~1/runtime/ArrayPrototype.cpp
1>/cygdrive/e/zhou/programs/BUILD-~1/WEBKIT~2/JAVASC~1/create_hash_table /cygdrive/e/zhou/programs/BUILD-~1/WEBKIT~2/JAVASC~1/runtime/DatePrototype.cpp -i > DatePrototype.lut.h
1>cpp.exe: /tmp/dftables-ZXPMZKFZ.in: No such file or directory
1>cpp.exe: warning: `-x c’ after last input file has no effect
1>cpp.exe: no input files
1>Use of uninitialized value $pcre_internal{”tables_length”} in printf at /cygdrive/e/zhou/programs/BUILD-~1/WEBKIT~2/JAVASC~1/pcre/dftables line 83.
1>Use of uninitialized value $pcre_internal{”lcc_offset”} in numeric ne (!=) at /cygdrive/e/zhou/programs/BUILD-~1/WEBKIT~2/JAVASC~1/pcre/dftables line 90.
1>Use of uninitialized value $pcre_internal{”fcc_offset”} in numeric ne (!=) at /cygdrive/e/zhou/programs/BUILD-~1/WEBKIT~2/JAVASC~1/pcre/dftables line 108.
1>fcc_offset != 128 at /cygdrive/e/zhou/programs/BUILD-~1/WEBKIT~2/JAVASC~1/pcre/dftables line 109.
1>Creating hashtable for /cygdrive/e/zhou/programs/BUILD-~1/WEBKIT~2/JAVASC~1/runtime/DatePrototype.cpp
1>make: *** [chartables.c] Error 1
1>make: *** Waiting for unfinished jobs….
其中红色是肇事处。但是在cygwin的/tmp目录下其实有这个文件的;我把这一行拷贝到cygwin的命令行运行,发现居然也无法找到这个文件,而bash的tab都可以补全这个文件;然后我直接在/tmp目录下运行,发现可以了,这说明cpp.exe不能识别/tmp目录,这是一个奇妙的错误。
我再次运行cygwin的安装程序,发现gcc竟然没有安装,但是哪里来的cpp程序(cpp是gcc的一部分)呢?我在cygwin的目录下搜索,也没有发现gcc;然后,我想起曾经安装过MinSYS,它带有gcc,果然,当我卸载并删除了MinSyS之后,在cygwin中运行gcc时提示没有这个程序。后来我直接清除PATH变量,设定其为UNIX中标准的几个路径,使得编译环境被限定在根目录的范围内。(需要注意的是还需要加入/cygdrive/c/windows和system32,因为需要用到一些windows系统命令,如cmd.exe)
这是一个很弱智、很隐蔽的错误:cygwin使用了系统的环境变量,操作了它的环境之外的程序。因此要保持系统的一致性,对于开发环境来说尤其重要,因为如果对自己的开发环境没有一个明确的把握,就不知道编译为什么出错,甚至不知道为什么会编译成功。
这样设置了之后,再次build webkit,出错是因为没有pthread库,至少已经与环境没有关系了,进入到正常轨道了。
回过头来,看webkit网站的安装文档,发现我安装cygwin的方法不对,有很多软件包没有安装。我彻底清理了操作系统:删除了vs.net 2008,以及vs.net 2005的很多不需要的包,删除了以前为在windows系统中搭建UNIX平台安装的大量软件,如MInWG等。
然后按照webkit网站上的安装文档,下载安装了cgywin(但是前面提到的cygwin会使用系统环境变量的问题依然存在,我在windows中安装的python、sysinteral等工具能在cygwin的bash的PATH中直接找到。)。
第二次尝试
重新安装了编译环境之后,build webkit时(WEBKITLIBRARIESDIR还是必须写为WebKitLibrariesDir)。这时提示unicode/uchar.h、pthread.h、sched.h等没有找到。但是这些头文件应该与cygwin无关,因为根本就不是用gcc编译的,而是vs。考虑到我安装Microsoft Visual Studio 2005 Team Suite Service Pack 1.没有成功(提示版本问题,后来发现是语言问题,在下载页面由一个语言选择下拉菜单,我以为是选择网页的语言的,就直接使用默认的English;后来改成中文后,安装成功了),两个头文件应该是这个sp提供的(后来发现不对,uchar.h是webkit自有的,sched.h没有,那么它用<>来include是为什么?)。#endif
问题在于:
(1),有很多include是用的尖括号,而其.h文件又是webkit自带的,这就要求把这些目录添加到工程中去,事实上在.vsprops文件里已经有了这样的设置,那么为什么找不到呢?
(2),在build之前设定变量WEBKITLIBRARIESDIR和WEBKITOUTPUTDIR之后,对每个子项目的build之前都会拷贝很多的文件到这个目录下,如include和lib,但是我发现,显式指定了这两个变量的值之后,没有完全拷贝(为什么?)。这就是(1)中找不到文件的原因。
(3),关于pthread.h,查看源文件可以看出,是jsc中使用了多线程的原因,但是不知道在什么地方disable。但应该说是一个小问题,因为只需要安装了pthread for windows就行了。
// This is supremely lame that we require pthreads to build on windows.
#if ENABLE(JSC_MULTIPLE_THREADS)
#include
通过多次尝试,现在发现问题还是在于两个变量的设置问题,导致文件拷贝不全或者引用不到。后来通过IRC向人询问,一个老外告诉我,需要先运行脚本update-webkit,这是在webkit的在线文档的“Getting the Code” 一节中说明的,而被我忽略了。
清除了所有代码,全部重新开始。
第三次尝试
首先,解压源代码,运行Webkit/WebKitTools/Script/update-webkit,然后运行build-webkit,提示movies.h(由一个qt)没有找到,似乎是quaketime sdk的东西,于是下载之(需要注册,而我竟然已经有apple的账号了)。
安装后,build出现如下错误,后面的提示显示似乎是头文件中包含了非cp936的字符(就是末尾换行\n的问题),但是重要的是第一个错误不知道什么原因。
C:\Program Files\QuickTime SDK\cincludes\ConditionalMacros.h : error C2220: 警告被视为错误 – 没有生成“object”文件
6>C:\Program Files\QuickTime SDK\cincludes\ConditionalMacros.h : warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
第一个错误的原因是错误级别问题,可以在工程里设置,但是直接修改工程文件不知道在哪里修改,我搜索了一下QtMovieWin的工程文件,查找errorlevel,把1改成3,不管用。
然后,我在系统范围内设定了环境变量WEBKITOUTPUT和WEBKITLIBRARIESDIR,可以用vs.net 2005打开子项目webcore,即QtMovieWin所在的项目。然后在项目属性中把“把警告视为错误”设置为“否”,在vs中编译可以通过;进一步,追溯到QtMovieWin的工程文件,发现在下面的标签发生了变化:(多了紫色部分,注意是对debug,release,debug-internal三种发布形式都修改)
Name=”VCCLCompilerTool”
……
WarnAsError=”false”
改在cygwin中去编译QtMovieWin子项目通过了,但是编译WebCore时还是出现这个错误,同样修改WarnAsError=”false”。
在编译项目WebKit时又碰到这个问题,修改之。Build后,最终成功!