1. 程式人生 > >深入理解webkit核心系列第一篇:如何快速編譯

深入理解webkit核心系列第一篇:如何快速編譯

       webkit自從Apple開發原始碼之後,經過google大力發展,目前webkit已經相當盛行,大量的瀏覽器開發人員對於webkit核心各種疑問隨之而來,小編從08年開始涉足webkit,對於webkit核心知識稍有心得,小編會打造一個系列,對這塊做一個深入的探討。由於個人能力所限難免有紕漏,歡迎大家提出自己意見,一起進步。

       最近發現詢問webkit如何編譯的人很多,為了方便大家寫一篇關於如何在linux下面編譯webkit的文章,方便大家來學習討論。我們知道webkit是一個跨平臺的瀏覽器能夠在蘋果,windows,linux等平臺執行。個人對linux平臺稍微熟悉些,本文主要先從介紹在linux平臺下如何編譯成功webkit。

一:環境準備

(1).

直接安裝ubuntu 12.04 系統,目前ubuntu 13.10好像都出來了,建議最好在高一些版本上去編譯webkit,因為新版本的webkit對基本依賴庫的版本要求很高,如果是低版本的ubuntu系統,在環境方面需要做的事情還是很多;除了直接安裝ubuntu系統,假如不想單獨又裝一個linux系統,可以選擇在windows系統上面安裝虛擬機器,然後再虛擬機器裡面安裝linux系統,這樣可能在效能上慢一些,但是可以在windows系統上繼續工作。

(2).虛擬機器的選擇

一般來說vimware virtualbox 是大家常用的虛擬機器,個人覺得VirtualBox更好用些


目前VirtualBox 最新的版本是4.3.8,直接下載安裝。

等安裝完畢,我們需要設定一下基本的引數最主要的包括以下幾方面

cpu個數設定,記憶體大小設定,以及共享空間的設定。

 cpu個數主要根據你機器配置決定,如果有多核儘量使用多核。

 記憶體要根據你自己記憶體實際情況決定,假如有2G記憶體,可以給虛擬機器分配1.5G 主要為了保證編譯webkit能夠更加快。

共享檔案,虛擬機器裡面的linux和window的資料共享有很多方式,下面介紹其中一種在設定裡面選擇資料共享空間


這樣就可以在window裡面設定一個資料夾作為共享檔案。

在虛擬機器裡面執行

mount -t vboxsf share /mnt

share是在設定的共享檔案件裡面所起的名字,mnt目錄是windows共享目錄掛載的位置,這樣資料就可以互通了。

羅裡囉嗦的說了這麼多和環境相關的東西,現在我們正式進入webkit編譯環節。

(3).webkit 原始碼獲取

Webkit是程式碼是開源的所以我們直接從官方網站可以直接拿到,最新程式碼。

但是最新的webkit原始碼對環境的要求還是比較高,主要是依賴庫方面。舉個簡單的例子,最新的webkit的版本對gcc的要求4.7+,而大多的linux系統都apt-get安裝的都達不到這一要求,所以對於初學者來說,最好下載一個相對舊一些的版本去編譯學習,因為新舊版本的webkit在整體構架上區別不是特別大,並不影響初學者去學習,個人建議下載2011年或者2012年的版本去編譯學習。

實際上官方網站給我們提供了很多有用的資訊,比如blog,或者高層的框架流程圖。以及依賴環境的安裝

下面舉個例子:

這個裡面包含如何在各個平臺編譯webkit


這裡面如何編譯程式碼如何去解決bug或者發現bug並且提交bug,讓我們自己親自參與到開源社群中。

 二: 具體編譯過程遇到的問題,以及相應的解決方案

拿到程式碼之後我們

tar xvf  webkit版本

依賴環境的安裝

$ Tools/gtk/install-dependencies
直接執行這個檔案下面的指令碼完成依賴環境的搭建,但是任何事情都不是想象的那麼簡單直接就可以編譯出可執行的webkit二進位制檔案

1. 

實際上我們在編譯的時候,個人倒是覺得根據webkit自己報出的錯誤而去思考尋找解決的方案,因為對於初學者來說,做什麼都是一帆風順,反而學不到什麼東西。下面會列舉一些出現的錯誤,以及一些解決方案。


我們看到一個很明顯的錯誤AM_PATH_GLIB_2_0

這個時候我們直接執行

 apt-get install libglib2.0-dev

下面是執行這個程式碼的截圖


2.

Can't exec "libtoolize": No such file or directory at /usr/bin/autoreconf line 196.
Use of uninitialized value in pattern match (m//) at /usr/bin/autoreconf line 196.
autoreconf: Entering directory `.'
autoreconf: configure.ac: not using Gettext
autoreconf: running: aclocal -I Source/autotools 
autoreconf: configure.ac: tracing
autoreconf: configure.ac: not using Libtool
autoreconf: running: /usr/bin/autoconf --include=Source/autotools
autoreconf: running: /usr/bin/autoheader --include=Source/autotools
autoreconf: running: automake --add-missing --copy --no-force
Source/WebKit2/GNUmakefile.am:611: Libtool library used but `LIBTOOL' is undefined
Source/WebKit2/GNUmakefile.am:611:   The usual way to define `LIBTOOL' is to add `LT_INIT'
Source/WebKit2/GNUmakefile.am:611:   to `configure.ac' and run `aclocal' and `autoconf' again.
Source/WebKit2/GNUmakefile.am:611:   If `LT_INIT' is in `configure.ac', make sure
Source/WebKit2/GNUmakefile.am:611:   its definition is in aclocal's search path.
GNUmakefile.am:211:   `Source/WebKit2/GNUmakefile.am' included from here

這種錯誤我們看到是確實gettext

解決辦法:sudo apt-get install gettext

3.

autoreconf: Leaving directory `.'
checking build system type... i686-pc-linux-gnu
checking host system type... i686-pc-linux-gnu
checking for perl... /usr/bin/perl
checking for python... /usr/bin/python
checking for ruby... no
configure: error: You need 'ruby' to compile WebKit
Calling autogen.sh failed!

解決方法:apt-get install ruby

4.

checking for xlC... no
checking whether we are using the GNU C++ compiler... no
checking whether g++ accepts -g... no
checking for a BSD-compatible install... /usr/bin/install -c
checking for special C compiler options needed for large files... no
checking for _FILE_OFFSET_BITS value needed for large files... 64
configure: error: Compiler GCC >= 4.7 or Clang >= 3.2 is required for C compilation
Calling autogen.sh failed!

這種一般是g++的版本過低造成,解決辦法就是另外自己編譯一個與之匹配的版本。對於這種問題解決方法有這麼幾個降低webkit版本號,換高階的linux系統,或者編譯更高的版本同時不動系統預設的(因為如果改造系統的可能造成系統崩潰)在另外的位置編譯一個,制定具體的目錄給webkit去用,下面用curl舉例

簡單的執行步驟如下:

(3) cd curl-7.15.1

(4)   ./configure  --prefix=/opt (隨便寫個了路徑) 

(5) make

(6) make install

(7)進入webkit目錄執行

export PKG_CONFIG_PATH = /opt/lib/pkgconfig:$ PKG_CONFIG_PATH

經過上面幾步curl就可以作為依賴庫給webkit使用了,而且不用更換系統的curl的版本,這樣就不會修改系統預設的curl導致系統出問題了。

5.

還是回到webkit編譯的問題上面,我們知道webkit本身包含很多功能,但是我們有些功能可能對於有些版本不需要,我們就要先遮蔽掉,這個時候我們是有辦法的。

在webkit根目錄下執行下面的語句:

./Tools/Scripts/build-webkit --help



舉個簡單的例子假如我不想去編譯css3-text 功能

./Tools/Scripts/build-webkit --no-css-text 就可以了,別的功能以此類推。

上面是在編譯webkit中遇到的一些問題,以及個人的一些解決方案,後續還會接著補充,歡迎提出錯誤點,謝謝!

下一篇文章開始介紹webkit各個目錄代表什麼含義,對各個原始碼目錄做一個整體的概述,同時結合目錄針對瀏覽器工作流程做一個概括,主要讓大家初步認識webkit原始碼目錄結構,同時對各個目錄是如何配合整體流程工作,讓大家對原始碼目錄結構有個大致認識。

第一時間獲得部落格更新提醒,以及更多技術資訊分享,歡迎關注個人微信公眾平臺:程式設計師互動聯盟(coder_online)

1.直接幫你解答wekit技術疑點

2.第一時間獲得業內十多個領域技術文章

3.針對文章內疑點提出問題,第一時間回覆你,幫你耐心解答

4.讓你和原創作者成為很好的朋友,拓展自己的人脈資源

掃一掃下方二維碼或搜尋微訊號coder_online即可關注,我們可以線上交流。


聯絡方式

[email protected]

QQ:390012381