blob: e1d5b512245e0b999202eb28d12b3f6870c4d916 [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("//build/config.gni")
import("//build/config/fuchsia/zbi.gni")
import("//build/config/fuchsia/zircon.gni")
import("//build/images/collect_blob_manifest.gni")
import("//build/images/fvm.gni")
import("//build/images/shell_commands.gni")
import("//garnet/build/pkgfs.gni")
# Assembles a Fuchsia system.
#
# Given base, cache, and available packages, assembles a Fuchsia system
# containing those packages.
#
# This template can be instantiated at most one in a given BUILD.gn file.
#
# Unfortunately, we still have some parts of the build that need build-global
# names. The name of this target is used to disambiguate those names, which
# means the target_name of this template instance must be unique among
# instances of the template.
#
# Parameters
#
# base_packages (required)
# [list of labels] The packages to include in the base package set.
#
# netboot (default: false)
# [boolean] Whether the generated ZBI should contain the entire system.
#
# devmgr_config (default: [])
# [list of strings] List of arguments to add to /boot/config/devmgr.
# These arguments come after synthesized arguments to configure blobfs and
# pkgfs.
template("assemble_system") {
base_packages = invoker.base_packages
# Must be unique among assembled systems.
image_name = target_name
netboot = false
if (defined(invoker.netboot)) {
netboot = invoker.netboot
}
devmgr_config = []
if (defined(invoker.devmgr_config)) {
devmgr_config = invoker.devmgr_config
}
group("base_packages") {
testonly = true
visibility = [ ":*" ]
deps = base_packages
}
meta_far_merkle_index = "$target_out_dir/meta_far_merkle_index"
package_metadata_list("meta_far_merkle_index") {
testonly = true
visibility = [ ":*" ]
outputs = [
meta_far_merkle_index,
]
data_keys = [ "meta_far_merkle_index_entries" ]
deps = [
":base_packages",
]
}
action("pkgsvr_index") {
visibility = [ ":*" ]
testonly = true
inputs = [
meta_far_merkle_index,
]
outputs = [
"$target_out_dir/$target_name",
]
deps = [
":meta_far_merkle_index",
]
script = "//build/images/manifest_content_expand.sh"
args = rebase_path(inputs, root_build_dir) +
rebase_path(outputs, root_build_dir)
}
system_image_manifest_args = "$target_out_dir/system_image.manifest_args"
generated_file("system_image.manifest_args") {
visibility = [ ":*" ]
testonly = true
outputs = [
system_image_manifest_args,
]
data_keys = [ "system_image_rsps" ]
walk_keys = [ "package_barrier" ]
deps = [
":base_packages",
]
}
boot_manifest = "$target_out_dir/boot.manifest"
generate_manifest("system_image.manifest") {
visibility = [ ":*" ]
testonly = true
bootfs_manifest = boot_manifest
bootfs_zircon_groups = "all"
deps = [
":pkgsvr_index",
":system_image.manifest_args",
]
json = "//build/images/system_meta_package.json"
pkgsvr_index = get_target_outputs(":pkgsvr_index")
sources = [
json,
pkgsvr_index[0],
system_image_manifest_args,
]
args = [
"@" + rebase_path(system_image_manifest_args, root_build_dir),
"--entry=meta/package=" + rebase_path(json, root_build_dir),
"--entry=data/static_packages=" +
rebase_path(pkgsvr_index[0], root_build_dir),
]
}
system_manifest_outputs = get_target_outputs(":system_image.manifest")
assert(boot_manifest == system_manifest_outputs[2])
pm_build_package("system_image.meta") {
visibility = [ ":*" ]
testonly = true
manifest = ":system_image.manifest"
package_name = "system_image"
}
blob_manifest = "$root_build_dir/${image_name}_blob.manifest"
collect_blob_manifest("blob.manifest") {
testonly = true
visibility = [ ":*" ]
outputs = [
blob_manifest,
]
deps = [
":base_packages",
":system_image.meta",
pkgfs_package_label,
]
}
zircon_tool_action("blob.blk") {
visibility = [ ":*" ]
testonly = true
deps = [
":blob.manifest",
]
blob_image_path = "$target_out_dir/$target_name"
blob_size_list = "$root_build_dir/${image_name}_blob.sizes"
outputs = [
blob_image_path,
]
depfile = blob_image_path + ".d"
inputs = [
blob_manifest,
]
tool = "blobfs"
args = [
"--depfile",
"--sizes",
rebase_path(blob_size_list, root_build_dir),
"--compress",
rebase_path(blob_image_path, root_build_dir),
"create",
"--manifest",
rebase_path(blob_manifest, root_build_dir),
]
}
generate_fvm("fvm.blk") {
# Referenced by guest_package.
testonly = true
output_name = "$target_out_dir/$target_name"
args = fvm_create_args
partitions = [
{
type = "blob"
dep = ":blob.blk"
},
]
}
action("devmgr_config.txt") {
visibility = [ ":*" ]
testonly = true
script = "//build/images/manifest.py"
outputs = [
"$target_out_dir/$target_name",
]
pkgfs = "bin/" + pkgfs_binary_name
pkgfs_label = pkgfs_package_label
pkgfs_pkg_out_dir = get_label_info(pkgfs_label, "target_out_dir") + "/" +
get_label_info(pkgfs_label, "name")
pkgfs_blob_manifest = "$pkgfs_pkg_out_dir/meta/contents"
system_image_merkleroot = "$target_out_dir/system_image.meta/meta.far.merkle"
deps = [
":system_image.meta",
pkgfs_label,
]
sources = [
pkgfs_blob_manifest,
system_image_merkleroot,
]
args = [
"--output=" + rebase_path(outputs[0], root_build_dir),
"--entry=devmgr.require-system=true",
"--contents",
"--rewrite=*=zircon.system.pkgfs.cmd={target}+{source}",
"--entry=${pkgfs}=" + rebase_path(system_image_merkleroot, root_build_dir),
"--no-contents",
"--reset-rewrite",
"--rewrite=*=zircon.system.pkgfs.file.{target}={source}",
"--manifest=" + rebase_path(pkgfs_blob_manifest, root_build_dir),
"--reset-rewrite",
]
foreach(entry, devmgr_config) {
args += [ "--entry=$entry" ]
}
}
zbi(image_name) {
metadata = {
# We insert a package barrier because the packages inside this ZBI
# shouldn't leak to targets that depend on the ZBI. For example,
# suppose we store this ZBI inside a package() that is assembled into
# another Fuchsia system. We don't want the parent system to incorporate
# the packages from the ZBI into its own package list.
package_barrier = []
config_package_barrier = []
if (defined(invoker.metadata)) {
forward_variables_from(invoker.metadata, [ "metadata" ])
}
}
testonly = true
deps = [
":devmgr_config.txt",
":fvm.blk",
":system_image.manifest",
]
inputs = [
boot_manifest,
zircon_kernel_zbi,
]
manifest = [
{
outputs = [
"config/devmgr",
]
sources = get_target_outputs(":devmgr_config.txt")
},
]
if (netboot) {
ramdisk_inputs = get_target_outputs(":fvm.blk")
}
}
}