| # 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/fuchsia/zircon.gni") |
| import("//build/config/fuchsia/zircon_images.gni") |
| |
| # Merges manifests together to recreate an image manifest generated by the |
| # Zircon build. |
| # |
| # Parameters |
| # |
| # deps (required) |
| # List of targets generating a manifest. |
| # |
| # reference (optional) |
| # Path to the Zircon image manifest that this target is replicating. |
| |
| template("aggregate_manifest") { |
| assert(defined(invoker.deps), "Aggregate manifest needs dependencies.") |
| |
| manifest_target_name = "$target_name.manifest" |
| |
| final_manifest = "$target_out_dir/$target_name.unification.manifest" |
| |
| group_deps = [] |
| |
| # Merges all the dependent manifests together. |
| action(manifest_target_name) { |
| script = "//build/images/manifest.py" |
| |
| inputs = [] |
| |
| outputs = [ |
| final_manifest, |
| ] |
| |
| response_file_contents = [ |
| "--output", |
| rebase_path(outputs[0]), |
| "--unique", |
| ] |
| |
| foreach(dep, invoker.deps) { |
| out_dir = get_label_info(dep, "target_out_dir") |
| name = get_label_info(dep, "name") |
| manifest = "$out_dir/$name.unification.manifest" |
| inputs += [ manifest ] |
| response_file_contents += [ |
| "--manifest", |
| rebase_path(manifest), |
| ] |
| } |
| |
| args = [ "@{{response_file_name}}" ] |
| |
| deps = invoker.deps |
| } |
| group_deps += [ ":$manifest_target_name" ] |
| |
| if (defined(invoker.reference)) { |
| # Look for the reference manifest in the list of Zircon-supplied images. |
| reference = invoker.reference |
| reference_manifest = false |
| foreach(image, zircon_images) { |
| if (image.type == "manifest") { |
| if (image.name == reference) { |
| assert(reference_manifest == false, |
| "Duplicate manifest for $reference") |
| reference_manifest = "$zircon_root_build_dir/${image.path}" |
| } |
| } |
| } |
| assert(reference_manifest != false, |
| "Could not find manifest for $reference") |
| |
| normalize_target_name = "$target_name.normalize" |
| compare_target_name = "$target_name.compare" |
| normalized_manifest = "$target_gen_dir/$target_name.normalized_ref.txt" |
| |
| # The first step is to "rebase" the reference manifest so that its paths |
| # are also relative to the present build's root_build_dir. |
| action(normalize_target_name) { |
| script = "//build/images/manifest.py" |
| |
| inputs = [ |
| reference_manifest, |
| ] |
| |
| outputs = [ |
| normalized_manifest, |
| ] |
| |
| args = [ |
| "--output", |
| rebase_path(outputs[0]), |
| "--unique", |
| "--cwd", |
| rebase_path(zircon_root_build_dir, root_out_dir), |
| "--manifest", |
| rebase_path(inputs[0]), |
| ] |
| } |
| |
| # Verify that the generated and reference manifest are identical. |
| action(compare_target_name) { |
| script = "compare_manifests.py" |
| |
| inputs = [ |
| final_manifest, |
| normalized_manifest, |
| ] |
| |
| outputs = [ |
| "$target_out_dir/$target_name.success.stamp", |
| ] |
| |
| args = [ |
| "--generated", |
| rebase_path(final_manifest), |
| "--reference", |
| rebase_path(normalized_manifest), |
| "--stamp", |
| rebase_path(outputs[0]), |
| ] |
| |
| deps = [ |
| ":$manifest_target_name", |
| ":$normalize_target_name", |
| ] |
| } |
| |
| group_deps += [ ":$compare_target_name" ] |
| } |
| |
| group(target_name) { |
| public_deps = group_deps |
| } |
| } |