blob: 6812232c73d0b47d03a02ec17e4736442f9c01d2 [file] [log] [blame]
# Copyright 2018 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/fuchsia/zbi.gni")
import("//build/config/fuchsia/zircon.gni")
import("//build/images/manifest.gni")
import("//build/package.gni")
import("//garnet/build/pkgfs.gni")
guest_packages = [
get_label_info("//build/images:shell-commands", "label_no_toolchain"),
get_label_info("//garnet/bin/appmgr", "label_no_toolchain"),
get_label_info("//garnet/bin/guest/integration:guest_integration_tests_utils",
"label_no_toolchain"),
get_label_info("//garnet/bin/guest/pkg/zircon_guest:services_config",
"label_no_toolchain"),
get_label_info("//garnet/bin/run", "label_no_toolchain"),
get_label_info("//garnet/bin/sysmgr", "label_no_toolchain"),
get_label_info("//garnet/bin/trace", "label_no_toolchain"),
get_label_info("//garnet/bin/vsock_service:vsock_service",
"label_no_toolchain"),
get_label_info(pkgfs_package_label, "label_no_toolchain"),
]
# The pkgsvr index is a manifest mapping `package_name/package_version` to
# the merkleroot of the package's meta.far file.
action("pkgsvr_index") {
visibility = [ ":*" ]
testonly = true
script = "//build/images/manifest.py"
args = [ "--contents" ]
outputs = [
"$target_out_dir/$target_name",
]
args += [ "--output=" + rebase_path(outputs[0], root_build_dir) ]
sources = []
deps = []
foreach(pkg_label, guest_packages) {
# Find the response file written by package().
pkg_target_name = get_label_info(pkg_label, "name")
pkg_target_out_dir = get_label_info(pkg_label, "target_out_dir")
pkg_rspfile = "$pkg_target_out_dir/${pkg_target_name}.pkgsvr_index.rsp"
deps += [ "${pkg_label}.pkgsvr_index.rsp" ]
sources += [ pkg_rspfile ]
args += [ "@" + rebase_path(pkg_rspfile, root_build_dir) ]
}
}
boot_manifest = "$target_out_dir/boot.manifest"
generate_manifest("guest.manifest") {
visibility = [ ":*" ]
testonly = true
bootfs_manifest = boot_manifest
bootfs_zircon_groups = "misc,test"
args = []
deps = []
sources = []
foreach(pkg_label, guest_packages) {
# Find the response file written by package().
pkg_target_name = get_label_info(pkg_label, "name")
pkg_target_out_dir = get_label_info(pkg_label, "target_out_dir")
pkg_system_rsp = "$pkg_target_out_dir/${pkg_target_name}.system.rsp"
deps += [ pkg_label ]
sources += [ pkg_system_rsp ]
args += [ "@" + rebase_path(pkg_system_rsp, root_build_dir) ]
}
json = "guest_meta_package.json"
sources += [ json ]
args += [ "--entry=meta/package=" + rebase_path(json, root_build_dir) ]
# Add the static packages (pkgsvr) index.
deps += [ ":pkgsvr_index" ]
pkgsvr_index = "$target_out_dir/pkgsvr_index"
sources += [ pkgsvr_index ]
args += [ "--entry=data/static_packages=" +
rebase_path(pkgsvr_index, root_build_dir) ]
}
# Generate, sign, and seal the package file.
pm_build_package("guest.meta") {
visibility = [ ":*" ]
testonly = true
manifest = ":guest.manifest"
}
guest_blob_manifest = "$root_build_dir/guest_blob.manifest"
action("guest_blob.manifest") {
visibility = [ ":*" ]
testonly = true
deps = [
":guest.manifest",
":guest.meta",
]
outputs = [
guest_blob_manifest,
]
depfile = guest_blob_manifest + ".d"
guest_manifest_outputs = get_target_outputs(":guest.manifest")
guest_manifest = guest_manifest_outputs[0]
inputs = [
guest_manifest,
]
script = "//build/images/blob_manifest.py"
args = [ "@{{response_file_name}}" ]
response_file_contents = [
"--depfile=" + rebase_path(depfile, root_build_dir),
"--output=" + rebase_path(guest_blob_manifest, root_build_dir),
"--input=" +
rebase_path("$target_out_dir/guest.meta/blobs.json", root_build_dir),
]
foreach(pkg_label, guest_packages) {
pkg_target_name = get_label_info(pkg_label, "name")
pkg_target_out_dir = get_label_info(pkg_label, "target_out_dir")
pkg_blobs_rsp = "$pkg_target_out_dir/${pkg_target_name}.blobs.rsp"
deps += [ "${pkg_label}.blobs.rsp" ]
inputs += [ pkg_blobs_rsp ]
response_file_contents +=
[ "@" + rebase_path(pkg_blobs_rsp, root_build_dir) ]
}
}
zircon_tool_action("guest_blob.blk") {
visibility = [ ":*" ]
testonly = true
deps = [
":guest_blob.manifest",
]
blob_image_path = "$target_out_dir/$target_name"
outputs = [
blob_image_path,
]
depfile = blob_image_path + ".d"
inputs = [
guest_blob_manifest,
]
tool = "blobfs"
args = [
"--depfile",
rebase_path(blob_image_path, root_build_dir),
"create",
"--manifest",
rebase_path(guest_blob_manifest, root_build_dir),
]
}
zircon_tool_action("guest_fvm") {
testonly = true
fvm = "$root_out_dir/guest_fvm.blk"
outputs = [
fvm,
]
tool = "fvm"
sources = []
deps = [
":guest_blob.blk",
]
foreach(label, deps) {
sources += get_target_outputs(label)
}
args = [
rebase_path(fvm, root_build_dir),
"create",
"--blob",
] + rebase_path(sources, root_build_dir)
}
# Generate the /boot/config/devmgr file.
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 + ".meta"
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/guest.meta/meta.far.merkle"
deps = [
":guest.manifest",
":guest.meta",
pkgfs_label,
]
sources = [
boot_manifest,
pkgfs_blob_manifest,
system_image_merkleroot,
]
args = [
"--output=" + rebase_path(outputs[0], root_build_dir),
# Start with the fixed options.
"--entry=devmgr.require-system=true",
# Add the pkgfs command line, embedding the merkleroot of the system image.
"--contents",
"--rewrite=*=zircon.system.pkgfs.cmd={target}+{source}",
"--entry=${pkgfs}=" + rebase_path(system_image_merkleroot, root_build_dir),
"--no-contents",
"--reset-rewrite",
# Embed the pkgfs blob manifest with the "zircon.system.pkgfs.file."
# prefix on target file names.
"--rewrite=*=zircon.system.pkgfs.file.{target}={source}",
"--manifest=" + rebase_path(pkgfs_blob_manifest, root_build_dir),
"--reset-rewrite",
"--include=bin/devhost",
"--rewrite=bin/devhost=devhost.asan.strict=false",
"--manifest=" + rebase_path(boot_manifest, root_build_dir),
]
}
zbi("guest") {
testonly = true
deps = [
":devmgr_config.txt",
":guest.manifest",
]
inputs = [
"${zircon_build_dir}/zircon.zbi",
boot_manifest,
]
manifest = [
{
outputs = [
"config/devmgr",
]
sources = get_target_outputs(":devmgr_config.txt")
},
]
cmdline = []
cmdline_inputs = []
}