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: oolscygwinhomexufanWebKitWebKitBuildDebug_Cairo_CFLiteobjWebCoreDerivedSourcesJSDOMWindow.cpp和D: oolscygwinhomexufanWebKitWebKitBuildDebug_Cairo_CFLiteobjWebCoreDerivedSourcesJSDOMWindow.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.易做图.org/wiki/Inte易做图ce_description_language里面的描述,例如XPIDL,Microsoft Inte易做图ce 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: oolscygwinhomexufanWebKitSourceWebCorecssCSSGrammar.y这个文件而生成。Bison是一个与yacc类似的工具,主页在http://www.gnu.org/software/bison/,中文文档可以参考aspx">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: oolscygwinhomexufanWebKitSourceWebCoreplatformColorData.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.gperfDocTypeStrings.gperf(D: oolscygwinhomexufanWebKitSourceWebCorehtmlDocTypeStrings.gperf)定义了webkit支持的DocType,例如//w3c//dtd html 4.01 transitional//en,以及如何用什么模式来解析,例如PubIDInfo::eQuirks3,PubIDInfo::eAlmostStandards,PubIDInfo::eQuirks等。doctype的验证可以参考http://htmlhelp.com/tools/validator/doctype.html和http://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: oolscygwinhomexufanWebKitSourceWebCoreplatformHashTools.h,可以看出webkit现在只有3种模式,如下:
struct PubIDInfo {
enum eMode {
eQuirks,
eQuirks3,
eAlmostStandards
};const char* name;
eMode mode_if_no_sysid;
eMode mode_if_sysid;
};
补充:综合编程 , 其他综合 ,