現在的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
這個目錄下有5個工程:JavaScriptCore, JavaScriptGenerated, jsc, testapi, WTF。編譯順序是:JavaScriptGenerated-》WTF-》 JavaScriptCore-》testapi-》jsc。testapi和jsc其實是在比較後面編譯的,應爲它們依賴於Tools下的FindSafari工程。
首先看JavaScriptGenerated的工程屬性,可以看到這個工程是用nmake編譯的,如下圖:
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工程。