| # 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/compiled_action.gni") | 
 | import("config.gni") | 
 |  | 
 | # Aggregates multiple SDKs into a single archive. | 
 | # | 
 | # Parameters | 
 | # | 
 | #   deps (required) | 
 | #     List of labels representing SDKs to merge. | 
 | #     A label may point to an `sdk` or a `merged_sdk` instance. | 
 |  | 
 | template("merged_sdk") { | 
 |   assert(defined(invoker.deps), "Must define a 'deps' parameter") | 
 |   assert(invoker.deps != [], "'deps' may not be empty") | 
 |  | 
 |   if (!build_sdk_archives) { | 
 |     # This template is a no-op if SDK archives are not emitted. | 
 |     group(target_name) { | 
 |       deps = invoker.deps | 
 |     } | 
 |   } else { | 
 |     index = 0 | 
 |     latest_archive = "" | 
 |     latest_step = "" | 
 |     foreach(dep, invoker.deps) { | 
 |       gen_dir = get_label_info(dep, "target_gen_dir") | 
 |       name = get_label_info(dep, "name") | 
 |       dep_archive = "$gen_dir/$name.tar.gz" | 
 |  | 
 |       if (index == 0) { | 
 |         latest_archive = dep_archive | 
 |       } else { | 
 |         merged_archive = "$target_gen_dir/$target_name.$index.tar.gz" | 
 |         step = "${target_name}_merge_${index}" | 
 |  | 
 |         compiled_action(step) { | 
 |           forward_variables_from(invoker, [ "testonly" ]) | 
 |  | 
 |           tool = "//build/sdk/tools/merge:merge_sdk" | 
 |  | 
 |           inputs = [ | 
 |             dep_archive, | 
 |             latest_archive, | 
 |           ] | 
 |  | 
 |           outputs = [ merged_archive ] | 
 |  | 
 |           args = [ | 
 |             "--base-archive", | 
 |             rebase_path(latest_archive), | 
 |             "--complement-archive", | 
 |             rebase_path(dep_archive), | 
 |             "--output-archive", | 
 |             rebase_path(merged_archive), | 
 |           ] | 
 |  | 
 |           if (index == 1) { | 
 |             public_deps = invoker.deps | 
 |           } else { | 
 |             public_deps = [ ":$latest_step" ] | 
 |           } | 
 |         } | 
 |  | 
 |         latest_archive = merged_archive | 
 |         latest_step = step | 
 |       } | 
 |  | 
 |       index = index + 1 | 
 |     } | 
 |  | 
 |     copy(target_name) { | 
 |       forward_variables_from(invoker, [ "testonly" ]) | 
 |  | 
 |       sources = [ latest_archive ] | 
 |  | 
 |       outputs = [ "$target_gen_dir/$target_name.tar.gz" ] | 
 |  | 
 |       public_deps = [ ":$latest_step" ] | 
 |     } | 
 |   } | 
 | } |