| # 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 |
| # |
| # excluded_files |
| # Optional: List of files to exclude from the package. |
| # |
| # 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 |
| } |
| |
| _depfile = "${target_gen_dir}/${target_name}_stamp.d" |
| |
| # target names |
| _manifest_target = "${target_name}__archive-manifest" |
| _metadata_target = "${target_name}__archive-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}.archive_manifest" |
| _build_ids_file = "$_pkg_out_dir/ids.txt" |
| _package_file = "$_pkg_out_dir/package" |
| |
| _packaged_components_metadata = |
| "${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("${package_name}_packaged_components_metadata") { |
| forward_variables_from(invoker, [ "testonly" ]) |
| outputs = [ _packaged_components_metadata ] |
| data_keys = [ "contents" ] |
| output_conversion = "json" |
| deps = _package_deps |
| } |
| |
| action(_manifest_target) { |
| forward_variables_from(invoker, |
| [ |
| "deps", |
| "testonly", |
| ]) |
| script = "${fuchsia_sdk}/build/prepare_package_inputs.py" |
| |
| inputs = [ _runtime_deps_file ] |
| |
| outputs = [ |
| _archive_manifest, |
| _build_ids_file, |
| _package_file, |
| ] |
| |
| if (!defined(deps)) { |
| deps = [] |
| } |
| data_deps = _package_deps |
| deps += _package_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), |
| ] |
| |
| if (defined(excluded_files)) { |
| foreach(filename, excluded_files) { |
| args += [ |
| "--exclude-file", |
| filename, |
| ] |
| } |
| } |
| write_runtime_deps = _runtime_deps_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 |
| deps = [ ":$_metadata_target" ] |
| } |
| } |