| # Copyright 2021 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_manifests_list.gni") |
| import("//build/dist/distribution_manifest.gni") |
| import("//build/dist/resource.gni") |
| import("//build/images/args.gni") |
| import("//build/info/info.gni") |
| import("//build/zbi/kernel_cmdline.gni") |
| |
| # Generates an Image Assembly Config to be consumed by the Image Assembler. |
| # |
| # Arguments |
| # output_path (required) |
| # [path] Product config output location |
| # |
| # kernel_image (required) |
| # [label] Kernel to add to the ZBI. |
| # |
| # base_packages (optional) |
| # [list of labels] The packages to include in the base package set. |
| # |
| # cache_packages (optional) |
| # [list of labels] The packages to cache in the images. |
| # |
| # bootfs_labels (optional) |
| # [list of labels] The objects installed on the bootfs partition of the |
| # generated ZBI. |
| # |
| # bootfs_package_labels (optional) |
| # [list of labels] The packages installed on the bootfs partition of the |
| # generated ZBI as meta.fars and content-id'd blobs. |
| # |
| # extra_base_deps (optional) |
| # [list of labels] The packages whose files should be added to the Base |
| # Package. |
| # |
| # boot_args (optional) |
| # [list of strings] Boot arguments to add to the devmgr_config. |
| # |
| # cmdline (optional) |
| # [list of strings] Kernel command line arguments to add to the ZBI. |
| # |
| # cmdline_deps (optional) |
| # [list of labels] Dependencies with metadata including additional kernel |
| # command arguments to add to the ZBI. |
| # |
| template("generated_image_assembly_config") { |
| assert(defined(invoker.output_path), "Need to define output_path") |
| assert(defined(invoker.kernel_image), "Need to define kernel_image") |
| |
| # Set the defaults for several arguments. |
| base_packages = [] |
| if (defined(invoker.base_packages)) { |
| base_packages += invoker.base_packages |
| } |
| |
| cache_packages = [] |
| if (defined(invoker.cache_packages)) { |
| cache_packages += invoker.cache_packages |
| } |
| |
| bootfs_labels = [] |
| if (defined(invoker.bootfs_labels)) { |
| bootfs_labels += invoker.bootfs_labels |
| } |
| |
| bootfs_package_labels = [] |
| if (defined(invoker.bootfs_package_labels)) { |
| bootfs_package_labels += invoker.bootfs_package_labels |
| } |
| |
| extra_base_deps = [] |
| if (defined(invoker.extra_base_deps)) { |
| extra_base_deps += invoker.extra_base_deps |
| } |
| |
| boot_args = [] |
| if (defined(invoker.boot_args)) { |
| boot_args += invoker.boot_args |
| } |
| |
| # Labels used in this file. |
| labels = { |
| base_package_list = "${target_name}_package_manifest_list.base" |
| cache_package_list = "${target_name}_package_manifest_list.cache" |
| bootfs_package_list = "${target_name}_bootfs_package_list" |
| extra_base_list = "${target_name}_package_manifest_list.extra_base" |
| extra_base_deps_list = |
| "${target_name}_package_manifest_list.extra_base_deps" |
| kernel_image_metadata = "${target_name}_kernel_image_metadata" |
| kernel_cmdline_args = "${target_name}_kernel_cmdline_args" |
| bootfs_entries_metadata = "${target_name}_bootfs_entries_metadata" |
| boot_args = "${target_name}_boot_args" |
| } |
| |
| # Files produced by targets in this file. |
| files = { |
| base_package_list = "$target_out_dir/package_lists/${target_name}_base" |
| cache_package_list = "$target_out_dir/package_lists/${target_name}_cache" |
| extra_base_list = "$target_out_dir/package_lists/${target_name}_extra_base" |
| bootfs_package_list = "$target_out_dir/package_lists/${target_name}_bootfs" |
| extra_base_deps_list = |
| "$target_out_dir/package_lists/${target_name}_extra_base_deps" |
| kernel_image_metadata = |
| "$target_out_dir/${target_name}_kernel_image.gn_meta.json" |
| kernel_cmdline_args = |
| "$target_out_dir/${target_name}_kernel_cmdline_args.json" |
| bootfs_entries_metadata = |
| "$target_out_dir/${target_name}_bootfs_entries.gn_meta.json" |
| boot_args = "$target_out_dir/${target_name}_boot_args" |
| } |
| |
| # Construct a list of Base packages to add to the image assembly config. |
| package_manifests_list(labels.base_package_list) { |
| forward_variables_from(invoker, |
| [ |
| "testonly", |
| "visibility", |
| ]) |
| filename = files.base_package_list |
| deps = base_packages |
| } |
| |
| # Construct a list of Cache packages to add to the image assembly config. |
| package_manifests_list(labels.cache_package_list) { |
| forward_variables_from(invoker, |
| [ |
| "testonly", |
| "visibility", |
| ]) |
| filename = files.cache_package_list |
| deps = cache_packages |
| } |
| |
| # Construct a list of extra packages whose files should be added to the Base Package. |
| package_manifests_list(labels.extra_base_list) { |
| forward_variables_from(invoker, |
| [ |
| "testonly", |
| "visibility", |
| ]) |
| filename = files.extra_base_list |
| deps = extra_base_deps |
| } |
| |
| # Find all the extra system dependencies in the Base packages list. |
| # This list mentions several extra packages to add to the Base Package. |
| generated_file(labels.extra_base_deps_list) { |
| forward_variables_from(invoker, |
| [ |
| "testonly", |
| "visibility", |
| ]) |
| |
| data_keys = [ "system_image_extra_package_manifest" ] |
| walk_keys = [ "system_image_extra_package_manifest_barrier" ] |
| outputs = [ files.extra_base_deps_list ] |
| output_conversion = "json" |
| deps = base_packages |
| } |
| |
| # Create a list of boot arguments to add to devmgr_config. |
| generated_file(labels.boot_args) { |
| forward_variables_from(invoker, |
| [ |
| "testonly", |
| "visibility", |
| ]) |
| |
| outputs = [ files.boot_args ] |
| output_conversion = "json" |
| contents = boot_args |
| } |
| |
| # Find the kernel image metadata, which includes the location of the assembled kernel ZBI. |
| generated_file(labels.kernel_image_metadata) { |
| forward_variables_from(invoker, |
| [ |
| "testonly", |
| "visibility", |
| ]) |
| |
| data_keys = [ "images" ] |
| outputs = [ files.kernel_image_metadata ] |
| output_conversion = "json" |
| deps = [ invoker.kernel_image ] |
| } |
| |
| # Accumulate the list of cmdline dependencies by first taking the |
| # directly-specified arguments, creating a new metadata target, and adding it |
| # to the list of all metadata targets, then second walking the metadata to |
| # construct the final list. |
| cmdline_deps = [] |
| if (defined(invoker.cmdline)) { |
| kernel_cmdline("${target_name}_extra_cmdline") { |
| args = invoker.cmdline |
| } |
| cmdline_deps += [ ":${target_name}_extra_cmdline" ] |
| } |
| if (defined(invoker.cmdline_deps)) { |
| cmdline_deps += invoker.cmdline_deps |
| } |
| |
| generated_file(labels.kernel_cmdline_args) { |
| forward_variables_from(invoker, |
| [ |
| "testonly", |
| "visibility", |
| ]) |
| |
| data_keys = [ "zbi_config_entry" ] |
| walk_keys = [ "zbi_input_barrier" ] |
| outputs = [ files.kernel_cmdline_args ] |
| output_conversion = "json" |
| deps = cmdline_deps |
| } |
| |
| # Find all the files to add to BootFS. |
| distribution_manifest(labels.bootfs_entries_metadata) { |
| forward_variables_from(invoker, |
| [ |
| "testonly", |
| "visibility", |
| ]) |
| |
| outputs = [ files.bootfs_entries_metadata ] |
| deps = bootfs_labels |
| } |
| |
| # Construct a list of bootfs packages to add to the image assembly config. |
| # Ignores any fuchsia_driver_packages and fuchsia_shell_packages |
| package_manifests_list(labels.bootfs_package_list) { |
| forward_variables_from(invoker, |
| [ |
| "testonly", |
| "visibility", |
| ]) |
| filename = files.bootfs_package_list |
| deps = bootfs_package_labels |
| } |
| |
| action(target_name) { |
| forward_variables_from(invoker, |
| [ |
| "testonly", |
| "visibility", |
| ]) |
| script = "//build/assembly/scripts/generated_image_assembly_config.py" |
| |
| outputs = [ invoker.output_path ] |
| inputs = [ |
| build_info_files.minimum_utc_stamp, |
| files.base_package_list, |
| files.cache_package_list, |
| files.extra_base_list, |
| files.extra_base_deps_list, |
| files.kernel_image_metadata, |
| files.kernel_cmdline_args, |
| files.boot_args, |
| files.bootfs_entries_metadata, |
| files.bootfs_package_list, |
| ] |
| |
| deps = [ |
| ":${labels.base_package_list}", |
| ":${labels.boot_args}", |
| ":${labels.bootfs_entries_metadata}", |
| ":${labels.bootfs_package_list}", |
| ":${labels.cache_package_list}", |
| ":${labels.extra_base_deps_list}", |
| ":${labels.extra_base_list}", |
| ":${labels.kernel_cmdline_args}", |
| ":${labels.kernel_image_metadata}", |
| "//build/info:latest-commit-date", |
| ] |
| |
| args = [ |
| "--base-packages-list", |
| rebase_path(files.base_package_list, root_build_dir), |
| "--cache-packages-list", |
| rebase_path(files.cache_package_list, root_build_dir), |
| "--extra-files-packages-list", |
| rebase_path(files.extra_base_list, root_build_dir), |
| "--extra-deps-files-packages-list", |
| rebase_path(files.extra_base_deps_list, root_build_dir), |
| "--kernel-image-metadata", |
| rebase_path(files.kernel_image_metadata, root_build_dir), |
| "--kernel-cmdline", |
| rebase_path(files.kernel_cmdline_args, root_build_dir), |
| "--kernel-clock-backstop", |
| rebase_path(build_info_files.minimum_utc_stamp, root_build_dir), |
| "--boot-args", |
| rebase_path(files.boot_args, root_build_dir), |
| "--bootfs-entries", |
| rebase_path(files.bootfs_entries_metadata, root_build_dir), |
| "--bootfs-packages-list", |
| rebase_path(files.bootfs_package_list, root_build_dir), |
| "--output", |
| rebase_path(invoker.output_path, root_build_dir), |
| ] |
| |
| metadata = { |
| # We insert these barriers to prevent the dependencies from including |
| # files "higher up" in the dependency chain. |
| package_barrier = [] |
| config_package_barrier = [] |
| distribution_entries_barrier = [] |
| } |
| } |
| } |