blob: 13c062d736be8b7fe4ff15b099308161e6ed659c [file] [log] [blame]
# 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` instance.
template("merged_sdk") {
assert(defined(invoker.deps), "Must define a 'deps' parameter")
assert(invoker.deps != [], "'deps' may not be empty")
dep_count = 0
foreach(dep, invoker.deps) {
dep_count = dep_count + 1
}
index = 0
foreach(dep, invoker.deps) {
export_dir = "${root_out_dir}/sdk/exported"
name = get_label_info(dep, "name")
dep_dir = "${export_dir}/$name"
dep_gen_dir = get_label_info(dep, "target_gen_dir")
dep_stamp = "$dep_gen_dir/$name.exported"
_outputs = []
if (index == 0) {
latest_dir = dep_dir
latest_stamp = dep_stamp
} else {
step = "${target_name}_merge_${index}"
# Produce an archive only on the last step. Intermediate merged SDKs are
# symlink forests, like the input exported SDKs, to save disk space.
merged = "$target_gen_dir/$target_name.$index"
merged_stamp = "$merged.stamp"
_outputs += [ merged_stamp ]
if (index < dep_count - 1) {
output_flag = "--output-directory"
} else {
output_flag = "--output-archive"
merged += ".tar.gz"
_outputs += [ merged ]
}
action(step) {
forward_variables_from(invoker, [ "testonly" ])
#TODO(b/222339823): Switch to Rust merge tool when fixed.
script = "//scripts/sdk/merger/merge.py"
sources = [
dep_stamp,
latest_stamp,
]
outputs = _outputs
depfile = merged_stamp + ".d"
args = [
"--first-directory",
rebase_path(latest_dir, root_build_dir),
"--second-directory",
rebase_path(dep_dir, root_build_dir),
output_flag,
rebase_path(merged, root_build_dir),
"--stamp-file",
rebase_path(merged_stamp, root_build_dir),
"--depfile",
rebase_path(depfile, root_build_dir),
]
if (index == 1) {
public_deps = invoker.deps
} else {
public_deps = [ ":$latest_step" ]
}
}
latest_dir = merged
latest_stamp = merged_stamp
latest_step = step
}
index = index + 1
}
copy(target_name) {
forward_variables_from(invoker, [ "testonly" ])
output_archive = "${root_out_dir}/sdk/archive/${target_name}.tar.gz"
sources = [ latest_dir ]
outputs = [ output_archive ]
public_deps = [ ":$latest_step" ]
metadata = {
sdk_archives = [
{
name = target_name
os = current_os
cpu = current_cpu
label = get_label_info(":$target_name", "label_with_toolchain")
path = rebase_path(output_archive, root_build_dir)
},
]
}
}
}