1. 程式人生 > >WebKit瀏覽器編譯——開啟巨集定義

WebKit瀏覽器編譯——開啟巨集定義

例如:VIDEO

程式碼中已經對VIDEO做了一定的支援,但預設情況下並沒有開啟,這些支援都在一個ENABLE_VIDEO的巨集定義中括起來了,可以grep下原始碼看下有很多ENABLE(VIDEO)括起來的程式碼。

程式碼中需要的巨集
這個ENABLE的巨集定義在Source/JavaScriptCore/wtf/Platform.h中被定義的,#define ENABLE(WTF_FEATURE) (defined ENABLE_##WTF_FEATURE  && ENABLE_##WTF_FEATURE)

由以上ENABLE(VIDEO)對應的巨集定義就是ENABLE_VIDEO

注意這裡的##是C語言巨集的連線符,即把ENABLE_與WTF_FEATURE(傳入的是WML)的內容連線起來,這樣就連線成了ENABLE_WML。

這樣#if ENABLE(VIDEO) 會被預處理成 #if (defined ENABLE_VIDEO && ENABLE_VIDEO)

由此可見,我們首先要做的就是開啟這個ENABLE_VIDEO巨集定義。

編譯環境中變數定義:

在 GtkWebkit-2.2.2 原始碼包中不含有 makefile ,由 configure 生成,所以配置都在 configure 時完成,

例如:#if ENABLE(VIDEO) && USE(GSTREAMER)

方法一:

1、ENABLE(VIDEO) 開啟巨集    ./configure  --enable-video

2、USE(GSTREAMER) 在 configure 中不能直接找到配置開關,但 configure 檔案中有條件控制

if test "$enable_video" = "yes" || test "$enable_web_audio" = "yes"; then
$as_echo "#define WTF_USE_GSTREAMER 1" >>confdefs.h
fi


所以在 configure 時候同時開啟 --enable_web_audio 開關就 OK

方法二:(猜測,但試驗好使)

巨集在 configure 時候確認是否開啟,巨集的關閉儲存在 WebKitFeatures.h(ENABLE) 和 autotoolsconfig.h(USE) 兩個 .h 檔案中,直接修改該 .h 檔案開控制巨集



課外補充(Android):

在external/webkit/Android.mk中加入下面程式碼開啟巨集的設定,我們需要讓他的值為true,這裡的含義是,如果ENABLE_WML環境值沒有被定義過,則我們定義它為true。

ifeq ($(ENABLE_WML), )

   ENABLE_WML := true

endif

在編譯指令碼中定義程式碼中的巨集

但是經過上述的內容,只是定義了編譯環境裡的變數,程式碼中的巨集定義還沒有被定義的,那麼需要主動來設定下巨集定義了,通過下面的方式

ifeq ($(ENABLE_WML), true)

   LOCAL_CFLAGS += -DENABLE_WML=1

endif

這裡的-D編譯選項是用來定義程式碼中的巨集的,即設定c/c++中的DENABLE_WML巨集的值為1。就相當於程式碼中的#define ENABLE_WML 1

通過上述兩步,c/c++的巨集被成功的定義了。

另外說下Source/JavaScriptCore/wtf/Platform.h這裡有很多#defineENABLE_XXX的巨集,這裡可以修改一些巨集的值來修改配置。

總結下上述的過程。有一個編譯的環境變數叫ENABLE_WML,(你也可以命名為其他的名字),在判斷這個環境變數如果沒有被定義的話,那麼在該指令碼中定義它的值為true。

然後在指令碼的後面,判斷該環境變數值是否為true,如果為true那麼就在編譯配置LOCAL_CFLAGS中加入c/c++中的巨集定義DENABLE_WML=1,(這裡的巨集定義命名必須是DENABLE_WML了。)

經過以上的配置,然後編譯發現會有錯誤的。編譯不過,下一步就是 標頭檔案的包含 了 。

相關推薦

WebKit瀏覽器編譯——開啟巨集定義

例如:VIDEO程式碼中已經對VIDEO做了一定的支援,但預設情況下並沒有開啟,這些支援都在一個ENABLE_VIDEO的巨集定義中括起來了,可以grep下原始碼看下有很多ENABLE(VIDEO)括起來的程式碼。 程式碼中需要的巨集 這個ENABLE的巨集定義在Source/JavaScriptCore/w

關於VS中區分debug與release,32位與64位編譯巨集定義

在vs程式設計中,常常涉及到32位和64位程式的編譯,怎麼判斷當前編譯是32位編譯還是64位編譯?如何判斷 是debug下編譯還是release下編譯?因為之前用到,這裡記錄一下,省的忘了又要瘋狂的google。 1.判斷是debug編譯還是release編譯。 如

關於程式碼中區分debug與release、32位與64位、xp還是win7編譯巨集定義

在寫程式碼的過程中,我們經常需要考慮這樣的一些問題:有一部分程式碼片段只有在32位編譯環境下編譯才能通過,在64位編譯環境下是無法編譯通過的,那麼怎樣才能判斷當前編譯環境是32位編譯還是64位編譯?還有,如何判斷當前編譯是debug編譯還是release編譯?再者,有些AP

通過命令列cl.exe編譯Windows程式--預編譯跟蹤巨集定義

     編寫C、C++程式的時候,使用各種巨集定義是非常常見的。但是比較蛋疼的首先就是巨集定義有副作用,並且副作用有時候我們還不容易發現。其次就是使用巨集定義函式片段,特別是比較長函式片段的時候,直接檢視vs 2008的編譯錯誤提示,很多時候根本就沒有辦法一眼看出哪裡出錯

VS2013開啟編譯QT pro工程,找不到巨集定義QTDIR的解決辦法

在使用VS2013重新編譯QT工程時,在編譯的時候無法找到QT下面的標頭檔案,應該是沒有把QT和VS2013配置好,但是開啟:Qt Project Setting 裡面的配置是沒有問題的。 但是在巨集定義中卻沒有,QTDIR的定義: 解決辦法:

如何通過 讀取配置引數 而不是 預編譯 巨集定義方式 來決定是否執行printf函式

在一個專案中,本來開始決定通過巨集定義方式來決定是否進行 printf 列印除錯資訊的,但後面考慮到使用配置引數的方式應該更好,因為通過巨集定義方式,還需要再編譯一遍程式才能進行顯示,而通過讀取配置引數方式,只需要在配置檔案中更改配置項即可,這樣更符合實際需要。  大致思路:先將需要列

C中的預編譯巨集定義

  在將一個C源程式轉換為可執行程式的過程中, 編譯預處理是最初的步驟. 這一步驟是由前處理器(preprocessor)來完成的. 在源流程式被編譯器處理之前, 前處理器首

NIOS II 編譯報錯提示找不到標頭檔案或巨集定義

  1、從別的電腦拷貝的工程到本地重新編譯後,一直提示找不到標頭檔案或巨集定義,但是資料夾下確實是有這些檔案的:     2、參考網上的方法,說是需要重新手動新增這些檔案的路徑。步驟如下: 選擇xx_bsp 右鍵,Properties

GCC編譯時增加巨集定義-D識別符號,相當於巨集定義#define 識別符號

GCC編譯時增加巨集定義-D<識別符號>,相當於#define <識別符號>,可以在遇到條件編譯時執行。 #ifdef <識別符號> //條件編譯內容 #

編譯預處理指令:檔案包含指令、巨集定義指令、條件編譯指令

編譯預處理指令:檔案包含指令、巨集定義指令、條件編譯指令。“#”開頭,不加分號“;” 1、檔案包含指令:  #include<檔名> 標準目錄下搜尋  #include"檔名" 當前目錄下搜尋,再在標準目錄下搜尋 2、巨集定義指令:  #define 巨集名 巨集文字 //巨集名習慣大寫  #

qt *.pro 和原始碼通用巨集定義(如條件編譯

*.pro中: DEFINES += _qt_msvc_2015 contains(DEFINES,_qt_msvc_2015){ QT += webengine QT

C語言__預處理(巨集定義、檔案包含、條件編譯

C語言__預處理(巨集定義、檔案包含、條件編譯) 預處理簡單理解     1.C語言在對源程式進行編譯之前,會先對一些特殊的預處理指令作解釋(比如之前使用的#include檔案包含指令),產生一個新的源程式(這個過程稱為編譯預處理),之後再進行通常的編譯

Makefile中用巨集定義進行條件編譯(gcc -D)/在Makefile中進行巨集定義-D

在原始碼裡面如果這樣是定義的: #ifdef   MACRONAME //可選程式碼 #endif 那在makefile裡面 gcc   -D   MACRONAME=MACRODEF 或者 gcc   -D   MACRONAME  這樣就定義了預處理巨集,編譯的時候可選程式碼就會被編譯進去了。 對於G

gcc -D選項 編譯時新增巨集定義

程式例項: #include <stdio.h> #include <stdlib.h> int main(int argc, char* argv[]) { #ifde

C/C++ 中利用debug巨集定義開啟/關閉除錯輸出

debug巨集作為除錯開關 在寫程式時,為了除錯,經常需要加一些輸出語句,等除錯完成又得註釋掉,如果下次還需要除錯還得解註釋,十分費時費力,為了解決這個麻煩,可以定義一個debug巨集作為除錯輸出的開關。如下面程式碼所示: #include <st

C語言詳解(6)巨集定義和條件編譯

巨集定義和條件編譯 一、概述 巨集定義是C語言的預處理功能。巨集定義就是簡單的替換,不作為計算,不也作為表示式。在C語言中作為預處理指令包括:巨集定義、檔案包含、條件編譯。 條件編譯其實就是將if…else…的設計思想引入到預處理功能中,給編譯器使用的。條件編譯時通過

巨集定義巨集編譯

// 以下是巨集定義的一些用法  11.4.2 #if defined… #else …#endif 此編譯指令為#ifdef … #else …#endif的等價編譯指令。其語法格式如下: #if defined 常量表達式 程式碼段1 #else 程式碼段2 #

c語言學習--巨集定義、條件編譯

1. 防止一個頭檔案被重複包含  #ifndef COMDEF_H  #define COMDEF_H  //標頭檔案內容  #endif  2. 重新定義一些型別,防止由於各種平臺和編譯器的不同,而產生的型別位元組數差異,方便移

[除錯相關]預編譯檔案中巨集定義列印日誌

#ifdef DEBUG #define debugLog(...) NSLog(__VA_ARGS__) #define debugMethod() NSLog(@"%s", __func__) #else #define debugLog(...) #define 

巨集定義與條件編譯的用處

   #define     定義巨集     #undef      取消已定義的巨集     巨集定義常量與命令可以避免幻數 在巨集定義命名時候應該儘量清楚表明其用途。 函式型巨集定義的有點:儘管其和真正的函式相比有很多缺點,但只要小心使用還是會顯著提高程式碼的執行效率