Fuchsia 建構作業會使用「產生 Ninja」 (GN),這是一種元建構系統,可產生 Ninja 使用的建構檔案,後者會執行實際的建構作業。建構系統提供工具,可為特定產品設定建構作業,以及範本,以便為 Fuchsia 目標建構程式碼。
建構目標
您可以使用位於專案來源程式碼中的 BUILD.gn
檔案,為 GN 定義個別建構目標。Fuchsia 建構系統會提供範本做為 GN 匯入項目 (.gni
),讓您宣告 Fuchsia 構件,例如:
fuchsia_component()
:定義可執行的元件,其中包含資訊清單、程式二進位檔和資源。fuchsia_package()
:定義套件,其中包含一或多個元件,可用於在套件存放區中發布。fuchsia_test_package()
:定義包含測試元件的套件。
以下是包含測試的簡易元件套件 BUILD.gn
檔案範例:
import("//build/components.gni")
executable("bin") {
sources = [ "main.cc" ]
}
fuchsia_component("hello-world-component") {
deps = [ ":bin" ]
manifest = "meta/hello-world.cml"
}
fuchsia_package("hello-world") {
deps = [
":hello-world-component",
]
}
fuchsia_component("hello-world-test-component") {
testonly = true
deps = [ ":bin_test" ]
manifest = "meta/hello-world-bin-test.cml"
}
fuchsia_test_package("hello-world-tests") {
test_components = [ ":hello-world-test-component" ]
}
由目標名稱和 BUILD.gn
檔案路徑組成的獨特標籤,可識別所有可參與建構作業的項目。在上述範例中,hello-world
目標可能會有類似以下的標籤://src/examples/basic:hello-world
。
建構設定
GN 前端會根據所選的 Fuchsia 產品設定設定建構作業,收集建構作業所需的所有必要套件和元件。這些目標是在整個來源樹狀結構中的各種 BUILD.gn
檔案中定義。GN 步驟的輸出內容是建構目錄中經過最佳化的 Ninja 指令集。
當您執行 fx set
指令來設定建構作業時,建構系統會叫用 GN。
fx set minimal.x64
如要調整產品設定或建構作業可用的套件,請務必執行 GN 設定步驟。只要目前設定中的 BUILD.gn
檔案有任何變更,GN 也會在建構期間自動叫用。
主面板和產品
Fuchsia 建構系統將 Fuchsia 版本的基準設定定義為產品和板子的組合。這些元素會共同組成您提供給 fx set
的建構設定。
板子會定義建構目標的架構,這可能會影響所納入的驅動程式,並影響裝置專屬的核心參數。
本程式碼研究室的目標是 x64
主機板,該主機板支援在 x64 架構上執行的 Fuchsia 模擬器 (FEMU)。
產品會定義建構作業產生的軟體設定。這項設定可能包含可用的服務和使用者體驗。
本程式碼研究室適用於 minimal_eng
產品。
建構
GN 建構設定完成後,Ninja 會使用產生的建構檔案,並執行適當的編譯、連結和封裝指令,產生 Fuchsia 映像檔。
當您執行 fx build
指令來執行目前的建構設定時,建構系統會叫用 Ninja。
fx build
練習:建構最小化
在本練習中,您將從來源建構 minimal_eng
產品設定,以便在 x64
模擬器板上執行。
設定建構
為 minimal
產品和 x64
電路板設定建構環境:
fx set minimal.x64
這個指令會針對產品建構設定中定義的目標集合執行 GN,產生建構指令。實際上並不會執行建構作業,而是定義可視為可建構的參數。
檢查建構設定
建構設定完成後,請使用 fx list-packages
列印建構作業所知的套件組合:
fx list-packages
這項工具可協助您判斷所需套件是否已正確納入建構設定。
建構 Fuchsia 最小版本
使用 fx build
建構最小目標:
fx build
重新啟動模擬器
執行下列指令,關閉目前開啟的所有模擬器例項:
ffx emu stop --all
啟動新的模擬器執行個體:
ffx emu start --headless
啟動完成後,模擬器會輸出以下訊息並傳回:
Logging to "$HOME/.local/share/Fuchsia/ffx/emu/instances/fuchsia-emulator/emulator.log" Waiting for Fuchsia to start (up to 60 seconds)........ Emulator is ready.
檢查裝置
開啟另一個終端機視窗,然後執行下列指令,以便列印裝置目標的詳細資料:
ffx target show
查看目標輸出的建構設定:
Version: "2000-01-01T12:00:00+00:00"
Product: "minimal_eng"
Board: "x64"
Commit: "2000-01-01T12:00:00+00:00"
請注意,設定會指向您在電腦上剛完成的建構作業。
您現在正在執行自己的 Fuchsia 版本!
練習:執行存放區伺服器並提供套件
在本練習中,您將執行存放區伺服器,將 universe
集合中提供的套件,提供給模擬器上執行的 Fuchsia 目標。
如要進一步瞭解存放區和不同的套件組合,請參閱 RFC-0212 套件組合
舉例來說,執行 ffx debug connect
會失敗,因為目標需要公開 fuchsia.debugger.Launcher
能力的元件。這項功能可在 minimal.x64
的 universe
集合中找到的 debug_agent
套件中使用。
列出 Universe 集中的套件
執行 fx list-packages
即可列出 universe
集合中的套件。minimal.x64
只有一個套件:
fx list-packages --universe
輸出結果只會顯示 debug_agent
套件。debug_agent
包含提供 fuchsia.debugger.Launcher
能力的元件。我們將在後續步驟中啟動偵錯工具,以便測試這項能力。
啟動存放區伺服器,並將其註冊至 Fuchsia 目標
fx serve
指令會啟動存放區伺服器,並將其註冊至目標。
$ fx serve
如果指令執行成功,您會看到下列輸出內容:
2024-05-20 12:51:03 [serve] Discovery...
2024-05-20 12:51:07 [serve] Device up
2024-05-20 12:51:07 [serve] Registering devhost as update source
Serving repository '/usr/local/google/home/amituttam/fuchsia/out/minimal.x64/amber-files' to target 'fuchsia-emulator' over address '[::]:8083'.
讓這項指令在前景執行。如要以詳細模式執行,請將 --verbose
或 -v
標記傳遞至 fx serve
。
練習:執行偵錯工具並列出執行中的程序
當存放區伺服器執行中,且 Fuchsia 目標已設定為解析該存放區中的套件時,我們可以執行指令來解析套件,並執行其中的元件。
首先,讓我們執行記錄檔,看看發生了什麼事:
ffx log --filter debug_agent
在另一個終端機中執行上述指令,輸出內容會是空白。讓指令繼續執行。這裡我們會篩選 debug_agent
,因為系統需要解析該套件才能執行偵錯工具。
在另一個終端機中,將偵錯工具連結至執行中的系統:
ffx debug connect
這項指令應會啟動 zxdb
,並將您帶入互動式殼層。如果您切換回執行 ffx log
的其他終端機,您會看到類似以下的輸出內容:
[01949.544917][pkg-resolver] INFO: attempting to resolve fuchsia-pkg://fuchsia.com/debug_agent as fuchsia-pkg://devhost/debug_agent with TUF
[01949.624075][pkg-resolver] INFO: updated local TUF metadata for "fuchsia-pkg://devhost" to version RepoVersions { root: 9, timestamp: Some(1715399460), snapshot: Some(1715399460), targets: Some(1715399460) } while getting merkle for TargetPath("debug_agent/0")
[01949.835760][pkg-resolver] INFO: resolved fuchsia-pkg://fuchsia.com/debug_agent as fuchsia-pkg://devhost/debug_agent to 3f9783abed30d70b72d5f0730bd6e6033481073126aac0b74cbbf2d14909497e with TUF
[01949.882891][debugger] INFO: [main_launcher.cc(182)] Start listening on FIDL fuchsia::debugger::Launcher.
在此處,系統會嘗試解析 debug_agent
套件,並可從已設定的 devhost
存放區執行此操作。解析套件後,系統會啟動元件,以便監聽偵錯工具啟動器通訊協定。
回到 zxdb
,您現在可以執行 ps
,查看系統上執行中的程序清單。
[zxdb] ps
j: 1033 root
p: 1102 bin/component_manager
j: 1649
j: 1780 bootstrap/console fuchsia-boot:///console#meta/console.cm
p: 1822 console.cm
j: 1989 bootstrap/archivist fuchsia-boot:///archivist#meta/archivist.cm
p: 2051 archivist.cm
j: 2064 bootstrap/console-launcher fuchsia-boot:///console-launcher#meta/console-launcher.cm
...