运行示例组件

本指南介绍了如何构建 Fuchsia 以添加 Fuchsia 的源 //examples 目录,并在 Fuchsia 目标。

前提条件

在运行示例组件之前,您必须:

探索示例

此示例组件会将 Hello, world! 输出到系统日志中。该示例包含 三个主要元素:

  • 使用支持的语言编写的可执行二进制文件。
  • 一个组件清单 (.cml) 文件,用于声明 组件及其功能。
  • BUILD.gn 文件,用于定义组件 build 目标和 将其包含在 Fuchsia 软件包中。

可执行程序

Fuchsia 组件可以执行用任何语言编写的程序,支持 运行时。C++ 和 Rust 程序最常用的运行时是 ELF 运行程序

C++

#include <iostream>

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

Rust

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",
    },
}

Rust

// 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",
  ]
}

Rust

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 图片中添加示例软件包

如需在 build 配置中包含示例软件包,请使用 --with 标志 需要注意的是:

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

对于具有最低 build 配置的 Fuchsia 模拟器,命令如下:

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

在此示例中,core 是一款具有最少功能集的产品,其中包括 x64 是指 x64 架构。

对于具有最低 build 配置的 Fuchsia 设备,命令如下:

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

如需了解更多详情,请参阅配置构建 更多选项。

设置 build 配置后,请使用以下代码构建 Fuchsia 命令:

fx build

现在,您的 build 中已经包含示例软件包, 按需提取和启动

探索您的产品配置

您可以使用 list-packages 命令。

全部列出:

fx list-packages

可能有很多条目,因此请添加名称以查找您要查找的条目:

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

运行示例组件

要运行 Fuchsia 组件,请使用其 Fuchsia 软件包网址 作为参数 添加到 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
    

    Rust

    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 映像, 添加适当的软件包