最近有人在windows 7下的webkit編譯不過(guò)去,問(wèn)我該怎么解決。我看了一下,主要是SVGAnimationElement.cpp等文件編譯不過(guò)去,這里面使用了開(kāi)啟svg后的一些枚舉變量,但webkit在編譯時(shí)生成的WebKitBuild/include/WebCore/CSSPropertyNames.h文件里面并沒(méi)有生成這些枚舉變量,我檢查一些編譯選項(xiàng),配置都是OK的,我又看了一下webkit的編譯規(guī)則,發(fā)現(xiàn)CSSPropertyNames.h的生成是依賴CSSPropertyNames.in等文件。解決方法也簡(jiǎn)單:將CSSPropertyNames.in等文件里面加上一行后再刪除,再編譯就OK了。為什么這樣就可以了呢?愿意是windows下的makefile的編譯依賴并不像linux下那么可靠,有時(shí)候windows版的makefile工具在編譯出錯(cuò)了也更新了文件的修改時(shí)間,導(dǎo)致下次makefile再檢查時(shí)認(rèn)為文件沒(méi)改變,從而跳過(guò)去了,上面所說(shuō)的CSSPropertyNames.in就是這種情況。前面我的blog里面也寫了一下webki編譯方面的文章,網(wǎng)上也有一些類似的文章,也有很多網(wǎng)友在webkit編譯不過(guò)時(shí)發(fā)帖詢問(wèn),所以我覺(jué)得很多人對(duì)webkit是如何編譯的并不是太清楚,導(dǎo)致編譯出錯(cuò)了不知道原因,自然也不知道如何去解決這個(gè)問(wèn)題。久而久之,越來(lái)越多的人就會(huì)發(fā)現(xiàn)編譯webkit都是一個(gè)問(wèn)題,更不用說(shuō)去研究webkit了。為了幫助這些人克服對(duì)webkit編譯的恐懼,我這幾天詳細(xì)看了一下webkit在windows下的編譯規(guī)則,寫也這篇類似于總結(jié)的文章。
1. 目錄劃分
在webkit源碼的根目錄下,有Makefile,CMakeLists.txt,android.mk,WebKit.pro等文件與編譯有關(guān),其中makefile主要用于linux環(huán)境下,windows上雖然用了cygwin,卻并沒(méi)有使用這個(gè)makefile去編譯;CMakeLists.txt主要是用于cmake環(huán)境下,這是一個(gè)跨平臺(tái)的編譯環(huán)境,但我發(fā)現(xiàn)在windows下使用cmake編譯的人并不多,這可能主要是因?yàn)閣ebkit官網(wǎng)介紹的主要是cgywin+vs的編譯方式導(dǎo)致的;WebKit.pro是qt環(huán)境下的編譯規(guī)則,qt自己定了一套編譯規(guī)則,做了一個(gè)類似于makefile的工具qmake,是跨平臺(tái)的,但是得下一套qt的編譯環(huán)境或sdk,所以這個(gè)也主要是qt的人在維護(hù),不過(guò)qt版的webkit發(fā)展還是不錯(cuò)的;android.mk是android下webkit的編譯規(guī)則。這篇文件要介紹的windows編譯規(guī)則在根目錄并沒(méi)有包含,而是在下面的子目錄下實(shí)現(xiàn)的,原因可能是這套規(guī)則(cygwin+vs)只適合于windows平臺(tái),不是一個(gè)common的東西,所以不能放在根目錄下,cygwin+vs這套環(huán)境主要是apple的人在維護(hù),safari的windows版本應(yīng)該也是使用這套環(huán)境編譯出來(lái)的。順便提一下,chrome下的編譯規(guī)則后綴是gypi,例如webcore目錄下的WebCore.gypi文件。
webkit主要由3部分組成:JavaScriptCore,WebCore,WebKit。JavaScriptCore下主要是瀏覽器使用的javascript引擎代碼,當(dāng)使用v8引擎時(shí),這個(gè)目錄是不參加編譯的;WebCore下的代碼是瀏覽器的核心了,包括網(wǎng)頁(yè)解析,layout,render等,dom規(guī)范和css規(guī)范的也是在這里面實(shí)現(xiàn)的,如果像知道瀏覽器里面的window對(duì)象是如何實(shí)現(xiàn)的,可以去WebCore/dom下看看,WebCore下與平臺(tái)相關(guān)的是針對(duì)不同平臺(tái)有不同的目錄,編譯依賴也是不一樣的;WebKit下是提供給瀏覽器外殼的接口的實(shí)現(xiàn)代碼。最終,JavaScriptCore被編譯成了JavaScriptCore.dll,webcore和webkit目錄被編譯成了webkit.dll。JavaScriptCore.dll以dll export的方式導(dǎo)出了函數(shù)供webcore和webkit使用,webkit.dll則是以COM的方式提供接口給瀏覽器外殼(例如safari.exe)使用。如果你對(duì)比一下webkit目錄在mac和windows上的實(shí)現(xiàn),就會(huì)發(fā)現(xiàn)Object-C和COM的概念有很多方面是相似,只不過(guò)Object-C在語(yǔ)言級(jí)別將COM思想的一些復(fù)雜實(shí)現(xiàn)簡(jiǎn)化了。
在webkit的其他目錄,與編譯相關(guān)的目錄還有WebKitLibraries,WebKitTools等。WebKitLibraries里面放著編譯依賴的頭文件和lib,例如icu,libxml,sqlite的頭文件和lib,當(dāng)我們執(zhí)行update-webkit命令時(shí),有一步就是從apple官網(wǎng)下載WebKitSupportLibrary.zip,然后解壓到WebKitLibraries目錄下;WebKitTools主要放著一些工具和例子,與編譯相關(guān)的主要放著WebKitTools/Scripts目錄下,例如update-webkit和build-webkit都是放在這下面,這個(gè)目錄下perl腳本居多,bat(cmd)和py占少數(shù)。這種多種語(yǔ)言混在一起在編譯環(huán)境里面是很常見(jiàn)的,從中我們可以學(xué)到一點(diǎn)的是用最適合的工具和語(yǔ)言做你想做的事情,沒(méi)必要去爭(zhēng)誰(shuí)好誰(shuí)壞,每個(gè)工具和語(yǔ)言都有自己的優(yōu)點(diǎn)和弱點(diǎn),用刀就要用刀刃。工具始終是工具,總有被淘汰的時(shí)候和地方,我們真正要關(guān)注的是我們的目標(biāo)。
在windows下,很多人第一次編譯webkit都是在cygwin的命令行里面執(zhí)行build-webkit開(kāi)始的,build-webkit其實(shí)也是調(diào)用vs的devenv.exe編譯的,只不過(guò)它是在命令行編譯,而更多人在后期都會(huì)使用vs ide去編譯,因?yàn)楸容^直觀和熟悉。當(dāng)vs ide有一個(gè)問(wèn)題是有點(diǎn)占內(nèi)存,它的智能提示會(huì)經(jīng)常掃描文件,弄得cpu占有率很高,最終智能提示生成的ncb文件也很大,不過(guò)這個(gè)有一個(gè)好處是調(diào)試的時(shí)候比較好找對(duì)應(yīng)的函數(shù)實(shí)現(xiàn)(如果你的機(jī)器夠強(qiáng)勁,裝上Visual Assist X插件會(huì)更好)。vs工程在各個(gè)目錄的位置如下:
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等
整個(gè)webkit solution的文件是D:/tools/cygwin/home/xufan/WebKit/WebKit/win/WebKit.vcproj/WebKit.sln,雙擊可以用vs ide打開(kāi)。
下面將從webkit的目錄挑出一些代表性的編譯規(guī)則進(jìn)行討論:
2. WebKitTools/Scripts目錄
首先從update-webkit腳本說(shuō)起,這個(gè)腳本主要是調(diào)用svn update(或git)去更新代碼(80,81行),然后調(diào)用update-webkit-auxiliary-libs,update-webkit-auxiliary-libs通過(guò)curl下載WebKitSupportLibrary.zip(92行),最后解壓到WebKitLibraries目錄下(96行,116行)。
接下來(lái)看build-webkit腳本,build-webkit腳本的前344行主要是將命令行參數(shù)轉(zhuǎn)換為perl里面的變量,289行到315行可以看到build-webkit支持的參數(shù):
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接下來(lái)調(diào)用的很多函數(shù)都是在webkitdirs.pm里面定義的(build-webkit的第40行:use webkitdirs),例如productDir(),這個(gè)是webkit輸出結(jié)果的目錄,從productDir的實(shí)現(xiàn)來(lái)看,輸出目錄主要是由WEBKITOUTPUTDIR這個(gè)環(huán)境變量決定的(webkitdirs.pm的119行),如果不存在則用根目錄下的WebKitBuild目錄(154行:$baseProductDir = "$sourceDir/WebKitBuild";)。360行到500行都是做一些檢查工作,開(kāi)始編譯是從500行到551行,如下:
在cygwin+vs的環(huán)境下執(zhí)行的是:buildVisualStudioProject("win/WebKit.vcproj/WebKit.sln", $clean),buildVisualStudioProject的代碼如下(在webkitdirs.pm的1205行):
setupCygwinEnv主要是通過(guò)環(huán)境變量去查找vs的安裝位置,然后調(diào)用pdevenv腳本(1094行)去根據(jù)vs的版本調(diào)用不同的腳本去設(shè)置vs編譯環(huán)境。vsvars32.bat和devenv.com應(yīng)該大家都比較熟(不知道的可以看看開(kāi)始菜單里面的Visual Studio 2005 Command Prompt快捷方式的指向),調(diào)用它們就是在pdevenv腳本里面做的。
最終調(diào)用vs的腳本展開(kāi)后的形式可以看cygwin的命令行輸出(見(jiàn)上面的my @command = ($vcBuildPath, $project, $action, $config);及其下面的一行),我這邊是:
/home/xufan/Webkit/WebKitTools/Scripts/pdevenv win/WebKit.vcproj/WebKit.sln /build Debug_Cairo_CFLite
調(diào)用devenv.exe之后,編譯規(guī)則就完全是vs的規(guī)則了,入口是WebKit/win/WebKit.vcproj/WebKit.sln,比較重要的工程是上面所說(shuō)的JavaScriptCore.vcproj,WebCore.vcproj和WebKit.vcproj這幾個(gè)工程了。
今天就先到這了,明天接著寫這些比較重要的vs工程,重點(diǎn)包括js dom的對(duì)象(例如window對(duì)象)粘合(glue)到j(luò)avascriptCore的代碼是如何自動(dòng)生成的,如果根據(jù)css關(guān)鍵字生成代碼,webcore下面文件的編譯順序和規(guī)則等。
聯(lián)系客服