webkit在win32下的编译规则

Webkit r37113 For Windows WebKit 是一个开源浏览器网页排版引擎,与之相应的引擎有Gecko(Mozilla,Firefox 等使用的排版引擎)和Trident(也称为MSHTML,IE 使用的排版引擎)。同时WebKit 也是苹果Mac OS X 系统引擎框架版本的名称,主要用于Safari,Dashboard,Mail 和其他一些Mac OS X 程序。WebKit 所包含的 WebCore 排版引擎和 JSCore 引擎来自于 KDE 的 KHTML 和 KJS,当年苹果比较了 Gecko 和 KHTML 后,仍然选择了后者,就因为它拥有清晰的源码结构、极快的渲染速度。  目前使用WebKit 引擎的浏览器主要有:Safari(apple出品),Midori,chrome(google出品)等。 立即下载

最近有人在windows 7下的webkit编译不过去,问我该怎么解决。我看了一下,主要是SVGAnimationElement.cpp等文件编译不过去,这里面使用了开启svg后的一些枚举变量,但webkit在编译时生成的WebKitBuild/include/WebCore/CSSPropertyNames.h文件里面并没有生成这些枚举变量,我检查一些编译选项,配置都是OK的,我又看了一下webkit的编译规则,发现CSSPropertyNames.h的生成是依赖CSSPropertyNames.in等文件。解决方法也简单:将CSSPropertyNames.in等文件里面加上一行后再删除,再编译就OK了。为什么这样就可以了呢?愿意是windows下的makefile的编译依赖并不像linux下那么可靠,有时候windows版的makefile工具在编译出错了也更新了文件的修改时间,导致下次makefile再检查时认为文件没改变,从而跳过去了,上面所说的CSSPropertyNames.in就是这种情况。前面我的blog里面也写了一下webki编译方面的文章,网上也有一些类似的文章,也有很多网友在webkit编译不过时发帖询问,所以我觉得很多人对webkit是如何编译的并不是太清楚,导致编译出错了不知道原因,自然也不知道如何去解决这个问题。久而久之,越来越多的人就会发现编译webkit都是一个问题,更不用说去研究webkit了。为了帮助这些人克服对webkit编译的恐惧,我这几天详细看了一下webkit在windows下的编译规则,写也这篇类似于总结的文章。

1. 目录划分

在webkit源码的根目录下,有Makefile,CMakeLists.txt,android.mk,WebKit.pro等文件与编译有关,其中makefile主要用于linux环境下,windows上虽然用了cygwin,却并没有使用这个makefile去编译;CMakeLists.txt主要是用于cmake环境下,这是一个跨平台的编译环境,但我发现在windows下使用cmake编译的人并不多,这可能主要是因为webkit官网介绍的主要是cgywin+vs的编译方式导致的;WebKit.pro是qt环境下的编译规则,qt自己定了一套编译规则,做了一个类似于makefile的工具qmake,是跨平台的,但是得下一套qt的编译环境或sdk,所以这个也主要是qt的人在维护,不过qt版的webkit发展还是不错的;android.mk是android下webkit的编译规则。这篇文件要介绍的windows编译规则在根目录并没有包含,而是在下面的子目录下实现的,原因可能是这套规则(cygwin+vs)只适合于windows平台,不是一个common的东西,所以不能放在根目录下,cygwin+vs这套环境主要是apple的人在维护,safari的windows版本应该也是使用这套环境编译出来的。顺便提一下,chrome下的编译规则后缀是gypi,例如webcore目录下的WebCore.gypi文件。

 image

webkit主要由3部分组成:JavaScriptCore,WebCore,WebKit。JavaScriptCore下主要是浏览器使用的javascript引擎代码,当使用v8引擎时,这个目录是不参加编译的;WebCore下的代码是浏览器的核心了,包括网页解析,layout,render等,dom规范和css规范的也是在这里面实现的,如果像知道浏览器里面的window对象是如何实现的,可以去WebCore/dom下看看,WebCore下与平台相关的是针对不同平台有不同的目录,编译依赖也是不一样的;WebKit下是提供给浏览器外壳的接口的实现代码。最终,JavaScriptCore被编译成了JavaScriptCore.dll,webcore和webkit目录被编译成了webkit.dll。JavaScriptCore.dll以dll export的方式导出了函数供webcore和webkit使用,webkit.dll则是以COM的方式提供接口给浏览器外壳(例如safari.exe)使用。如果你对比一下webkit目录在mac和windows上的实现,就会发现Object-C和COM的概念有很多方面是相似,只不过Object-C在语言级别将COM思想的一些复杂实现简化了。

在webkit的其他目录,与编译相关的目录还有WebKitLibraries,WebKitTools等。WebKitLibraries里面放着编译依赖的头文件和lib,例如icu,libxml,sqlite的头文件和lib,当我们执行update-webkit命令时,有一步就是从apple官网下载WebKitSupportLibrary.zip,然后解压到WebKitLibraries目录下;WebKitTools主要放着一些工具和例子,与编译相关的主要放着WebKitTools/Scripts目录下,例如update-webkit和build-webkit都是放在这下面,这个目录下perl脚本居多,bat(cmd)和py占少数。这种多种语言混在一起在编译环境里面是很常见的,从中我们可以学到一点的是用最适合的工具和语言做你想做的事情,没必要去争谁好谁坏,每个工具和语言都有自己的优点和弱点,用刀就要用刀刃。工具始终是工具,总有被淘汰的时候和地方,我们真正要关注的是我们的目标。

在windows下,很多人第一次编译webkit都是在cygwin的命令行里面执行build-webkit开始的,build-webkit其实也是调用vs的devenv.exe编译的,只不过它是在命令行编译,而更多人在后期都会使用vs ide去编译,因为比较直观和熟悉。当vs ide有一个问题是有点占内存,它的智能提示会经常扫描文件,弄得cpu占有率很高,最终智能提示生成的ncb文件也很大,不过这个有一个好处是调试的时候比较好找对应的函数实现(如果你的机器够强劲,装上Visual Assist X插件会更好)。vs工程在各个目录的位置如下:

JavaScriptCore:D:/tools/cygwin/home/xufan/WebKit/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj,D:/tools/cygwin/home/xufan/WebKit/JavaScriptCore/JavaScriptCore.vcproj/WTF/WTF.vcproj等

WebCore:D:/tools/cygwin/home/xufan/WebKit/WebCore/WebCore.vcproj下的WebCore.vcproj等

Webkit:D:/tools/cygwin/home/xufan/WebKit/WebKit/win/WebKit.vcproj下的WebKit.vcproj等

整个webkit solution的文件是D:/tools/cygwin/home/xufan/WebKit/WebKit/win/WebKit.vcproj/WebKit.sln,双击可以用vs ide打开。

下面将从webkit的目录挑出一些代表性的编译规则进行讨论:

2. WebKitTools/Scripts目录

首先从update-webkit脚本说起,这个脚本主要是调用svn update(或git)去更新代码(80,81行),然后调用update-webkit-auxiliary-libs,update-webkit-auxiliary-libs通过curl下载WebKitSupportLibrary.zip(92行),最后解压到WebKitLibraries目录下(96行,116行)。

接下来看build-webkit脚本,build-webkit脚本的前344行主要是将命令行参数转换为perl里面的变量,289行到315行可以看到build-webkit支持的参数:

Usage: $programName [options] [options to pass to build system]
  --help                            Show this help message
  --clean                           Cleanup the build directory
  --debug                           Compile in debug mode
  --wincairo                        Build using Cairo (rather than CoreGraphics) on Windows
  --chromium                        Build the Chromium port on Mac/Win/Linux
  --gtk                             Build the GTK+ port
  --qt                              Build the Qt port
  --efl                             Build the EFL port
  --inspector-frontend              Copy changes to the inspector front-end files to the build directory

  --install-headers=          Set installation path for the headers (Qt only)
  --install-libs=             Set installation path for the libraries (Qt only)
  --v8                              Use V8 as JavaScript engine (Qt only)

  --prefix=                   Set installation prefix to the given path (Gtk/Efl only)
  --makeargs=            Optional Makefile flags

  --minimal                         No optional features, unless explicitly enabled.

 

build-webkit接下来调用的很多函数都是在webkitdirs.pm里面定义的(build-webkit的第40行:use webkitdirs),例如productDir(),这个是webkit输出结果的目录,从productDir的实现来看,输出目录主要是由WEBKITOUTPUTDIR这个环境变量决定的(webkitdirs.pm的119行),如果不存在则用根目录下的WebKitBuild目录(154行:$baseProductDir = "$sourceDir/WebKitBuild";)。360行到500行都是做一些检查工作,开始编译是从500行到551行,如下:

 

在cygwin+vs的环境下执行的是:buildVisualStudioProject("win/WebKit.vcproj/WebKit.sln", $clean),buildVisualStudioProject的代码如下(在webkitdirs.pm的1205行):

 

setupCygwinEnv主要是通过环境变量去查找vs的安装位置,然后调用pdevenv脚本(1094行)去根据vs的版本调用不同的脚本去设置vs编译环境。vsvars32.bat和devenv.com应该大家都比较熟(不知道的可以看看开始菜单里面的Visual Studio 2005 Command Prompt快捷方式的指向),调用它们就是在pdevenv脚本里面做的。

最终调用vs的脚本展开后的形式可以看cygwin的命令行输出(见上面的my @command = ($vcBuildPath, $project, $action, $config);及其下面的一行),我这边是:

/home/xufan/Webkit/WebKitTools/Scripts/pdevenv win/WebKit.vcproj/WebKit.sln /build Debug_Cairo_CFLite

调用devenv.exe之后,编译规则就完全是vs的规则了,入口是WebKit/win/WebKit.vcproj/WebKit.sln,比较重要的工程是上面所说的JavaScriptCore.vcproj,WebCore.vcproj和WebKit.vcproj这几个工程了。

今天就先到这了,明天接着写这些比较重要的vs工程,重点包括js dom的对象(例如window对象)粘合(glue)到javascriptCore的代码是如何自动生成的,如果根据css关键字生成代码,webcore下面文件的编译顺序和规则等。

webkit编译 webkit支持很多的porting,而每个porting的编译都不一样。但是webkit有一个perl脚本用来管理这些编译build-webkitwebkitdirs.pm但是要深入开发时,必须要看懂编译系统,才能做自己的东西。其中qt用的是qmake来生成makefile,*.pro和*.priwinceefl用cmake来生成makefile,相关文件是CMakeLists.txt和CMakeLists${PORT}.txtgtk用autotools来生成makefile,其他的可以从webki 阅读详情

相关推荐

webkit 学习笔记 1

现代浏览器的组件:     HTML、XML、CSS、JavsScript解析器     Layout     文字和图形渲染     图像解码     GPU交互     网络访问     硬件加速 WebKit ports:     Safari         OS X Safari和Windows Safari使用的是不同的port         用于O

iamtaoyu的专栏 517

Windows 7, Visual Studio 2015下编译Webkit

因工作需要,需要编译Windows版本的Webkit,中间走了不少弯路,都记录下来,供大家参考!也随时欢迎大家讨论(QQ群:345802342) 整个编译工作参考的是官方文档:https://webkit.org/webkit-on-windows/ 1. 主要的时间是下载代码,不需要VPN,我晚上下载的,第二天就好了;这个步骤应该不会有什么问题; 2. 文档上要求的工具我除了下面四...

weixin_30603633的博客 232

CMake命令之list

用途:提供一些列表操作 list(LENGTH )   list(GET [ ...]        )   list(APPEND [ ...])   list(FIND )   list(INSERT [ ...])   list(REMOVE_ITEM [ ...])   list(REMOVE_AT [ ...])   list(REMOVE_DUPLIC

山庄来客的专栏 2万+

CMake学习记录--list(列表操作命令)

CMake是一个跨平台的工程管理工具,能方便的把工程转换为vs各个版本、Borland Makefiles、MSSYS Makefiles、NMake Makefiles等工程,对于经常在不同IDE下使用管理同一个工程提供了很大的便利。自己把使用过程中的点点滴滴记录下来。 list列表操作命令。 1、 list(LENGTH <list> ...

weixin_34146410的博客 944

webkitwin32下的编译规则(八)

HTMLElementFactory.cpp和HTMLNames.cpp是由如下规则生成的: ifdef HTML_FLAGS HTMLElementFactory.cpp HTMLNames.cpp : dom/make_names.pl html/HTMLTagNames.in html/HTMLAttributeNames.in     perl -I $(WebCore)/bindings/scripts $û,在浏览器打开就可以看见一个世界地图。 WMLElementF

xu的blog 7463

webkitwin32下的编译规则(三)

首先来看WTF这个project,这个project的Pre-build event如下: 1: REM Do not edit from the Visual Studio IDE! Customize via a $(ProjectName)PreBuild.cmd file. 2: if not exist "$(ProjectDir)$(ProjectName)PreBuild.cmd" exit /b 3: 

xu的blog 5082

webkitwin32下的编译规则(二)

现在的webkit分为4个Floder:Javascript Folder,Tools,WebCore Folder,Webkit2 Folder,WebkitCom Folder,这5个目录的编译顺序基本是:Javascript Folder-》WebCore Folder-》WebkitCom Folder-》Webkit2 Folder-》Tools(有些子工程的顺序并不是这样的),下面就以这几个目录为单位来说明webkit编译规则。 1. Javascript Folder 这个目录下有

xu的blog 8063

webkitwin32下的编译规则(四)

接下来看JavaScriptCore这个工程,这个工程继承的project property sheet如下: ../../../../WebKitLibraries/win/tools/vsprops/FeatureDefinesCairo.vsprops ../../../../WebKitLibraries/win/tools/vsprops/common.vsprops ../../../../WebKitLibraries/win/tools/vsprops/debug.vspro

xu的blog 5146

webkitwin32下的编译规则(六)

WebCore Folder下面的有3个工程:QTMovieWin,WebCore,WebCoreGenerated,编译的顺序是:WebCoreGenerated-》QTMovieWin-》QTMovieWin。 首先来看WebCoreGenerated这个工程,这个工程的NMake Build Comand Line如下: %SystemDrive%/cygwin/bin/which.exe bash if errorlevel 1 set PATH=%SystemDrive%/cygwin/bin;

xu的blog 5850

webkitwin32下的编译规则(七)

首先看$(JS_DOM_HEADERS),这些文件都是以JS开头的,对其做处理的是如下规则: JS%.h : %.idl $(JS_BINDINGS_SCRIPTS)    $(call generator_script, $(JS_BINDINGS_SCRIPTS)) $(IDL_COMMON_ARGS) --defines "$(FEATURE_DEFINES) $(ADDITIONAL_IDL_DEFINES) LANGUAGE_JAVASCRIPT" --generator JS $ CSSGram

xu的blog 6504

webkitwin32下的编译规则(九)

webkitwin32下的编译规则(七)中,曾经说到要专门介绍js binding这部分的,但后面逐渐忘记了,最近有网友提起,特加入js binding这部分的介绍。 首先来说是js engine,js engine是一个解释器。解释器比较直观的就是命令行(cmd.exe)

xu的blog 1万+
上一篇: CDialog里面的Webkit
下一篇: webkit在win32下的编译规则(二)
chief1985
博客等级 码龄21年 1545粉丝 879原创
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值