原始碼版面配置

搜尋原始碼

如要查看及搜尋 Fuchsia 原始碼,做法如下:

總覽

第一方開放原始碼程式碼大多位於「fuchsia.git」 存放區這段程式碼中的大部分程式碼 存放區採用階層式的「區域」樹狀結構。

區域有一般的內部和依附元件結構。fuchsia.git 存放區本身也遵循區域結構 專屬結構

具體來說,系統可以考慮 fuchsia.gitsrc 頂層目錄 根區域它符合某個區域所需的結構,而且是 幾個地方的子區域不過,您還必須建立區域目錄 出現在 src 旁邊,而非裡面,例如third_party。您可以輸入 應該考量到全球所有需要依賴的領域這裡還提供了其他地點 src 之外,包含後續頂層區域,例如位置:vendor/*。 目前開放所有區域使用開放原始碼 third_party

無論是開放原始碼或封閉原始碼存放區,一樣遵循慣例 且對應至 fuchsia.git 中 src 的子目錄。目前, 「花瓣」幾乎但我們會「推廣」區域 目前位於 fuchsia.git 存放區中 因為系統會穩定

vendor/* 目錄包含封閉原始碼,並由供應商加以編排 程式碼專區//vendor 以外的任何項目皆無法依附於 //vendor。 系統支援不同供應商之間的依附元件,vendor/A 可以 依附於 vendor/B

products 目錄包含可建構的產品清單。只有部分通知 產品相當小,建構速度也很快 (例如核心 其他產品則較詳細 (例如 workbench_eng 產品)。

sdk 目錄包含構成 Fuchsia API 介面的程式庫。 其中一些程式庫是用戶端程式庫,有些則是 FIDL 程式庫。 這些程式庫並未發行於 Fuchsia SDK 中。所有非測試 FIDL 程式庫應放在 //sdk/fidl 目錄中,並依 FIDL 程式庫名稱,包括只能在 Fuchsia 平台來源樹狀結構。這類程式庫可使用 internalsdk_category,會導致廣告素材無法發行 或是直接加註 internal 提醒使用者預期的用途

大多數的第三方依附元件會儲存在獨立的存放區中。這些 只有在需要支援 Google Cloud 服務 下列來源樹狀結構設定:

  • 啟動。 這個來源樹狀結構設定包含足夠的程式碼,可以建構 總結產品。
  • 開放原始碼。這個來源樹狀結構設定包含所有開放原始碼 在《Fuchsia Source Tree》中
  • 所有來源。這個來源樹狀結構設定包含所有開啟和關閉的項目 前往 Fuchsia 來源樹狀結構中的原始碼。

請參閱這份指南,瞭解如何撰寫 您在 README.fuchsia 檔案中的第三方程式碼。

領域

大部分程式碼都是以遞迴方式組成的區域樹狀結構。每個部分都有 內部和依附元件結構,協助使用者瞭解程式碼結構 整個專案

目錄結構

每個區域都必須含有 OWNERS 檔案 說明文件和測試區域也可能包括二進位檔、圖書館、驅動程式 和其他原始碼此外,區域可以有子區域, 模式:

  • OWNERS
  • BUILD.gn
    • 建立檔案,定義網頁的標準目標 區域負責人除了可以加入額外的指定目標之外, 做為標準目標
  • docs/
    • 這個目錄應包含這個區域工作者的文件
    • 給最終開發人員 (或福希亞其他地區工作人員) 適用的文件 應位於頂層文件或 SDK 存放區
  • bundles/
    • 這個目錄含有這個區域的套件目標套裝組合。每個區域 至少應包含一個包含該區域單元測試的 tests 組合,但 也可能包含其他套裝組合。
  • bin/ (非必要)
  • lib/ (非必要)
  • drivers/ (非必要)
  • examples/ (非必要)
  • tests/ (非必要)
    • 這個目錄包含橫跨多個原始碼的整合測試
    • 如果不同區域可能有子目錄的檢測,則建議使用 新增 OWNERS 檔案給不同的測試目錄,清楚說明擁有權。
    • 最好將包含單一二進位檔或程式庫的單元測試置於適當位置 和測試的程式碼
  • testing/ (非必要)
    • 這個目錄包含有助於編寫測試的公用程式和程式庫
    • 這個目錄中的目標只能透過測試專用的目標來依附。
  • third_party/ (非必要)
    • 大部分的 third_party 依附元件應位於不同的存放區
    • 只有在符合下列所有條件時,您才需要在特定區域中加入 third_party 依附元件:
      • 根據政策,該程式碼必須存放在第三方目錄中
      • 您打算推動上游 (即進行重大變更,且不打算這麼做) 整合上游日後的變更)
      • 您為程式碼重新命名 (a) 與上游不相符, (b) 並未在 Fuchsia 來源樹狀結構
      • 程式碼為開放原始碼
    • 前往以下頁面,進一步瞭解third_party來源版面配置: 第三方原始碼管理
  • tools/ (非必要)
    • 此目錄包含領域提供的指令列工具。這些 通常可以 (或必須) 為開發主機建構的項目 而不是 Fuchsia。不一定會在 但開發人員也可以使用它們不一定會存在 並未在 SDK 中發布 但確實不是供開發人員直接使用 而不是此處
    • 其中應包含一個以每個工具 (或集合) 命名的子目錄 每個相關工具都有各自的自然名稱) 並整合到頂層 tools/BUILD.gn 檔案中。
  • [subareas] (非必要)
    • Subareas 應遵循通用區域範本
    • 請勿建立深層的巢狀區域結構 (例如,三條應有的數量)

除了內部機構外,區域也可能使用額外的目錄 列舉的目錄

擁有者

每個區域和子區域都必須包含一個 OWNERS 檔案。目錄可能包含 OWNERS,但不含範圍,例如:頂層 products /src/lib 目錄的子目錄或子目錄。缺少 系統將 OWNERS 檔案的擁有者與其上層目錄相同 位於同一個區域

有一個例外狀況是 //src/tests 目錄,用於從不同區域進行測試 涵蓋系統多個層面 (而不只是特定區域) 預計會上線因此,每個區域應該新增 OWNERS 檔案 就存在於這個目錄中的測試

依附元件結構

除了取決於本身因素,區域也只能使用頂層 buildsdkthird_party 目錄,以及 lib 目錄 在樹狀結構中的任何位置:

  • //build
  • //sdk
  • //third_party
  • //src/**/lib/

在建構系統中標示為僅供測試的區域, 此外,依附於該區域和祖系中的 testing 目錄:

  • (../)+testing/ (僅限 testonly=true 目標)

標準目標

每個區域和子區域都必須在對應的 頂層 BUILD.gn 檔案:

  • tests
    • 這個區域的所有測試
    • 新增子目錄後,請將測試目標新增至 父項目錄的測試目標。

命名慣例

為檔案和目錄命名時,最佳做法通常是使用名稱 確保內容簡短且明確如果名稱包含多個 字詞之間應以底線分隔,例如 long_file_name

範例

以下是 fortune 目錄的範例。

import("//build/drivers.gni")
import("//build/components.gni")

group("fortune") {
  testonly = true
  deps = [
    ":pkg",
    ":tests",
  ]
}

group("tests") {
  testonly = true
  deps = [
    ":fortune_tests"
  ]
}

executable("bin") {
  output_name = "fortune"

  sources = [
    "fortune.cc"
  ]
}

executable("test") {
  testonly = true
  output_name = "fortune-test"

  sources = [
    "test.cc"
  ]
}

fuchsia_component("component") {
  manifest = "meta/fortune.cml"
  deps = [ ":bin" ]
}

fuchsia_package("pkg") {
  package_name = "fortune"
  deps = [ ":component" ]
}

fuchsia_unittest_package("fortune_tests") {
  deps = [ ":test" ]
}

存放區版面配置

本節描述 Fuchsia 來源樹狀結構的目錄版面配置。 未加上星號的項目是 fuchsia.git 存放區中的目錄或檔案。 已加星號的 (*) 項目是對應至以下項目的個別存放區: 使用 jiri 的目錄結構 (預先建構的目錄除外, CIPD 填入)。

  • .clang-format
  • .dir-locals.el
  • .gitattributes
  • .gitignore
  • AUTHORS
  • CODE_OF_CONDUCT.md
  • CONTRIBUTING.md
  • LICENSE
  • OWNERS
  • PATENTS
  • README.md
  • rustfmt.toml
  • sdk/banjo/fuchsia.hardware.gpio/
  • sdk/banjo/...
  • sdk/fidl/fuchsia.media/
  • sdk/fidl/fuchsia.mediacodec/
  • sdk/fidl/...
  • sdk/lib/ddk/
  • sdk/lib/fit/
  • sdk/lib/fidl/
  • sdk/lib/zircon/
  • sdk/lib/...
  • .gn
  • BUILD.gn
  • build/
  • bundles/
  • configs/
  • infra/
    • configs/
      • generated/
  • integration/
  • products/
  • scripts/
  • docs/
  • examples/
  • third_party/
    • boringssl/ *
    • icu/ *
    • rust_crates/ *
    • ... *
  • prebuilt/
    • chromium/ *
    • llvm/ *
  • tools/
    • banjo/
    • fidl/bin/backend/{c,cpp,dart,go,llcpp,rust}
    • fidl/bin/frontend/
    • fidl/docs/
    • fidl/examples/
    • fidl/tests/
  • src/
    • lib/
    • cobalt/
    • component/
    • connectivity/
    • developer/
    • experiences/ *
    • graphics/
    • identity/
    • media/
    • storage/
    • testing/
    • ui/
      • scenic/
    • updater/
    • virtualization/
    • zircon/kernel/
    • zircon/drivers/
    • zircon/userspace/
  • vendor/
    • [closed-source code from various vendors] *

演化

隨著系統穩定下來,您可以將 fuchsia.git 中的區域升級為另外的 與存放區一般來說,當我們比較多個存放區時 確保區域和系統其餘部分之間的介面 (必須經過頂層 OWNERS 核准)。

新的程式碼可以是:

  • 新增至 fuchsia.git 的現有目錄
  • 已新增至現有區域的頂層區域或子區域
  • 新增至現有存放區
  • 已新增至新的存放區 (需要頂層 OWNERS 核准)