webkit在win32下的编译规则(二)

来源:互联网 发布:国家网络信息贺永强 编辑:程序博客网 时间:2024/06/07 02:26

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

image

1. Javascript Folder

这个目录下有5个工程:JavaScriptCore, JavaScriptGenerated, jsc, testapi, WTF。编译顺序是:JavaScriptGenerated-》WTF-》 JavaScriptCore-》testapi-》jsc。testapi和jsc其实是在比较后面编译的,应为它们依赖于Tools下的FindSafari工程。

首先看JavaScriptGenerated的工程属性,可以看到这个工程是用nmake编译的,如下图:

image

JavaScriptGenerated的工程文件在D:/tools/cygwin/home/xufan/WebKit/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreGeneratedCommon.vsprops,内容如下:

其中编译这个工程使用的命令行(BuildCommandLine)为:

%SystemDrive%/cygwin/bin/which.exe bash
if errorlevel 1 set PATH=%SystemDrive%/cygwin/bin;%PATH%
cmd /c

nmake /nologo -f JavaScriptCoreGenerated.make

从上面可以看到,首先执行which命令在环境变量PATH里面查找bash的位置,如果查找不成功,则将cygwin下面的bin目录加到环境变量里面PATH。接着调用cmd /c, 表示当执行完相应的命令(在命令提示符中)后自动退出命令提示符,这个接的命令为空,应该只是用于刷新命令行环境。最后用nmake去编译JavaScriptCoreGenerated.make这个文件了,JavaScriptCoreGenerated.make文件内容如下:

all规则首先touch $(WEBKITOUTPUTDIR)/buildfailed这个文件,用来更新这个文件的存取时间和更改时间,因为后面有makefile规则依赖于这个文件,这个文件的作用是用来保存编译失败的信息,如果webkit编译失败,可以到这个文件里面看失败的信息。

接着调用build-generated-files.sh这个perl脚本(D:/tools/cygwin/home/xufan/WebKit/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/build-generated-files.sh),脚本内容如下:

这个脚本里面主要是设置一些跟各种目录相关的环境变量,里面用cygpath命令将路径在windows形式(c:/windows)和cygwin形式(/cygdrive/c/windows)作了转换。里面用了num-cpus脚本去获取cpu的个数。最后调用make工具编译$JavaScriptCore/DerivedSources.make这个文件(D:/tools/cygwin/home/xufan/WebKit/JavaScriptCore/DerivedSources.make):

makefile中VPATH的作用有点像命令行中path这个环境变量,make默认只会在当前的目录中去找寻依赖文件和目标文件,如果定义了VPATH,那么make会在当当前目录找不到的情况下,到VPATH定义的目录中去找。

从上面的makefile可以看出,all规则依赖于ArrayPrototype.lut.h,chartables.c,JavaScriptCore.JSVALUE32.exp等文件,*.lut.h等文件的编译规则是:

%.lut.h: create_hash_table %.cpp
    $^ -i > $@

对于ArrayPrototype.lut.h这个文件,这条编译规则展开后就是:

ArrayPrototype.lut.h: create_hash_table ArrayPrototype.cpp

   create_hash_table ArrayPrototype.cpp –i > ArrayPrototype.lut.h

也就是说ArrayPrototype.lut.h依赖于create_hash_table和ArrayPrototype.cpp,编译所采取的action为create_hash_table ArrayPrototype.cpp –i > ArrayPrototype.lut.h,即调用create_hash_table ArrayPrototype.cpp –i来生成ArrayPrototype.lut.h这个文件。

create_hash_table的路径是D:/tools/cygwin/home/xufan/WebKit/JavaScriptCore/create_hash_table,是一个perl脚本,它的作用是分析一个cpp文件的注释中含有@begin @end的部分,然后生成一个用于向js引擎注入对象所有要求的结构体形式的头文件,例如将D:/tools/cygwin/home/xufan/WebKit/JavaScriptCore/runtime/ArrayPrototype.cpp的内容如下(特别注意90到112行):

生成的ArrayPrototype.lut.h内容如下(D:/tools/cygwin/home/xufan/WebKit/WebKitBuild/obj/JavaScriptCore/DerivedSources/ArrayPrototype.lut.h):

ArrayPrototype.lut.h基本将js里面的Array对象的成员方法都列举出来了。

Lexer.lut.h由D:/tools/cygwin/home/xufan/WebKit/JavaScriptCore/parser/Keywords.table这个文件生成,这个文件里面包括了js语法里面的关键字。

chartables.c由D:/tools/cygwin/home/xufan/WebKit/JavaScriptCore/pcre/dftables这个perl脚本生成,主要包括小于128的ASCII字符。

bytecode.html(D:/tools/cygwin/home/xufan/WebKit/WebKitBuild/obj/JavaScriptCore/DerivedSources/docs/bytecode.html)由Interpreter.cpp通过make-bytecode-docs.pl工具生成,里面有对js bytecode的解释,这对于理解js的jit机制是很有帮助的,大致格式如下:

new_object

Format: new_object dst(r)

Constructs a new empty Object instance using the original constructor, and puts the result in register dst.

new_array

Format: new_array dst(r) firstArg(r) argCount(n)

Constructs a new Array instance using the original constructor, and puts the result in register dst. The array will contain argCount elements with values taken from registers starting at register firstArg.

顺便插一句,dalvik的bytecode文档可以参考:http://www.netmite.com/android/mydroid/dalvik/docs/dalvik-bytecode.html。

RegExpJitTables.h由create_regex_tables这个python脚本生成,主要用于yarr(Yet Another Regex Runtime)的jit生成。http://hanblog.info/blog/post/2009/04/23/WebKit-s-week-8里面有对yarr的简单介绍,yarr的svn log:http://celeron.1997open.com/browse.php?u=%3D%3DQM4QjM08CdlNXZn5WYoN2LnJ3buQXarJWZ35yYhJHdv8iO&b=1。

JavaScriptCore.JSVALUE32.exp等exp文件主要用于生成dll时的导出函数,生成规则很简单,将多个exp文件用cat合并到一个文件。

回到JavaScriptCoreGenerated.make这个文件,在执行完build-generated-files.sh,就调用react-to-vsprops-changes.py这个脚本对vsprops做一些处理,主要是处理manifest文件和Platform.h文件。之后就开始拷贝文件和建目录。补充一个小常识,makefile action中-(减号)代表即时这条命令出错,也继续走下去。如果对makefile不熟悉,强烈推荐看陈皓写的《跟我一起写makefile》。

至此,JavaScriptCoreGenerated工程的编译规则写完了,明天接着写WTF工程和JavaScriptCore工程。