GN快速入門指南

2021-08-14 14:06:45 字數 4621 閱讀 4029

新增乙個新的構建引數

不知道發生了什麼事

你只需要從命令列執行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。

執行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")
該目錄中應該已經有乙個hello_world.cc檔案,包含你所期望的。就是這樣!現在我們只需要告訴構建這個檔案。開啟build.gn根目錄中的檔案,並將此目標的標籤新增到其中乙個根組的依賴關係(「組」目標是乙個元目標,它只是其他目標的集合):

group("root")
您可以看到您的目標標籤是「//」(表示源根目錄),後面是目錄名稱,冒號和目標名稱。

從源根目錄中開啟命令列:

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」)
現在讓我們新增乙個依賴於這個庫的可執行檔案:

executable("say_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」)
然而,庫的使用者也需要知道這個定義,並把它放在靜態庫目標中,只為那裡的檔案定義它。如果其他人包括hello.h,他們將不會看到新的定義。要看到新的定義,每個人都必須定義two_people

gn有乙個叫「config」的概念封裝設定。我們來建立乙個定義我們的預處理器的定義:

config("hello_config")
要將這些設定應用於目標,只需要將配置標籤新增到目標中的配置列表中即可:

static_library(「hello」)
請注意,您需要「+ =」而不是「=」,因為構建配置具有應用於每個設定預設構建內容的目標的預設配置集。你想新增到這個列表而不是覆蓋它。要檢視預設配置,可以使用print構建檔案中的函式或desc命令列子命令(請參閱下面的兩個示例)。

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

static_library(「hello」)
這應用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()
請參閱有關gn help buildargs如何工作的概述。請參閱gn help declare_args宣告它們的具體內容。

在乙個給定的範圍內多次宣告乙個給定的引數是乙個錯誤,因此應該在範圍和命名引數中小心使用。

您可以在詳細模式下執行gn,以檢視有關正在執行的操作的許多訊息。使用-v

有乙個print命令僅寫入標準輸出:

static_library("hello")
這將列印適用於您的目標(包括預設的)的所有配置。

您可以執行gn desc以獲取有關給定目標的資訊:

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
通過使用–time命令列標誌執行它,可以看到花了多長時間。這將輸出各種事物的時間統計。

您還可以跟蹤構建檔案的執行方式:

gn --tracelog = mylog.trace
並且您可以在chrome的about:tracing頁面中載入生成的檔案來檢視所有內容。

Mybatis快速入門指南

簡介 當下越來越多的企業專案架構中,在持久層部分,拋棄了hibernate框架,而選用mybatis框架取而代之,旨在更加深入細緻的控制和資料庫的互動。mybatis 本是apache的乙個開源專案ibatis,2010年這個專案由apache software foundation 遷移到了goo...

C STL 快速入門指南

c 的標頭檔案一般是沒有像c語言的 h 這樣的擴充套件字尾的,一般情況下c語言裡面的標頭檔案去掉 h 然後在前面加個 c 就可以繼續在c 檔案中使用c語言標頭檔案中的函式啦 比如 1 include 相當於c語言裡面的 include 2 include 相當於c語言裡面的 include 3 in...

CVS 快速入門指南

1,從庫里 checkout 專案到本地 cvs co project name 2,檢查本地與庫里的不同 cvs q n up d 3,將庫里的改動應用到本地 cvs q up d 4,新增新的資料夾 檔案 cvs add filename 5,將本地的改動上傳到庫里 cvs ci m comme...