blob: 71f2203b80bb9b94e11d99df844c171b3bf9ce27 [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/assembly/package_list.gni")
import("//build/board.gni")
import("//build/compiled_action.gni")
import("//build/component/component_id_index.gni")
import("//build/config.gni")
import("//build/config/clang/clang.gni")
import("//build/dist/fini_manifest.gni")
import("//build/drivers/driver_manifest.gni")
import("//build/images/args.gni")
import("//build/images/custom_signing.gni")
import("//build/images/paths.gni")
import("//build/images/shell_commands.gni")
import("//build/images/size_checker/size_checker_input.gni")
import("//build/images/vbmeta.gni")
import("//build/images/vboot/vboot.gni")
import("//build/info/info.gni")
import("//build/product.gni")
import("//build/sdk/config.gni")
import("//build/security.gni")
import("//build/zbi/zbi_input.gni")
import("//build/zircon/tools.gni")
assert(current_toolchain == default_toolchain,
"//build/images/* are only valid in the Fuchsia toolchain")
assert(
bootfs_only == use_bringup_assembly,
"use_bringup_assembly is replacing bootfs_only, and MUST always be the same value")
# This is a group that contains the one-and-only assembly implementation. It
# can be used in contexts that need either bringup or the full-fuchsia assembly
# implementation's outputs.
#
# If a target requires the outputs of the full-fuchsia assembly implementation,
# it should directly use it (//build/images/fuchsia).
group("main_assembly") {
testonly = use_bringup_assembly || fuchsia_zbi_testonly
public_deps = [ labels.images ]
}
# Dependencies for all image targets referenced by paver_targets, i.e., the
# images needed by the generated pave scripts.
default_image_deps = [ labels.images ]
board_name_file = "$root_build_dir/board_name"
write_file(board_name_file, "${board_name}")
###
### Zircon Boot Images
###
# Used to populate image_paths.sh with the right values to point to the QEMU kernel.
group("qemu-kernel") {
metadata = {
image_paths = [ "IMAGE_QEMU_KERNEL_RAW=" +
rebase_path(files.qemu_kernel, root_build_dir) ]
}
deps = [ labels.qemu_kernel ]
}
default_image_deps += [ ":qemu-kernel" ]
# This action runs a script that checks all vtables in fuchsia binaries are
# in readonly data.
action("check_vtables_in_rodata") {
testonly = true
hermetic_deps = false
script = "//scripts/clang/check_vtable_rodata.py"
outputs = [ "$root_build_dir/$target_name" ]
depfile = "$root_build_dir/$target_name.d"
# Ensure that all fuchsia binaries listed in `binaries.json` are created
# first.
deps = [ labels.images ]
args = [
# Ignore these specific libunwind symbols for now because these are from
# the libwundind prebuilts used by rust which we do not currently build
# with relative vtables.
"--exclude",
"vtable for libunwind::UnwindCursor<libunwind::LocalAddressSpace, libunwind::Registers_x86_64>",
"--exclude",
"vtable for libunwind::UnwindCursor<libunwind::LocalAddressSpace, libunwind::Registers_arm64>",
"--readelf",
"$rebased_clang_prefix/llvm-readelf",
# Write to a file.
"-o",
rebase_path(outputs[0], root_build_dir),
# Run in `fuchsia` mode, which looks for `binaries.json` in the provided
# output directory.
"fuchsia",
# Point to the output directory.
rebase_path("$root_build_dir", root_build_dir),
"--depfile",
rebase_path(depfile, root_build_dir),
]
}
group("fvm.sparse.blk") {
testonly = fuchsia_zbi_testonly
public_deps = [ labels.images ]
}
group("fvm.blob.sparse.blk") {
testonly = fuchsia_zbi_testonly
public_deps = [ labels.images ]
}
group("fvm.fastboot.blk") {
testonly = fuchsia_zbi_testonly
public_deps = [ labels.images ]
}
group("fuchsia") {
testonly = fuchsia_zbi_testonly
public_deps = [ labels.images ]
}
group("fuchsia.vbmeta") {
testonly = fuchsia_zbi_testonly
public_deps = [ labels.images ]
}
# Pseudo-target to record information about the sizes of filesystems assembled
# during the build for later analysis.
# TODO(fxbug.dev/81871): Only include this for builds that generate blobfs
# once this targets is no longer hardcoded in infra.
group("record_filesystem_sizes") {
testonly = true
if (!use_bringup_assembly) {
deps = [ "//build/images/sizes:elf_sizes.json" ]
}
}
default_image_deps += [ "//build/images/flash" ]
# If a GPT image was specified, make it available as a build artifact.
if (gpt_image != "") {
copy("gpt") {
testonly = true
sources = [ rebase_path(gpt_image, root_build_dir) ]
outputs = [ "$root_out_dir/gpt.bin" ]
metadata = {
images = [
{
label = get_label_info(":gpt", "label_with_toolchain")
archive = true
name = "gpt"
path = "gpt.bin"
type = "bin"
},
]
image_paths = [ "IMAGE_GPT=gpt.bin" ]
}
}
default_image_deps += [ ":gpt" ]
}
default_image_deps += [ "//build/images/tools:board_tools" ]
default_image_deps += [ ":fastboot_manifest" ]
default_image_deps += [ recovery_label ]
# Build the UEFI disk image.
# GCE, a consumer of this image, requires it to be named disk.raw
uefi_disk_path = "$target_out_dir/disk.raw"
mkfs_label = "//zircon/third_party/uapp/mkfs-msdosfs($host_toolchain)"
mkfs_out_dir = get_label_info(mkfs_label, "root_out_dir")
mkfs_bin = "$mkfs_out_dir/mkfs-msdosfs"
if (!use_bringup_assembly) {
fvm_tool_target = "//src/storage/bin/fvm($host_toolchain)"
fvm_tool_path = get_label_info(fvm_tool_target, "root_out_dir") + "/fvm"
}
compiled_action("uefi-disk") {
no_output_dir_leaks = false
deps = [
"zedboot",
"//src/firmware/gigaboot:bootloader(//src/firmware/gigaboot:efi_$target_cpu)",
labels.images,
mkfs_label,
]
testonly = true
tool = "//tools/make-fuchsia-vol"
inputs = [ mkfs_bin ]
bootloader_path = "efi_${target_cpu}/boot${target_cpu}.efi"
if (target_cpu == "arm64") {
bootloader_path = "efi_${target_cpu}/bootaa64.efi"
}
args = [
"-fuchsia-build-dir",
rebase_path("$root_build_dir"),
"-arch",
target_cpu,
"-bootloader",
bootloader_path,
"-resize",
"10000000000", # 10GB
]
if (use_bringup_assembly) {
args += [ "-ramdisk-only" ]
} else {
inputs += [
fvm_tool_path,
files.minfs,
# TODO(fxbug.dev/82077): Switch this to the new path the uefi script is
# switched over to using it (or taking it as an argument).
files.old_blobfs_path,
]
deps += [
"//src/storage/bin/fvm:fvm(//build/toolchain:host_x64)",
labels.images,
]
}
args += [ rebase_path(uefi_disk_path) ]
outputs = [ uefi_disk_path ]
metadata = {
images = [
{
label = get_label_info(":$target_name", "label_with_toolchain")
archive = false
name = "uefi-disk"
path = rebase_path(uefi_disk_path, root_build_dir)
type = "blk"
},
]
}
}
group("images") {
testonly = true
deps = [
":default-images",
"//build/images/archive:build_args_metadata",
]
if (defined(labels.images_netboot)) {
deps += [ labels.images_netboot ]
}
}
# The default-images target is a dependency of the top level default
# target when appropriate, and contains the minimum set of images that
# are typical given the requested build configuration.
group("default-images") {
testonly = true
deps = [
":qemu-kernel",
"//build/images/flash:fastboot_manifest",
"//build/images/flash:flash_script",
"//build/images/tools:fastboot",
recovery_label,
]
if (size_checker_input != {
}) {
# Size checks only make sense when use_bringup_assembly is false, since
# they require system images in addition to the ZBI.
deps += [ "size_checker:size_report.json" ]
}
if (recovery_is_zedboot) {
deps += [
"//build/images/archive:paver-script",
"//build/images/archive:zedboot-script",
"//build/images/tools:bootserver",
]
}
if (build_uefi_disk) {
deps += [ ":uefi-disk" ]
}
if (enable_netboot) {
deps += [ "archive:netboot-script" ]
}
# TODO(fxbug.dev/46415): The build graph for "bringup" (use_bringup_assembly) MUST only
# contain one zircon-a metadata target, which means that anything
# reaching fuchsia.zbi must be excluded from the build graph.
if (!use_bringup_assembly) {
deps += [
":record_filesystem_sizes",
"//build/images/updates",
]
if (!build_sdk_archives) {
deps += [ "//build/images/flash:product_metadata" ]
}
} else {
deps += [ "//build/images/archive:fastboot-boot-script" ]
}
if (check_vtables_in_rodata) {
deps += [ ":check_vtables_in_rodata" ]
}
if (build_usb_installer) {
deps += [ "//build/installer_images" ]
}
}
generated_file("image_paths") {
testonly = true
outputs = [ "$root_build_dir/image_paths.sh" ]
output_conversion = "list lines"
data_keys = [ "image_paths" ]
deps = [ ":images" ]
}