中国新歌声插播广告:我的笔记本 ? windows xp下Webkit编译过程总结

来源:百度文库 编辑:中财网 时间:2024/04/29 18:58:03

windows xp下Webkit编译过程总结

经过三次尝试,终于在windows平台上成功编译了webkit所有项目。回过头来看其实并没有什么根本性的难点,碰到的所有问题几乎都是对编译平台的 理解有问题,也就是说大项目开发的基本功的欠缺。大项目的结构,工程文件的编写事实上很重要,而往往被我们忽略,尤其在windows平台下,IDE工具 的使用掩盖了很多东西,使得我们对项目的控制力依附于各种菜单,而大项目往往需要脚本来控制编译流程和设置编译环境的。


上述几次尝试中碰到的问题其实只有一个:编译环境的搭建。第一、二次尝试的问题都是因为环境搭建不对。严格按照webkit官方文档(http://webkit.org/building/tools.html)的步骤(还要增加一个预备步骤)做的话不会有什么问题。

  1. 预 备步骤:清除系统中安装的其他编译器如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)。
  2. 安装VS.net 2005:不需要安装很多组件,只需要选择Visual C++下的几个(可去除“智能设备xxx”)就行了;其他的全部不选。

  3. 安装Microsoft Visual Studio 2005 Team Suite Service Pack 1,注意选择语言为简体中文,否则安装不上。

  4. 安装cygwin:从webkit官网上下载cygwin-downloader,运行就会下载所有需要的cygwin软件包,安装时指定从本地安装,即刚才下载的目录。安装好后重新设定PATH,排除外界干扰。
  5. 安装QuickTime:从webkit官网的链接到apple网站上下载,安装。
  6. 下载源代码:可以在cygwin中用svn下载,但是svn的代码非常大,1G多,所以还是直接下tarball比较好。

    注意:下载并解压后,一定要运行./WebKitTools/Scripts/update-webkit脚本,否则会出现“unicode/uchar.h,pthread.h,sched.h没有找到”之类的错误,这类错误很让人迷惑,容易引入歧路,浪费时间。

  7. 下载WebKitSupport库:下载后直接放到WebKit根目录下,不要解压缩。
  8. 运 行./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文件出错。修改后保存即可。

  9. 运行./WebKtiTools/Scripts/run-safari就可以在safari下运行这个新内核了。

感受:

还没有在windows下编译过大项目,对vs.net也不熟悉,因此经常被简单的问题困扰,但是我认为编译过程还是很重要的,可以帮助(确切的说是强 迫)你去熟悉项目的目录结构,脚本执行顺序,环境变量,子项目划分等等。试想,如果下载了源代码之后,运行一下build-webkit就全部搞定的话, 你又获得了什么呢?所以编译时碰到问题不要气馁,记住里维斯的话:“太棒了,这样的事情竟然发生在我的身上,又给了我一个成长的机会。凡事的发生必有其因果,必有助于我。”。

June 19th, 2009 | Tags: WebKit, 编译 | Category: WebKit | Comments are closed

3 comments to windows xp下Webkit编译过程总结

  • admin June 19th, 2009 at 14:48

    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是为什么?)。
    问题在于:
    (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 #endif

    通过多次尝试,现在发现问题还是在于两个变量的设置问题,导致文件拷贝不全或者引用不到。后来通过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后,最终成功!