| # 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("//build/dist/fini_manifest.gni") |
| import("//build/dist/generated_resource.gni") |
| import("//build/images/args.gni") |
| import("//src/sys/pkg/bin/pm/pm.gni") |
| import("//tools/cmc/build/validate_component_manifest_references.gni") |
| |
| # Defines a Fuchsia package. |
| # See: https://fuchsia.dev/fuchsia-src/development/components/build |
| # |
| # Fuchsia packages are a collection of any number of files (or resources), each |
| # with a unique path that is relative to the package's root. |
| # Package targets collect resources via their dependencies. These dependencies |
| # are typically fuchsia_component() targets, which provide their component |
| # manifest and other files that the component needs (such as an executable). |
| # |
| # Packages can be defined as a collection of pairs each representing a file in |
| # the package. Each pair consists of the path in the package that is assigned |
| # to the file, and a path relative to the build system's output directory where |
| # the contents of the file will be sourced from. |
| # This mapping is generated at build time, and is known as the package |
| # manifest. |
| # |
| # To view the package manifest, For instance assume you have defined |
| # a package at `path/to/project:my_package` and built it: |
| # ``` |
| # $ fx build path/to/project:my_package |
| # ``` |
| # You can then find the path to the generated manifest: |
| # ``` |
| # $ fx gn outputs out/default path/to/project:my_package_manifest |
| # ``` |
| # |
| # The package name is defined by the target name. |
| # Some rules apply to package names. |
| # See: https://fuchsia.dev/fuchsia-src/concepts/packages/package_url#package-name |
| # |
| # It's recommended for a package to depend on one or more `fuchsia_component()` |
| # targets. Typically no other dependencies are required. |
| # |
| # Example: |
| # ``` |
| # fuchsia_package("my-package") { |
| # deps = [ |
| # ":first_component", |
| # ":second_component", |
| # ] |
| # } |
| # ``` |
| # |
| # Parameters |
| # |
| # package_name (optional) |
| # The name of the package. |
| # Type: string |
| # Default: target_name |
| # |
| # deps |
| # testonly |
| # visibility |
| template("fuchsia_package") { |
| package_name = target_name |
| if (defined(invoker.package_name)) { |
| package_name = invoker.package_name |
| } |
| |
| # Generate the "meta/package" file |
| meta_package_target = "${target_name}_meta_package" |
| generated_resource(meta_package_target) { |
| contents = "{\"name\":\"$package_name\",\"version\":\"0\"}" |
| outputs = [ "meta/package" ] |
| output_conversion = "string" |
| visibility = [ ":*" ] |
| } |
| |
| # Generate package manifest |
| package_manifest_target = "${target_name}_manifest" |
| package_manifest_file = "$target_out_dir/${target_name}_manifest" |
| fini_manifest(package_manifest_target) { |
| forward_variables_from(invoker, |
| [ |
| "deps", |
| "testonly", |
| ]) |
| if (!defined(deps)) { |
| deps = [] |
| } |
| deps += [ ":$meta_package_target" ] |
| visibility = [ ":*" ] |
| outputs = [ package_manifest_file ] |
| } |
| |
| # Validate component manifests against package manifest |
| component_manifests_target = "${target_name}_component_manifests" |
| component_manifests_rspfile = |
| "$target_out_dir/${target_name}_component_manifests" |
| generated_file(component_manifests_target) { |
| forward_variables_from(invoker, |
| [ |
| "deps", |
| "testonly", |
| ]) |
| visibility = [ ":*" ] |
| data_keys = [ "component_manifests" ] |
| walk_keys = [ "component_manifests_barrier" ] |
| outputs = [ component_manifests_rspfile ] |
| } |
| |
| validate_target = "${target_name}_validate_manifests" |
| validate_component_manifest_references(validate_target) { |
| forward_variables_from(invoker, [ "testonly" ]) |
| deps = [ |
| ":$component_manifests_target", |
| ":$package_manifest_target", |
| ] |
| visibility = [ ":*" ] |
| package_manifest = package_manifest_file |
| component_manifests_rspfile = component_manifests_rspfile |
| } |
| |
| # Build package |
| pm_build(target_name) { |
| forward_variables_from(invoker, |
| [ |
| "testonly", |
| "visibility", |
| ]) |
| manifest = ":$package_manifest_target" |
| deps = [ ":$validate_target" ] |
| metadata = { |
| # Add barriers so that the contents of this package do not get |
| # accidentally picked up by other packages via improper dependencies. |
| component_manifests_barrier = [] |
| if (!bootfs_only) { |
| # If the bringup configuration is being built, the contents need to be |
| # exposed to other containers. |
| # See fxbug.dev/45680 for more information. |
| distribution_entries_barrier = [] |
| } |
| } |
| } |
| } |