|  | # Copyright 2019 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("config/config.gni") | 
|  | import("pm_tool.gni") | 
|  |  | 
|  | # Define a Fuchsia component package target. | 
|  | # | 
|  | # Parameters | 
|  | # | 
|  | #   package_name: [Optional] | 
|  | #     Name of the package. Defaults to target_name. | 
|  | # | 
|  | #     Type: string | 
|  | # | 
|  | #   excluded_files: [Optional] | 
|  | #     List of files to exclude from the package. | 
|  | # | 
|  | #     Type: list of file paths | 
|  | # | 
|  | #   fidl_ref_out_dir: [Optional] | 
|  | #     Directory for writing out $package_name_all_fidl_refs.txt | 
|  | #       that contains the paths to the internal representation (IR) of every | 
|  | #       FIDL interface referenced in the package. Defaults to $root_build_dir/fidl_refs. | 
|  | # | 
|  | #   ids_txt_output_path: [Optional] | 
|  | #     Path to write out the ids.txt file for the symbols in the binaries. | 
|  | #     Defaults to `${target_gen_dir}/${package_name}/ids.txt` | 
|  | # | 
|  | #     Type: file path | 
|  | # | 
|  | #   deps | 
|  | #     Required: List of fuchsia_component() targets that this | 
|  | #              package contains. | 
|  | # | 
|  | template("fuchsia_package") { | 
|  | if (!defined(invoker.package_name)) { | 
|  | package_name = target_name | 
|  | } else { | 
|  | package_name = invoker.package_name | 
|  | } | 
|  | if (!defined(invoker.excluded_files)) { | 
|  | excluded_files = [] | 
|  | } else { | 
|  | excluded_files = invoker.excluded_files | 
|  | } | 
|  | if (!defined(invoker.fidl_ref_out_dir)) { | 
|  | fidl_ref_out_dir = "$root_build_dir/fidl_refs" | 
|  | } else { | 
|  | fidl_ref_out_dir = invoker.fidl_ref_out_dir | 
|  | } | 
|  |  | 
|  | _depfile = "${target_gen_dir}/${target_name}_stamp.d" | 
|  |  | 
|  | # target names | 
|  | _manifest_target = "${target_name}__archive-manifest" | 
|  | _metadata_target = "${target_name}__archive-metadata" | 
|  | _packaged_components_metadata_target = | 
|  | "${target_name}__packaged_components_metadata" | 
|  |  | 
|  | # output values | 
|  | _pkg_out_dir = "${target_gen_dir}/${package_name}" | 
|  | _runtime_deps_file = "$_pkg_out_dir/${package_name}.runtime_deps" | 
|  | _archive_manifest = "$_pkg_out_dir/${package_name}.manifest" | 
|  | _build_ids_file = "$_pkg_out_dir/ids.txt" | 
|  | if (defined(invoker.ids_txt_output_path)) { | 
|  | _build_ids_file = invoker.ids_txt_output_path | 
|  | } | 
|  | _package_file = "$_pkg_out_dir/package" | 
|  | _fidl_json_refs_file = "${fidl_ref_out_dir}/${package_name}_all_fidl_refs.txt" | 
|  |  | 
|  | _packaged_components_metadata_file = | 
|  | "${target_gen_dir}/${package_name}_packaged_components_metadata.json" | 
|  |  | 
|  | _package_deps = [] | 
|  | if (defined(invoker.deps)) { | 
|  | _package_deps += invoker.deps | 
|  | } | 
|  | if (defined(invoker.data_deps)) { | 
|  | _package_deps += invoker.data_deps | 
|  | } | 
|  |  | 
|  | # Generates a JSON file containing the contents of each of the | 
|  | # components being included in this package. | 
|  | generated_file(_packaged_components_metadata_target) { | 
|  | forward_variables_from(invoker, [ "testonly" ]) | 
|  | outputs = [ _packaged_components_metadata_file ] | 
|  | data_keys = [ "contents" ] | 
|  | output_conversion = "json" | 
|  | deps = _package_deps | 
|  | } | 
|  |  | 
|  | # | 
|  | # A generated file that lists all of the .fidl.json files | 
|  | # used in this package. This is useful for tools that need | 
|  | # to decode fidl. | 
|  | generated_file("${package_name}_all_fidl_refs") { | 
|  | testonly = true | 
|  | deps = _package_deps | 
|  |  | 
|  | outputs = [ _fidl_json_refs_file ] | 
|  | data_keys = [ "fidl_json" ] | 
|  | } | 
|  |  | 
|  | action(_manifest_target) { | 
|  | forward_variables_from(invoker, [ "testonly" ]) | 
|  | script = "${fuchsia_sdk}/build/prepare_package_inputs.py" | 
|  |  | 
|  | inputs = [ | 
|  | _runtime_deps_file, | 
|  | _packaged_components_metadata_file, | 
|  | ] | 
|  |  | 
|  | outputs = [ | 
|  | _archive_manifest, | 
|  | _build_ids_file, | 
|  | _package_file, | 
|  | ] | 
|  |  | 
|  | data_deps = _package_deps | 
|  |  | 
|  | deps = _package_deps | 
|  | deps += [ ":${_packaged_components_metadata_target}" ] | 
|  | if (defined(invoker.deps)) { | 
|  | deps += invoker.deps | 
|  | } | 
|  |  | 
|  | # Use a depfile to trigger package rebuilds if any of the files (static | 
|  | # assets, shared libraries, etc.) included by the package have changed. | 
|  | depfile = _depfile | 
|  |  | 
|  | args = [ | 
|  | "--root-dir", | 
|  | rebase_path("//", root_build_dir), | 
|  | "--out-dir", | 
|  | rebase_path(root_out_dir, root_build_dir), | 
|  | "--app-name", | 
|  | package_name, | 
|  | "--runtime-deps-file", | 
|  | rebase_path(_runtime_deps_file, root_build_dir), | 
|  | "--depfile-path", | 
|  | rebase_path(_depfile, root_build_dir), | 
|  | "--manifest-path", | 
|  | rebase_path(_archive_manifest, root_build_dir), | 
|  | "--build-ids-file", | 
|  | rebase_path(_build_ids_file, root_build_dir), | 
|  | "--json-file", | 
|  | rebase_path(_packaged_components_metadata_file), | 
|  | ] | 
|  |  | 
|  | if (defined(excluded_files)) { | 
|  | foreach(filename, excluded_files) { | 
|  | args += [ | 
|  | "--exclude-file", | 
|  | filename, | 
|  | ] | 
|  | } | 
|  | } | 
|  | write_runtime_deps = _runtime_deps_file | 
|  |  | 
|  | # Allows ids.txt paths to be collected by dependent targets. | 
|  | metadata = { | 
|  | ids_txt_paths = [ _build_ids_file ] | 
|  | } | 
|  | } | 
|  |  | 
|  | # Creates a Fuchsia metadata package. | 
|  | fuchsia_pm_tool(_metadata_target) { | 
|  | forward_variables_from(invoker, [ "testonly" ]) | 
|  | package_name = package_name | 
|  | command = "build" | 
|  | archive_manifest = _archive_manifest | 
|  | public_deps = [ ":$_manifest_target" ] | 
|  | } | 
|  |  | 
|  | fuchsia_pm_tool(target_name) { | 
|  | forward_variables_from(invoker, [ "testonly" ]) | 
|  | package_name = package_name | 
|  | command = "archive" | 
|  | archive_manifest = _archive_manifest | 
|  | public_deps = [ ":$_metadata_target" ] | 
|  | } | 
|  | } |