# Migrate system components

To migrate your system component, follow these steps:

1.  [Migrate the component manifest](#create-component-manifest)
1.  [Add to the component topology](#add-component-to-topology)
1.  [Migrate component features](#features)
1.  [Verify the migrated component](#verify-component)

## Migrate the component manifest {#create-component-manifest}

Create a minimal [CML file][glossary.component-manifest] and configure it with
GN so that it gets compiled and installed in your package.

Note: Unlike CMX, CML is [JSON5][json5-external]{: .external}, which allows
comments and trailing commas. Take advantage of this when writing your CML file!

1.  Determine where your CMX file is located in the source tree (for example,
    [`fonts.cmx`][example-fonts]). Create a file in the same directory that has
    the same filename but with a `.cml` extension, with the following contents:

    ```json5
    // fonts.cml
    {
        include: [
            // Enable system logging
            "syslog/client.shard.cml",
        ],
    }
    ```

    Note: Your CML file will live side-by-side with the CMX file for now. Do not
    delete the CMX file yet.

1.  Find the build rule that defines your component. Normally, this is a
    `fuchsia_component` rule. For example, see the fonts
    [`BUILD.gn`][example-package-rule].

    ```gn
    fuchsia_component("fonts") {
      manifest = "meta/fonts.cmx"
      deps = [ ":font_provider" ]
    }
    ```

1.  Update the `manifest` element of the associated `fuchsia_component` rule to
    point to your new `.cml` file instead:

    ```gn
    fuchsia_component("fonts") {
      {{ '<strong>' }}manifest = "meta/fonts.cml"{{ '</strong>' }}
      deps = [ ":font_provider" ]
    }
    ```

### Adding the executable {#component-executable}

Add the [`program`][manifests-program] section of your CML file along with the
appropriate runner declaration.

Note: The [runner][glossary.runner] declaration is necessary even if your
component is launched using the ELF runner. This is the default in CMX but must
be explicitly specified in CML.

```json
// fonts.cmx
{
    "include": [
        "syslog/client.shard.cmx"
    ],
    {{ '<strong>' }}"program": {
        "binary": "bin/font_provider"
    },{{ '</strong>' }}
    ...
}
```

```json5
// fonts.cml
{
    include: [
        // Enable system logging
        "syslog/client.shard.cml",
    ],
    {{ '<strong>' }}program: {
        runner: "elf",
        binary: "bin/font_provider",
    },{{ '</strong>' }}
}
```

### Declaring required services {#required-services}

Add [`use`][manifests-use] declarations to your CML file. These are the
approximate equivalent of the `services` list in CMX.

```json
// fonts.cmx
{
    "include": [
        "syslog/client.shard.cmx"
    ],
    "program": {
        "binary": "bin/font_provider"
    },
    {{ '<strong>' }}"sandbox": {
        "services": [
            "fuchsia.logger.LogSink",
            "fuchsia.pkg.FontResolver"
        ]
        ...
    }{{ '</strong>' }}
}
```

Convert each element of the `services` list to a `use` declaration for the
corresponding service `protocol`.

```json5
// fonts.cml
{
    include: [
        // Enable system logging
        "syslog/client.shard.cml",
    ],
    program: {
      runner: "elf",
      binary: "bin/font_provider",
    },
    {{ '<strong>' }}use: [
        {
            protocol: [ "fuchsia.pkg.FontResolver" ],
        },
    ],{{ '</strong>' }}
}
```

### Exposing available services {#available-services}

In Components v1, you typically declare information
about services exposed by a component in a
[sysmgr configuration file][sysmgr-config]. These files are referenced by
`config_data` targets in the build, and specify mappings of services to
components in the `sys` [environment][glossary.environment].

1.  Identify all service mappings, if any, for your component. You can use
    [CodeSearch][code-search] to find service mappings. Here is a
    [sample search][sysmgr-config-search].

    ```json
    // services.config
    {
        "services": {
            ...
            "fuchsia.fonts.Provider": "fuchsia-pkg://fuchsia.com/fonts#meta/fonts.cmx",
            ...
        }
    }
    ```

1.  For each service mapping, add an [`expose`][manifests-expose] declaration
    and a corresponding [`capabilities`][manifests-capabilities] entry with the
    service `protocol`.

    ```json5
    // fonts.cml
    {
        include: [
            // Enable system logging
            "syslog/client.shard.cml",
        ],
        program: {
          runner: "elf",
          binary: "bin/font_provider",
        },
        {{ '<strong>' }}capabilities: [
            {
                protocol: [ "fuchsia.fonts.Provider" ],
            },
        ],{{ '</strong>' }}
        use: [
            {
                protocol: [ "fuchsia.pkg.FontResolver" ],
            },
        ],
        {{ '<strong>' }}expose: [
            {
                protocol: "fuchsia.fonts.Provider",
                from: "self",
            },
        ],{{ '</strong>' }}
    }
    ```

1.  Build your updated package:

    ```posix-terminal
    fx build
    ```

Note: it is valid to `use` from `self` in the unusual case that your component
both consumes and publishes the same protocol. You'll know this is the case
when the "services" section in your `.cmx` references a protocol that is mapped
to the same component's URL in a `services.config` file.

## Add the new component {#add-component-to-topology}

Now you're ready to add your new component to the
[v2 component topology][components-topology]. This defines the relationship
between your component and the rest of the system.

Take another look at any sysmgr configuration file(s) that defines service
mappings to your component, which you identified while
[migrating the component manifest](#create-component-manifest). The steps below
refer to the collection of all these services as your component’s "exposed
services".

```json
// services.config
{
    "services": {
        ...
        "fuchsia.fonts.Provider": "fuchsia-pkg://fuchsia.com/fonts#meta/fonts.cmx",
        ...
    }
}
```

### Add the component to core {#add-component-to-core}

-   [Add a core realm shard](#add-core-shard): Your component is **not** present
    in *all* products (eg. maybe it is present on Workstation, but not
    terminal). Using a [core realm shard][core-realm-rfc] allows the component
    to be safely excluded where it isn't available.
-   [Add directly to core](#add-core-direct): Your component is present on all
    product and test build configurations. In this case you can add the
    component directly to `core.cml`.

#### Add a core realm shard {#add-core-shard}

1.  Create a [manifest shard][manifests-shard]. A manifest shard uses generally
    the syntax as a manifest, but *may* reference objects that don't exist
    within the manifest itself. In this case we reference the `session-manager` child
    which is not defined here, but we know is defined in `core`'s manifest.

    ```json5
    // component.core_shard.cml
    {
        children: [
            {
                name: "font_provider",
                url: "fuchsia-pkg://fuchsia.com/fonts#meta/fonts.cm",
            },
        ],
        offer: [
            {
                protocol: "fuchsia.fonts.Provider",
                from: "#font_provider",
                to: [ "#session-manager" ],
            },
        ],
    }
    ```

1.  Create a target in your `BUILD.gn` that defines the `core_shard`.

    ```gn
    # font_provider/BUILD.gn

    import("//src/sys/core/build/core_shard.gni")

    core_shard("font_provider_shard") {
      shard_file = "component.core_shard.cml"
    }
    ```

1.  Add the core realm shard to the appropriate products. For example, you can
    add the component to the Workstation product by modifying
    `//products/workstation_eng.gni` by adding the build target path to the
    `core_realm_shards` array. If your component is present on all products that
    derive from core and you are adding it via a shard, modify
    `//products/core.gni`.

    ```gn
    # //products/workstation_eng.gni
    ...
    core_realm_shards += [
        ...
        "//path/to/font_provider:font_provider_shard",
    ]
    ...
    ```

#### Add directly to core {#add-core-direct}

Add your component as a child instance of the [`core.cml`][cs-core-cml]
component, and offer its exposed services to dependent components. You need to choose a name
for your component instance and identify its component URL (you should be able
to get this from the config mapping).

```json5
// core.cml
{
    children: [
        ...
        {
            name: "font_provider",
            url: "fuchsia-pkg://fuchsia.com/fonts#meta/fonts.cm",
        },
    ],
    offer: [
        ...
        {
            protocol: "fuchsia.fonts.Provider",
            from: "#font_provider",
            to: [ "#session-manager" ],
        },
    ],
}
```

### Make your component's services available to v1 components {#route-to-v1}

It is very common for there to be components in the v1 `sys` realm that depend
on your component's exposed services. Make your component's services available
to the v1 `sys` realm by adding a declaration like the following to your core
realm shard, or if you've added your component directly to `core`, add the
declaration to [`appmgr.core_shard.cml`][cs-appmgr-core-shard].

```json5
// appmgr.core_shard.cml / component.core_shard.cml
{
    use: [
        {
            protocol: "fuchsia.fonts.FontProvider",
            from: "#font_provider",
        },
    ],
}
```

Note: You do _not_ need to offer the service to `appmgr`. `core` itself proxies
to and from the v1 `sys` realm, which is why we have `core` `use` the service.

### Offer services to your component {#offer-services}

To work properly, your component must be offered all services that appear in its
[`use`][manifests-use] declarations. These services may be provided by v1 or v2
components. Look in the sysmgr config files and `core.cml` to find the
originating components ([example search][sysmgr-config-search]).

There are three possible cases:

-   [v1 component provides service](#v1-component-provides-service): The
    provider of the service is a v1 component.
-   [v2 component in `core.cml` provides service](#v2-core-cml-provides-service):
    The provider of the service is a v2 component that's a child of `core.cml`.
-   The provider of the service is a v2 component that's not child of
    `core.cml`. If this is the case, reach out to
    [component-framework-dev][cf-dev-list] for assistance.

Note: You must also route all services requested by any manifest shards listed
in your manifest's [`include`][manifests-include].

#### v1 component provides service {#v1-component-provides-service}

You’ll reach this case if a mapping for the service exists in a sysmgr config
file. To make the service available to your component, do the following.

1.  Make sure a declaration like the following is present in
    [`appmgr.core_shard.cml`][cs-appmgr-core-shard] (if the service is
    configured in fuchsia.git) or your [core realm shard](#add-core-shard) (if
    it's configured outside fuchsia.git):

    ```json5
    // appmgr.core_shard.cml / component.core_shard.cml
    {
        capabilities: [
            ...
            { protocol: "fuchsia.pkg.FontResolver" },
            ...
        ],
    }
    ```
1.  Add the following to your component's [core realm shard](#add-core-shard) or
    `appmgr.core_shard.cml`:

    ```json5
    // appmgr.core_shard.cml / component.core_shard.cml
    {
        offer: [
            ...
            {
                protocol: "fuchsia.pkg.FontResolver",
                from: "self",
                to: [ "#font_provider" ],
            },
            ...
        ],
    }
    ```

    Note: You do _not_ offer the service from `appmgr`. `core` itself proxies
    to and from the v1 `sys` realm, which is why we have `core` offer the
    service.

#### v2 component in core.cml provides service {#v2-core-cml-provides-service}

Route the service from the component in `core` that exposes it to your component
in `core.cml`:

```json5
// core.cml
{
    offer: [
        ...
        {
            protocol: [ "fuchsia.pkg.FontResolver" ],
            from: "#font_resolver",
            to: [ "#font_provider" ],
        },
        ...
    ],
}
```

### Resolve dependency cycles {#dependency-cycles}

In Components v1, `appmgr` represents a collection of multiple components with
many capabilities. This increases the chance that a v2 component routes multiple
capabilities into and out of `appmgr` for a given component. Components that
both offer services to `appmgr` and consume services offered by `appmgr` create
a **dependency cycle** that you may need to resolve during the migration.

```none
Strong dependency cycles were found. Break the cycle by removing a dependency or
marking an offer as weak. Cycles: { { ... }, { ... } }
```

To avoid build-time errors resulting from dependency cycles, apply the
`weak_for_migration` tag to one of the capability routes. For example:

```json5
// core.cml / component.core_shard.cml
{
    offer: [
        {
            protocol: [ "fuchsia.pkg.FontResolver" ],
            from: "#appmgr",
            to: [ "#font_provider" ],
            {{ '<strong>' }}dependency: "weak_for_migration",{{ '</strong>' }}
        },
        {
            protocol: "fuchsia.fonts.Provider",
            from: "#font_provider",
            to: [ "#appmgr" ],
        },
    ]
}
```

You can apply `weak_for_migration` to either capability in a dependency cycle.
Determine which side is most appropriate for your component. In most cases, the
convention is to apply `weak_for_migration` on the capability offered from
`appmgr` until everything is migrated out of Components v1.

### Remove sysmgr configuration entries {#remove-config-entries}

Before you test your component, remove the service mappings in
the sysmgr configuration files you identified previously.

Without this step, sysmgr will report errors attempting to load services from
your v1 component instead of using the new capabilities routed to it through
`core.cml`.

```json
// services.config
{
    "services": {
        ...
        // Delete these lines
        "fuchsia.fonts.Provider": "fuchsia-pkg://fuchsia.com/fonts#meta/fonts.cmx",
        ...
    }
}
```

## Considerations for out-of-tree components

This section covers the tactical considerations of performing a soft migration
from using sysmgr configs to core shards when products defined outside
fuchsia.git ("out-of-tree" or "OOT") use your component. This type of migration
requires special consideration because it is not possible to change both
repositories simulateneously. Some of this section duplicates some other content
in this guide to avoid needing to jump back and forth. Follow the five steps
below to complete the soft migration.

1. Define an empty core shard

   Define an empty core shard by creating a file with an empty object. Note this
   means that the file itself is not empty.

   ```json5
    // font_provider/meta/component.core_shard.cml
    { }
   ```

   Then define this as a core shard build target.

   ```gn
   # font_provider/BUILD.gn

   import("//src/sys/core/build/core_shard.gni")

   core_shard("font_provider_shard") {
       shard_file = "meta/component.core_shard.cml"
   }
   ```

1. Update OOT products to depend on new shard

   In the OOT repository, update the product definitions to depend on the new
   shard in fuchsia.git.

   ```gn
   # //vendor/products/product.gni
   core_realm_shards += [ "//path/to/font_provider:font_provider_shard" ]
   ```

1. Populate the core shard and empty out the sysmgr config

   This step is effectively the swap operation where products will start to use
   the v2 component and stop using the v1 component.

   First, populate the core shard created in the first step.

   ```json5
   // font_provider/meta/component.core_shard.cml
   {
       children: [
           {
               name: "font_provider",
               url: "fuchsia-pkg://fuchsia.com/fonts#meta/fonts.cm",
           },
       ],
       // if appmgr components use this protocol
       use: [
           {
               protocol: "fuchsia.fonts.Provider",
               from: "#font_provider",
           },
       ],
       offer: [
           {
               protocol: "fuchsia.logger.LogSink",
               from: "parent",
               to: [ "#font_provider" ],
           },
           {
               protocol: "fuchsia.fonts.Provider",
               from: "#font_provider",
               to: [ "#session-manager" ],
           },
       ],
   }
   ```

   Now remove any entries from sysmgr config files where the v1 component
   appeared. If your component had its own sysmgr config this means the config
   file will now contain an empty JSON object.

   ```json
   // font_provider/config/services.config
   { }
   ```

   Update any fuchsia.git products so they depend on the core shard. The
   procedure is the same as for OOT products, except make the changes to the
   product definitions in fuchsia.git.

   If your component's sysmgr config was specific to your component, remove any
   dependencies that fuchsia.git products have on that sysmgr config. If the
   sysmgr config has a build target called
   `//path/to/font_provider:sysmgr_config` then an effective way to locate these
   dependencies is searching the codebase for "font_provider:sysmgr_config"
   using [CodeSearch][sysmgr-gn-config-search].

1. Remove OOT dependencies on the v1 sysmgr config

   If your component's sysmgr service config was part of a larger sysmgr config
   file you can skip this section. Otherwise, remove the dependencies on your
   component's dedicated v1 sysmgr config. This dependency is expressed as an
   addition to the `base_package_labels` in a product's .gni. If the sysmgr
   config has a build target called `//path/to/font_provider:sysmgr_config` then
   an effective way to locate these dependencies is searching the codebase for
   "font_provider:sysmgr_config" using [CodeSearch][sysmgr-gn-config-search].

1. Remove any empty sysmgr config files and build targets

   If the sysmgr config file that contained your component's entry or entries is
   empty, delete the build target for the config file. The build target might
   look something like the following.

   ```gn
   # //path/to/font_provider/BUILD.gn
   {
       ...
       config_data("sysmgr_config") {
       sources = [ "config/services.config" ]
       for_pkg = "sysmgr"
       ...
   }
   ```

   In the same change, delete the sysmgr config file itself, for example
   `//path/to/font_provider/config/services.config`.

## Migrate component features {#features}

Explore the following sections for additional migration guidance on
specific features your system components may support:

-   [Component sandbox features](features.md)
-   [Diagnostics capabilities](diagnostics.md)
-   [Other common situations](common.md)

## Launching components {#launch-component}

Components v1 supports launching components explicitly using their component
URL with `fx shell run`. This instantiates the component in the common `sys`
[environment][glossary.environment] where it has full access to the capabilities
available there.

In Components v2, system components interact through the capabilities that are
explicitly routed to them. This means that where a component is instantiated
within the [component topology](#add-component-to-topology) affects what a
component can accomplish.

If your component is currently invoked using `fx run` or `fx shell`,
consider migrating the functionality to a [plugin for `ffx`][ffx-plugins].

### Shell binaries {#shell-binary}

Your project may contain a `fuchsia_shell_package()` build target designed to
execute in a shell environment. Many of these packages also contain a CMX file
to support invoking the binary as a v1 component. When
[routing your services](#route-to-v1) to the `sys` environment,
include any services required by shell binaries.

Shell binaries are run in the `sys` [environment][glossary.environment], and
have access to all the capabilities provided there. Capabilities are not defined
by the CMX manifest file unless shell binaries are invoked as a component using
the `fx shell run` command.

When working with shell binaries, consider the following:

-   If you only need access to the binary through a shell interface, remove the
    unused CMX file entirely. Do not replace it with a corresponding CML file.
-   If you need to access the binary from somewhere else in the v2 component
    topology (such as tests), migrate the functionality into a new v2 component
    instead.

Note: If the solutions presented here are not appropriate for your use case,
please reach out to [component-framework-dev][cf-dev-list].

## Verify the migrated component {#verify-component}

Verify that your migrated component and its dependencies behave as expected
using Components v2.

1.  Build the target for your package:

    ```posix-terminal
    fx build
    ```

1.  Manually verify your component's behavior. You can use the complete set of
    [`ffx component` tools][ffx-component] to interact with your component and
    its capabilities at runtime. For additional details on running components in
    the v2 component topology, see [Run components][run-components].

If your component or one of the components that depends on it isn't working
correctly, try following the advice in
[Troubleshooting components][troubleshooting-components].

[cf-dev-list]: https://groups.google.com/a/fuchsia.dev/g/component-framework-dev
[code-search]: https://cs.opensource.google/fuchsia
[components-topology]: /docs/concepts/components/v2/topology.md
[core-realm-rfc]: /docs/contribute/governance/rfcs/0089_core_realm_variations.md
[cs-core-cml]: /src/sys/core/meta/core.cml
[cs-appmgr-core-shard]: /src/sys/appmgr/meta/appmgr.core_shard.cml
[ffx-component]: /docs/development/tools/ffx/getting-started.md#interacting_with_components
[ffx-plugins]: /docs/development/tools/ffx/development/plugins.md
[fx-scrutiny]: https://fuchsia.dev/reference/tools/fx/cmd/scrutiny
[glossary.component-manifest]: /docs/glossary/README.md#component-manifest
[glossary.environment]: /docs/glossary/README.md#environment
[glossary.runner]: /docs/glossary/README.md#runner
[example-fonts]: https://fuchsia.googlesource.com/fuchsia/+/cd29e692c5bfdb0979161e52572f847069e10e2f/src/fonts/meta/fonts.cmx
[example-package-rule]: https://fuchsia.googlesource.com/fuchsia/+/cd29e692c5bfdb0979161e52572f847069e10e2f/src/fonts/BUILD.gn
[json5-external]: https://json5.org/
[manifests-capabilities]: https://fuchsia.dev/reference/cml#capabilities
[manifests-expose]: https://fuchsia.dev/reference/cml#expose
[manifests-include]: https://fuchsia.dev/reference/cml#include
[manifests-program]: https://fuchsia.dev/reference/cml#program
[manifests-shard]: /docs/development/components/build.md#component-manifest-shards
[manifests-use]: https://fuchsia.dev/reference/cml#use
[migrate-features-directory]: /docs/development/components/v2/migration/features.md#directory-features
[run-components]: /docs/development/components/run.md
[sysmgr-config]: /docs/development/components/v2/migration/sysmgr.md
[sysmgr-config-search]: https://cs.opensource.google/search?q=fuchsia-pkg:%2F%2Ffuchsia.com%2F.*%23meta%2Fmy_component.cmx%20-f:.*.cmx$%20%5C%22services%5C%22&ss=fuchsia
[sysmgr-gn-config-search]: https://cs.opensource.google/search?q=-f:.*.gn%20"font_provider:sysmgr_config"&ss=fuchsia
[troubleshooting-components]: /docs/development/components/connect.md#troubleshooting
