Chromium GN 加入第三方庫 


因為未知的東西而恐懼,因為他人的恐懼而恐懼,這是一件很糟糕的事情

此后少犯

轉載來自:https://blog.csdn.net/zhangtracy/article/details/79044004

gn快速入門官方文檔:

https://gn.googlesource.com/gn/+/master/docs/quick_start.md#Passing-build-arguments

gn的參考手冊

https://gn.googlesource.com/gn/+/master/docs/reference.md#var_root_out_dir

GN快速入門指南

  • GN快速入門指南
    • 內容
    • 運行GN
    • 建立一個構建
    • 傳遞構建參數
    • 交叉編譯到目標操作系統或體系結構
    • 配置goma
    • 配置組件模式
    • 一步步
      • 添加一個構建文件
      • 測試你的添加
      • 聲明依賴關系
      • 測試靜態庫版本
      • 編譯器設置
      • 把設置放在配置中
      • 依賴配置
    • 添加一個新的構建參數
    • 不知道發生了什么事
      • 打印調試
      • desc命令
      • 性能

運行GN

你只需要從命令行運行gn。在depot_tools目錄有一個同名腳本gn.py。這個腳本將在包含當前目錄的源代碼樹中找到二進制文件並運行它。

建立一個構建

在GYP中,系統會為您生成DebugRelease建立目錄並相應地進行配置。GN不這樣做。相反,你可以使用你想要的任何配置來設置你想要的目錄。當在該目錄中構建時,如果Ninja文件過時會自動重新生成。

創建一個構建目錄:

gn gen out/my_build

傳遞構建參數

通過運行以下命令在build目錄中設置生成參數:

gn args out/my_build

這將啟動一個編輯器。在這個文件中鍵入構建參數,如下所示:

is_component_build = true
is_debug = false

您可以通過輸入以下命令來查看可用參數列表及其默認值

gn args --list out/my_build

請注意,您必須指定此命令的構建目錄,因為可用的參數可以根據設置的構建目錄進行更改。

Chrome開發人員還可以閱讀Chrome特定的構建配置說明以獲取更多信息。

交叉編譯到目標操作系統或體系結構

運行gn args out/Default(根據需要替換您的構建目錄),並為常見的交叉編譯選項添加以下一行或多行。

target_os ="chromeos"
target_os ="android"

target_cpu ="arm"
target_cpu ="x86"
target_cpu ="x64"
有關更多信息,請參閱GNCrossCompiles。

配置goma

運行gn args out/Default(根據需要替換您的構建目錄)。加:

use_goma = true
goma_dir ="〜/foo/bar/goma"

如果你的goma在默認位置(~/goma),那么你可以省略該goma_dir行。

配置組件模式

這是一個像goma標志一樣的構建參數。運行gn args out/Default並添加:

is_component_build = true

一步步

添加一個構建文件

創建一個tools/gn/tutorial/BUILD.gn文件並輸入以下內容:

executable("hello_world") {
  sources = [
    "hello_world.cc"
  ]
}

該目錄中應該已經有一個hello_world.cc文件,包含你所期望的。就是這樣!現在我們只需要告訴構建這個文件。打開BUILD.gn根目錄中的文件,並將此目標的標簽添加到其中一個根組的依賴關系("組"目標是一個元目標,它只是其他目標的集合):

group("root") {
  deps = [
    ...
    "//url""//tools/gn/tutorial:hello_world"
  ]
}

您可以看到您的目標標簽是"//"(表示源根目錄),后面是目錄名稱,冒號和目標名稱。

測試你的添加

從源根目錄中打開命令行:

gn gen out/Default
ninja -C out/Default hello_world
out/Default/hello_world

GN鼓勵目標名稱不是全球唯一的靜態庫。要構建其中之一,您可以將不帶前導"//"的標簽傳遞給Ninja:

ninja -C out/Default tools/gn/tutorial:hello_world

聲明依賴關系

讓我們來做一個靜態庫,它有一個函數向隨機的人打招呼。該目錄中有一個源文件hello.cc,它具有執行此操作的功能。打開tools/gn/tutorial/BUILD.gn文件並將靜態庫添加到現有文件的底部:

static_library("hello"){
  sources = [
    "hello.cc"
  ]
}

現在讓我們添加一個依賴於這個庫的可執行文件:

executable("say_hello"){
  sources = [
    "say_hello.cc"
  ]
  deps = [
    ":hello",
  ]
}

這個可執行文件包含一個源文件,並依賴於前一個靜態庫。靜態庫在deps使用它的標簽引用。您可以使用完整的標簽,//tools/gn/tutorial:hello但是如果您在同一個構建文件中引用目標,則可以使用快捷方式:hello

測試靜態庫版本

從源根目錄中運行命令行:

ninja -C out/Default say_hello
out/Default/say_hello

請注意,您不必重新運行GN。當任何構建文件發生變化時,GN將自動重建Ninja文件。當Ninja在執行開始時打印[1/1] Regenerating ninja files時,就是這種情況。

編譯器設置

我們的hello 庫有一個新功能,能夠同時向兩個人打招呼。這個特性是通過定義TWO_PEOPLE來控制的。我們可以像這樣添加定義:

static_library("hello"){
  sources = [
    "hello.cc"
  ]
  defines = [
    "TWO_PEOPLE"
  ]
}

把設置放在配置中

然而,庫的用戶也需要知道這個定義,並把它放在靜態庫目標中,只為那里的文件定義它。如果其他人包括hello.h,他們將不會看到新的定義。要看到新的定義,每個人都必須定義TWO_PEOPLE

GN有一個叫"config"的概念封裝設置。我們來創建一個定義我們的預處理器的定義:

config("hello_config"){
  defines = [
    "TWO_PEOPLE"
  ]
}

要將這些設置應用於目標,只需要將配置標簽添加到目標中的配置列表中即可:

static_library("hello"){
  ...
  configs + = [
    ":hello_config"
  ]
}

請注意,您需要"+ ="而不是"=",因為構建配置具有應用於每個設置默認構建內容的目標的默認配置集。你想添加到這個列表而不是覆蓋它。要查看默認配置,可以使用print構建文件中的函數或desc命令行子命令(請參閱下面的兩個示例)。

依賴配置

這很好地封裝了我們的設置,但仍然需要每個使用我們庫的用戶來設置自己的配置。如果依賴於我們的hello庫的每個人都能自動獲得這個信息,那就太好了。將您的庫定義更改為:

static_library("hello"){
  sources = [
    "hello.cc"
  ]
  all_dependent_configs = [
    ":hello_config"
  ]
}

這應用hello_confighello目標本身,加上所有目標的傳遞依賴於目前的目標。現在依賴我們的每個人都會得到我們的設置。你也可以設置public_configs只適用於直接依賴你的目標(不是過渡性)。

現在,如果您編譯並運行,您將看到兩個人的新版本:

> ninja -C out/Default say_hello
ninja: Entering directory 'out/Default'
[1/1] Regenerating ninja files
[4/4] LINK say_hello
> out/Default/say_hello
Hello, Bill and Joy.

添加一個新的構建參數

通過declare_args可以聲明你接受哪些參數,並指定默認值。

declare_args(){
  enable_teleporter = true
  enable_doom_melon = false
}

請參閱有關gn help buildargs如何工作的概述。請參閱gn help declare_args聲明它們的具體內容。

在一個給定的范圍內多次聲明一個給定的參數是一個錯誤,因此應該在范圍和命名參數中小心使用。

不知道發生了什么事?

您可以在詳細模式下運行GN,以查看有關正在執行的操作的許多消息。使用-v

打印調試

有一個print命令僅寫入標准輸出:

static_library("hello"){
  ...
  print(CONFIGS)
}

這將打印適用於您的目標(包括默認的)的所有配置。

"desc"命令

您可以運行gn desc <build_dir> <targetname>以獲取有關給定目標的信息:

gn desc out/Default //tools/gn/tutorial:say_hello

將打印出大量令人興奮的信息。您也可以只打印一個部分。假設你想知道你的TWO_PEOPLE定義來自哪個say_hello目標:

> gn desc out/Default //tools/gn/tutorial:say_hello defines --blame
...lots of other stuff omitted...
  From //tools/gn/tutorial:hello_config
       (Added by //tools/gn/tutorial/BUILD.gn:12)
    TWO_PEOPLE

你可以看到,TWO_PEOPLE是由一個配置定義的,你也可以看到哪一行導致配置被應用到你的目標(在本例中,是all_dependent_configs行)。

另一個特別有趣的變量

gn desc out/Default //base:base_i18n deps --tree

通過gn help desc了解更多信息。

性能

通過使用–time命令行標志運行它,可以看到花了多長時間。這將輸出各種事物的時間統計。

您還可以跟蹤構建文件的執行方式:

gn --tracelog = mylog.trace

並且您可以在Chrome的about:tracing頁面中加載生成的文件來查看所有內容。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM