webkit在win32下的編譯規則(二)

現在的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工程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章