blob: 080522be54dd2134e54579683d8a6a553528e503 [file] [log] [blame]
# 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" ]
}
}