| # Copyright 2020 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. |
| |
| import("fuchsia_component.gni") |
| import("fuchsia_package.gni") |
| |
| # Defines a package that contains a single component. |
| # See: https://fuchsia.dev/fuchsia-src/development/components/build |
| # |
| # Developers often define a package that contains a single component. |
| # This template fuses together fuchsia_package() and fuchsia_component() as a |
| # convenience. |
| # |
| # Packages are units of distribution. It is beneficial to define multiple |
| # components in the same package if you need to guarantee that several |
| # components are always co-present, or if you'd like to be able to update |
| # several components at once (by updating a single package). |
| # This pattern is also commonly used to create hermetic integration tests. |
| # For instance an integration test between two components where one is a client |
| # of a service implemented in another component would include both the client |
| # and server components. |
| # However for the sake of simplicity, if you're developing a package with just |
| # a single component then this template will save you some boilerplate. |
| # |
| # Example: |
| # ``` |
| # executable("rot13_encoder_decoder") { |
| # sources = [ "rot13_encoder_decoder.cc" ] |
| # } |
| # |
| # fuchsia_package_with_single_component("rot13") { |
| # manifest = "meta/rot13.cmx" |
| # deps = [ ":rot13_encoder_decoder" ] |
| # } |
| # ``` |
| # |
| # Parameters |
| # |
| # package_name (optional) |
| # The name of the package. |
| # Type: string |
| # Default: target_name |
| # |
| # component_name (optional) |
| # The name of the component. |
| # Type: string |
| # Default: target_name |
| # |
| # manifest (required) |
| # The component manifest. |
| # Type: path |
| # |
| # deps |
| # testonly |
| # visibility |
| template("fuchsia_package_with_single_component") { |
| assert( |
| defined(invoker.manifest), |
| "A `manifest` argument was missing when calling fuchsia_package_with_single_component($target_name)") |
| |
| package_name = target_name |
| if (defined(invoker.package_name)) { |
| package_name = invoker.package_name |
| } |
| component_name = target_name |
| if (defined(invoker.component_name)) { |
| component_name = invoker.component_name |
| } |
| |
| component_target = "${target_name}_component" |
| fuchsia_component(component_target) { |
| forward_variables_from(invoker, |
| [ |
| "deps", |
| "manifest", |
| "testonly", |
| ]) |
| component_name = component_name |
| visibility = [ ":*" ] |
| } |
| |
| fuchsia_package(target_name) { |
| forward_variables_from(invoker, |
| [ |
| "testonly", |
| "visibility", |
| ]) |
| package_name = package_name |
| deps = [ ":$component_target" ] |
| } |
| } |