WebRTC編譯器GN介紹

GN

使用gn編譯項目的過程:

  1. 編寫.gn文件

    模塊化各個模塊藻雪,分別寫一個build.gn,添加進主目錄的build.gn的依賴中狸吞。

  2. gn gen out/Default

  3. ninja -C out/Default base

1. Ninja

ninja一個構(gòu)建系統(tǒng)勉耀,它以文件(通常是源代碼和輸出可執(zhí)行文件)的相互依賴性為輸入指煎,并快速地構(gòu)建它們。Ninja通過將編譯任務并行組織瑰排,大大提高了構(gòu)建速度贯要。

源于在Chromium瀏覽器項目中的工作暖侨,該項目具有30,000多個源文件椭住,并且其其他構(gòu)建系統(tǒng)(包括從自定義非遞歸Makefile構(gòu)建的一個)在更改一個文件后將需要十秒鐘才能開始構(gòu)建。 而用ninja構(gòu)建不到一秒鐘字逗。

1.1 設計目標

  1. 即使是非常大的項目京郑,也可以非常快速(即即時)的增量構(gòu)建葫掉。
  2. 關于如何構(gòu)建代碼的選擇很少些举。對于不同項目,可能有不同的構(gòu)建策略俭厚,ninja簡化了這些選擇户魏。
  3. 讓依賴正確,在一些特殊情況下Makefiles很難解決的挪挤。
  4. 速度和簡單之間叼丑,選擇速度。

1.2 示例

cflags = -Wall

rule cc
  command = gcc $cflags -c $in -o $out

build foo.o: cc foo.c

為字符串生成一個更可讀的名字

cflags = -g

使用$符號取值

rule cc
  command = gcc $cflags -c $in -o $out

? 定義一個叫cc的rule扛门,然后這條rule的內(nèi)容是一個可執(zhí)行的命令鸠信,$in 展開為輸入文件(foo.c),$out 展開為輸出文件(foo.o) for the command.

? Build語句聲明輸入文件和輸出文件之間的關系论寨,以build關鍵詞開始星立,格式是build outputs: rulename inputs這個規(guī)則說明所有的輸出文件都是從輸入文件產(chǎn)生的。當output不存在或者input改變時葬凳,都會重新創(chuàng)建output绰垂。上面的例子里面in代表輸入列表out代表輸出列表。

2. GN

GN是一個用來生成ninja構(gòu)建文件的工具火焰。

2.1 運行參數(shù)

生成構(gòu)建目錄

gn gen out/my_build

設置構(gòu)建參數(shù)

gn gen out/my_build --args="..."

可以設置多個target os以及target cpugn args out/Default(或者使用--args方式)

target_os = "chromeos"
target_os = "android"

target_cpu = "arm"
target_cpu = "x86"
target_cpu = "x64"

查看所有的參數(shù)

gn args --list out/Default

2.1 Build文件

示例
static_library(“base”) {
  sources = [
    “a.cc”,
    “b.cc”,
  ]
}

加上依賴

static_library(“base”) {
  sources = [
    “a.cc”,
    “b.cc”,
  ]

  deps = [
    “//fancypants”,
    “//foo/bar:baz”,
  ]
}
設計原則
  1. 模塊化

創(chuàng)建一個反映代碼組件和子組件的目錄結(jié)構(gòu)劲装,把BUILD文件放在每個目錄中。

  1. 明確模塊之間的關系
內(nèi)置的target類型
  • executable

    定義一個可執(zhí)行target

  • shared_library

    在鏈接器行上為目標指定共享庫荐健,該目標在“ deps”中列出了共享庫酱畅。

  • static_library

    創(chuàng)建.a以及.lib文件

  • loadable_module

    創(chuàng)建一個目標文件,只能(并且只能)在運行時加載和卸載江场。

  • source_set:

    編譯沒有中間庫的源文件纺酸,將其視為靜態(tài)庫,但沒有靜態(tài)庫鏈接規(guī)則址否。是經(jīng)過編譯但未鏈接的一組源餐蔬,相反碎紊,生成的目標文件是隱式添加到依賴源的所有目標的鏈接器中。

  • group

    把一些依賴合并起來并命名

  • copy

  • action, action_foreach

  • bundle_data, create_bundle: Mac & iOS

另外樊诺,我們也可以創(chuàng)建自定義類型仗考。

標簽說明
  • 完整標簽

//chrome/browser:version

  • 隱式標簽

//base, //base::base的縮寫

  • 當前目錄

:bar词爬,表示當前目錄下的bar文件

依賴放到一個group中

gorup是沒有被編譯或者依賴的集合秃嗜。

group("tools") {
  deps = [
    # This will expand to the name "http://tutorial:tutorial" which is the full name
    # of our new target. Run "gn help labels" for more.
    "http://tutorial",
  ]
}
條件語句
component(“base”) {
  sources = [
    “a.cc”,
    “b.cc”,
  ]

  if (is_win || is_linux) {
    sources += [ “win_helper.cc” ]
  } else {
    sources -= [ “a.cc” ]
  }
}
Config

Config持有flag, defines, include directories這樣一些東西,但不包含源文件和依賴顿膨。

添加移除配置

executable(“doom_melon”) {
  configs -= [
    "http://build/config/compiler:chromium_code",
  ]
  configs += [
    "http://build/config/compiler:no_chromium_code",
  ]
}

把配置放到一個group中

config(“myconfig”) {
  defines = [ “EVIL_BIT=1” ]
}

executable(“doom_melon”) {
  ...
  configs += [ “:myconfig” ]
}

test(“doom_melon_tests”) {
  ...
  configs += [ “:myconfig” ]
}
動態(tài)加載一些外部的數(shù)據(jù)文件
shared_library(“icu”) {
  # This target is loaded @ runtime.
  data_deps = [
    “:icu_data_tables”,
  ]
}
權(quán)限控制
  • deps vs public_deps

控制依賴的可見性

  • visibility

設置當前文件可以被其他文件依賴

  • assert_no_deps

依賴項都不應該鏈接

  • testonly

不鏈接到production代碼中

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末锅锨,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子恋沃,更是在濱河造成了極大的恐慌必搞,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件囊咏,死亡現(xiàn)場離奇詭異恕洲,居然都是意外死亡,警方通過查閱死者的電腦和手機梅割,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門霜第,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人炮捧,你說我怎么就攤上這事庶诡。” “怎么了咆课?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵末誓,是天一觀的道長。 經(jīng)常有香客問我书蚪,道長喇澡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任殊校,我火速辦了婚禮晴玖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘为流。我一直安慰自己呕屎,他們只是感情好,可當我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布敬察。 她就那樣靜靜地躺著秀睛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪莲祸。 梳的紋絲不亂的頭發(fā)上蹂安,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天椭迎,我揣著相機與錄音,去河邊找鬼田盈。 笑死畜号,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的允瞧。 我是一名探鬼主播简软,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼瓷式!你這毒婦竟也來了替饿?” 一聲冷哼從身側(cè)響起语泽,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤贸典,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后踱卵,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體廊驼,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年惋砂,在試婚紗的時候發(fā)現(xiàn)自己被綠了妒挎。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡西饵,死狀恐怖酝掩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情眷柔,我是刑警寧澤期虾,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站驯嘱,受9級特大地震影響镶苞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鞠评,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一茂蚓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧剃幌,春花似錦聋涨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至敬鬓,卻和暖如春淹朋,著一層夾襖步出監(jiān)牢的瞬間笙各,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工础芍, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留杈抢,地道東北人。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓仑性,卻偏偏與公主長得像惶楼,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子诊杆,可洞房花燭夜當晚...
    茶點故事閱讀 44,969評論 2 355