建構系統

Fuchsia 版本採用「Generate Ninja」 (GN) 方法, 這種中繼建構系統可以產生 Ninja:執行實際建構作業。 建構系統提供工具,可用於設定特定版本的建構作業 和範本來建立 Fuchsia 目標的程式碼。

建立目標

您可以使用位於 BUILD.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 步驟的輸出內容是一組最佳化的 。

當您執行 fx set 指令來設定 GN 時,建構系統會叫用 GN 建構過程

fx set minimal.x64

如要調整產品,建議您隨時執行 GN 設定步驟 或是建構可用的套件系統也會叫用 GN 當目前其中一個 BUILD.gn 檔案時,就會自動在建構期間自動進行 都會變更

主面板和產品

Fuchsia 建構系統會定義 Fuchsia 版本的基準設定 結合 productBoard 的組合。這些元素形成 您提供給 fx set 的建構設定。

董事會定義建構目標的架構,這可能會影響 驅動程式,並影響特定裝置的核心參數。

本程式碼研究室是以支援 Fuchsia 模擬器的 x64 主機板為目標 (FEMU) 在 x64 架構上運作

產品定義了建構所產生的軟體設定。這個 設定可能包括您可以使用哪些服務 無須專人管理

本程式碼研究室適用於 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

這項工具可以判斷您需要的套件是否已正確地納入 指定命名空間

打造極簡風

使用 fx build 建構最小目標:

fx build

重新啟動模擬器

  1. 執行下列指令,關閉現有的所有模擬器執行個體 開啟:

    ffx emu stop --all
    
  2. 啟動新的模擬器執行個體:

    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.x64universe 組合中的 debug_agent 套件提供。

列出宇宙組合中的套件

執行 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
...