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

首先看$(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 $<

這條規則要處理大約450個文件,所以在編譯WebCoreGenerated這個工程時大部分都是類似的輸出,這條規則的command展開後的形式如下:

perl -I /cygdrive/d/tools/cygwin/home/xufan/WebKit/WebCore/bindings/scripts/ /cygdrive/d/tools/cygwin/home/xufan/WebKit/WebCore/bindings/scripts/generate-bindings.pl --include dom --include html --include css --include page --include notifications --include xml --include svg --write-dependencies --outputDir . --defines " ENABLE_3D_CANVAS ENABLE_3D_RENDERING ENABLE_CHANNEL_MESSAGING ENABLE_DATABASE ENABLE_DATAGRID ENABLE_DATALIST ENABLE_DIRECTORY_UPLOAD ENABLE_DOM_STORAGE ENABLE_EVENTSOURCE ENABLE_FILTERS ENABLE_ICONDATABASE ENABLE_JAVASCRIPT_DEBUGGER ENABLE_NOTIFICATIONS ENABLE_OFFLINE_WEB_APPLICATIONS ENABLE_SHARED_WORKERS ENABLE_SVG ENABLE_SVG_ANIMATION ENABLE_SVG_AS_IMAGE ENABLE_SVG_FONTS ENABLE_SVG_FOREIGN_OBJECT ENABLE_SVG_USE ENABLE_WEB_SOCKETS ENABLE_WORKERS ENABLE_XPATH ENABLE_XSLT  LANGUAGE_JAVASCRIPT" --generator JS /cygdrive/d/tools/cygwin/home/xufan/WebKit/Source/WebCore/page/DOMWindow.idl

command主要是調用d:/tools/cygwin/home/xufan/WebKit/WebCore/bindings/scripts/generate-bindings.pl這個perl腳本對IDL文件做處理,即根據IDL文件生成h和cpp文件,例如DOMWindow.idl就生成了D:/tools/cygwin/home/xufan/WebKit/WebKitBuild/Debug_Cairo_CFLite/obj/WebCore/DerivedSources/JSDOMWindow.cpp和D:/tools/cygwin/home/xufan/WebKit/WebKitBuild/Debug_Cairo_CFLite/obj/WebCore/DerivedSources/JSDOMWindow.h這兩個文件。DOMWindow.idl裏面定義了window對象的方法,屬性和事件等,對此感興趣的可以看看DOMWindow.idl,JSDOMWindow.cpp和JSDOMWindow.h這3個文件,看這幾個文件比看html參考手冊有用。generate-bindings.pl的實現細節後面會專門進行介紹,個人感覺用antlr等工具處理應該更方便點。

在這裏需要特別說明的是DOMWindow.idl等IDL文件並不是微軟COM技術裏面的IDL文件格式,而是IDL文件的一個變種WebIDL(http://www.w3.org/TR/WebIDL/)。IDL有很多形式,可以參考http://en.wikipedia.org/wiki/Interface_description_language裏面的描述,例如XPIDLMicrosoft Interface Definition Language等,這裏面還將Google的Protocol Buffers也歸爲了一種IDL。在關於web idl的中文介紹中,比較多的都說到了“周杰倫”(http://www.pbdigg.net/show.php?tid=5227),堪稱出現在W3C規範裏的第一人。

webkit對web idl做了一些改動,相關改動可以參考https://trac.webkit.org/wiki/IdlAttributes

$(WEB_DOM_HEADERS),這些文件都是以WebDOM開頭的,對其做處理的是如下規則:

WebDOM%.h : %.idl $(CPP_BINDINGS_SCRIPTS)
    $(call generator_script, $(CPP_BINDINGS_SCRIPTS)) $(IDL_COMMON_ARGS) --defines "$(FEATURE_DEFINES) $(ADDITIONAL_IDL_DEFINES) LANGUAGE_CPP" --generator CPP $<

這些的處理基本與JS_DOM_HEADERS一樣,只是一些選項不一樣。

JSJavaScriptCallFrame.h和JSSVGElementWrapperFactory.cpp的處理和JS_DOM_HEADERS一樣,因爲其是以JS開頭的。

CSSGrammar.cpp由如下規則生成:

CSSGrammar.cpp : css/CSSGrammar.y
    bison -d -p cssyy $< -o $@
    touch CSSGrammar.cpp.h
    touch CSSGrammar.hpp
    echo '#ifndef CSSGrammar_h' > CSSGrammar.h
    echo '#define CSSGrammar_h' >> CSSGrammar.h
    cat CSSGrammar.cpp.h CSSGrammar.hpp >> CSSGrammar.h
    echo '#endif' >> CSSGrammar.h
    rm -f CSSGrammar.cpp.h CSSGrammar.hpp

從上面可以看出,CSSGrammar.cpp通過使用bison工具處理D:/tools/cygwin/home/xufan/WebKit/Source/WebCore/css/CSSGrammar.y這個文件而生成。Bison是一個與yacc類似的工具,主頁在http://www.gnu.org/software/bison/,中文文檔可以參考http://blog.csdn.net/sirouni2003/archive/2005/06/22/400672.aspx。大家可以通過看CSSGrammar.y這個文件來了解webkit的css語法規則。

CSSPropertyNames.h 由如下規則生成:

CSSPropertyNames.h : $(WEBCORE_CSS_PROPERTY_NAMES) css/makeprop.pl
    if sort $(WEBCORE_CSS_PROPERTY_NAMES) | uniq -d | grep -E -v '(^#)|(^[[:space:]]*$$)'; then echo 'Duplicate value!'; exit 1; fi
    cat $(WEBCORE_CSS_PROPERTY_NAMES) > CSSPropertyNames.in
    perl "$(WebCore)/css/makeprop.pl"

展開這條規則的command後可以看出,CSSPropertyNames.h是由CSSPropertyNames.in,SVGCSSPropertyNames.in,DashboardSupportCSSPropertyNames.in等文件通過makeprop.pl這個perl腳本生成。CSSPropertyNames.in等文件定義了css屬性裏面的關鍵字,例如的內容如下:

CSSPropertyNames.in

CSSValueKeywords.h的處理規則和CSSPropertyNames.h的處理規則類似,如下:

CSSValueKeywords.h : $(WEBCORE_CSS_VALUE_KEYWORDS) css/makevalues.pl
    # Lower case all the values, as CSS values are case-insensitive
    perl -ne 'print lc' $(WEBCORE_CSS_VALUE_KEYWORDS) > CSSValueKeywords.in
    if sort CSSValueKeywords.in | uniq -d | grep -E -v '(^#)|(^[[:space:]]*$$)'; then echo 'Duplicate value!'; exit 1; fi
    perl "$(WebCore)/css/makevalues.pl"

CSSValueKeywords.h主要定義了css的值中可以使用的關鍵字,例如style=”align:middle”裏面的middle。

ColorData.cpp由如下規則生成:

ColorData.cpp : platform/ColorData.gperf $(WebCore)/make-hash-tools.pl
    perl $(WebCore)/make-hash-tools.pl . $(WebCore)/platform/ColorData.gperf

從上面可以看到,ColorData.cpp是將D:/tools/cygwin/home/xufan/WebKit/Source/WebCore/platform/ColorData.gperf這個文件用make-hash-tools.pl生成的。ColorData.gperf主要定義了一些css裏面支持的帶名字的顏色,例如red,white,black等。

DocTypeStrings.cpp與ColorData.cpp一樣,都是通過make-hash-tools.pl生成,如下:

DocTypeStrings.cpp : html/DocTypeStrings.gperf $(WebCore)/make-hash-tools.pl
    perl $(WebCore)/make-hash-tools.pl . $(WebCore)/html/DocTypeStrings.gperf

DocTypeStrings.gperf(D:/tools/cygwin/home/xufan/WebKit/Source/WebCore/html/DocTypeStrings.gperf)定義了webkit支持的DocType,例如//w3c//dtd html 4.01 transitional//en,以及如何用什麼模式來解析,例如PubIDInfo::eQuirks3,PubIDInfo::eAlmostStandards,PubIDInfo::eQuirks等。doctype的驗證可以參考http://htmlhelp.com/tools/validator/doctype.htmlhttp://www.w3.org/QA/2002/04/valid-dtd-list.html。IE的doctype處理可以參考http://blog.csdn.net/WinGeek/archive/2011/02/22/6198996.aspx,超級複雜,看的人頭暈。PubIDInfo 的定義在D:/tools/cygwin/home/xufan/WebKit/Source/WebCore/platform/HashTools.h,可以看出webkit現在只有3種模式,如下:

struct PubIDInfo {
    enum eMode {
        eQuirks,
        eQuirks3,
        eAlmostStandards
    };

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