九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開(kāi)通VIP
webkit在win32下的編譯規(guī)則
分類: 瀏覽器 makefile 瀏覽器 2010-12-27 22:25 5136人閱讀 評(píng)論(7) 收藏 舉報(bào)

最近有人在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行,如下:

  1. # Build, and abort if the build fails.   
  2. for my $dir (@projects) {   
  3.     chdir $dir or die;   
  4.     my $result = 0;  
  5.     # For Gtk and Qt the WebKit project builds all others   
  6.     if ((isGtk() || isQt()) && $dir ne "WebKit") {   
  7.         chdir ".." or die;   
  8.         next;   
  9.     }  
  10.     if (isGtk()) {   
  11.         $result = buildGtkProject($dir, $clean,  @options);   
  12.     } elsif (isQt()) {   
  13.         $result = buildQMakeQtProject($dir, $clean, @options);   
  14.     } elsif (isAppleMacWebKit()) {   
  15.         $dir = "MiniBrowser" if $dir eq "WebKitTools/MiniBrowser";   
  16.         my @local_options = @options;   
  17.         push @local_options, XcodeCoverageSupportOptions() if $coverageSupport && $dir ne "ANGLE";   
  18.         $result = buildXCodeProject($dir, $clean, @local_options, @ARGV);   
  19.     } elsif (isAppleWinWebKit()) {   
  20.         if ($dir eq "WebKit") {   
  21.             $result = buildVisualStudioProject("win/WebKit.vcproj/WebKit.sln", $clean);   
  22.         }   
  23.     }   
  24.     # Various build* calls above may change the CWD.   
  25.     chdirWebKit();  
  26.     if (exitStatus($result)) {   
  27.         my $scriptDir = relativeScriptsDir();   
  28.         if (usingVisualStudioExpress()) {   
  29.             # Visual Studio Express is so lame it can't stdout build failures.   
  30.             # So we find its logs and dump them to the console ourselves.   
  31.             system(File::Spec->catfile($scriptDir, "print-vse-failure-logs"));   
  32.         }   
  33.         if (isAppleWinWebKit()) {   
  34.             print "/n/n===== BUILD FAILED ======/n/n";   
  35.             print "Please ensure you have run $scriptDir/update-webkit to install dependencies./n/n";   
  36.             my $baseProductDir = baseProductDir();   
  37.             print "You can view build errors by checking the BuildLog.htm files located at:/n$baseProductDir/obj//./n";   
  38.         }   
  39.         exit exitStatus($result);   
  40.     }   
  41. }  
 

在cygwin+vs的環(huán)境下執(zhí)行的是:buildVisualStudioProject("win/WebKit.vcproj/WebKit.sln", $clean),buildVisualStudioProject的代碼如下(在webkitdirs.pm的1205行):

  1. sub buildVisualStudioProject   
  2. {   
  3.     my ($project, $clean) = @_;   
  4.     setupCygwinEnv();  
  5.     my $config = configurationForVisualStudio();  
  6.     dieIfWindowsPlatformSDKNotInstalled() if $willUseVCExpressWhenBuilding;  
  7.     chomp($project = `cygpath -w "$project"`) if isCygwin();   
  8.     my $action = "/build";   
  9.     if ($clean) {   
  10.         $action = "/clean";   
  11.     }  
  12.     my @command = ($vcBuildPath, $project, $action, $config);  
  13.     print join(" ", @command), "/n";   
  14.     return system @command;   
  15. }  
 

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ī)則等。

更多0
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
使用Visual Studio 2010編譯WebKit
[轉(zhuǎn)]WebKit 在 Windows 平臺(tái)下編譯小結(jié)
成功編譯PPC2003下的瀏覽器IseeBrowser
真正能在windows下編譯的linux 0.11,不是在Cygwin,也不是在虛擬機(jī)里!...
NDK的Windwos環(huán)境搭建
cygwin下編譯可在windows下執(zhí)行的程序
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服