執行範例元件

本指南說明如何建構 Fuchsia,以便從 Fuchsia 的來源 //examples 目錄加入範例套件,並在 Fuchsia 目標上執行元件。

必要條件

如要執行範例元件,您必須:

探索範例

這個範例元件會將 Hello, world! 列印到系統記錄。這個範例有三個主要元素:

可執行的程式

Fuchsia 元件可執行使用支援的執行階段編寫的任何語言程式。用於 C++ 和 Rust 程式的最常見執行階段是 ELF 執行程式

C++

#include <iostream>

int main() {
  std::cout << "Hello, World!\n";
  return 0;
}

荒漠油廠

fn main() {
    println!("{}, world!", greeting());
    eprintln!("{}, world!", greeting());
}

fn greeting() -> String {
    return String::from("Hello");
}

元件資訊清單

說明如何將 Fuchsia 程式當做 這包括宣告程式二進位檔、執行階段資訊,以及元件執行所需的任何功能,例如記錄支援。

C++

// Copyright 2022 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
{
    // Enable system logging capabilities
    include: [ "syslog/client.shard.cml" ],

    // Information about the program to run
    program: {
        // Use the built-in ELF runner for the executable
        runner: "elf",
        binary: "bin/hello_world_cpp",

        // Enable stdout logging
        forward_stderr_to: "log",
        forward_stdout_to: "log",
    },
}

荒漠油廠

// Copyright 2022 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
{
    // Enable system logging capabilities
    include: [ "syslog/client.shard.cml" ],

    // Information about the program to run
    program: {
        // Use the built-in ELF runner for the executable
        runner: "elf",
        binary: "bin/hello_world_rust",

        // Enable stdout logging
        forward_stderr_to: "log",
        forward_stdout_to: "log",
    },
}

如要進一步瞭解元件資訊清單及其宣告語法,請參閱「元件資訊清單」。

BUILD.gn

Fuchsia 會使用 Generate Ninja (GN) 元建構系統,為執行實際建構作業的 Ninja 產生輸入內容。BUILD.gn 檔案會宣告 fuchsia_component()fuchsia_package() 的建構目標。

C++

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

fuchsia_component("hello-world-cpp-component") {
  deps = [ ":bin" ]

  # Defines the name given to the manifest when included in a fuchsia package.
  # In this case: "hello-world-cpp.cm"
  component_name = "hello-world-cpp"
  manifest = "meta/hello_world_cpp.cml"
}

fuchsia_package("hello-world-cpp") {
  deps = [
    # component-url: fuchsia-pkg://fuchsia.com/hello-world-cpp#meta/hello-world-cpp.cm
    ":hello-world-cpp-component",
  ]
}

荒漠油廠

rustc_binary("bin") {
  name = "hello_world_rust"

  # Generates the "bin_test" build target
  with_unit_tests = true
  edition = "2021"

  deps = []
  test_deps = [ "//src/lib/fuchsia" ]

  sources = [ "src/main.rs" ]
}

fuchsia_component("hello-world-rust-component") {
  deps = [ ":bin" ]

  # Defines the name given to the manifest when included in a fuchsia package.
  # In this case: "hello-world-rust.cm"
  component_name = "hello-world-rust"
  manifest = "meta/hello_world_rust.cml"
}

fuchsia_package("hello-world-rust") {
  deps = [
    # component-url: fuchsia-pkg://fuchsia.com/hello-world-rust#meta/hello-world-rust.cm
    ":hello-world-rust-component",
  ]
}

如要進一步瞭解 Fuchsia 如何使用 GN 定義元件和套件,請參閱「建構元件」。

在 Fuchsia 映像檔中加入範例套件

如要在建構設定中加入範例套件,請在設定產品和電路板環境時使用 --with 標記:

fx set product.board --with //examples/hello_world

如果是使用最少建構設定的 Fuchsia 模擬器,指令如下:

fx set core.x64 --with //examples/hello_world

在此範例中,core 是具備基本功能集的產品,其中包含常見的網路功能,x64 則代表 x64 架構。

如果是採用最少建構設定的 Fuchsia 裝置,指令如下:

fx set core.x64 --with //examples/hello_world

如需其他選項,請參閱「設定建構作業」。

設定建構設定後,請使用下列指令建構 Fuchsia:

fx build

現在,您已建構包含可隨選擷取及啟動範例套件的建構。

探索產品設定

您可以使用 list-packages 指令探索產品設定的內容。

全部列出:

fx list-packages

這裡可能有許多項目,因此請加上名稱,以便找到所需項目:

fx list-packages hello-world
hello-world
hello-world-cpp-unittests
hello-world-rust-tests

執行範例元件

run

  1. 開啟終端機並執行 fx serve

    fx serve
    
  2. 開啟另一個終端機並執行範例元件:

    C++

    ffx component run /core/ffx-laboratory:hello-world-cpp fuchsia-pkg://fuchsia.com/hello-world-cpp#meta/hello-world-cpp.cm
    

    荒漠油廠

    ffx component run /core/ffx-laboratory:hello-world-rust fuchsia-pkg://fuchsia.com/hello-world-rust#meta/hello-world-rust.cm
    
  3. 開啟另一個終端機並查看系統記錄:

    ffx log --filter hello-world
    

    元件會將下列輸出內容列印到記錄中:

    [ffx-laboratory:hello-world] INFO: Hello, World!
    

疑難排解

如果 fx serve 未執行,指令會從裝置或模擬器輸出錯誤訊息。

如果 fx serve 正在執行,但找不到套件,請重複執行這些步驟,並重新建構 Fuchsia 映像檔,以便納入適當的套件。