| # Copyright 2022 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/bazel/bazel_workspace.gni") |
| import("//build/images/args.gni") |
| import("//build/python/python_action.gni") |
| |
| assert(is_fuchsia, |
| "Assembly templates can only be used with `$default_toolchain`.") |
| |
| # Collect a newline-delimited text file of the package manifests for all |
| # packages in a given package set from the `ffx assembly product` call. |
| # |
| # Arguments: |
| # |
| # package_set (string, required) |
| # Which package set to get. Valid values are: |
| # base |
| # cache |
| # on_demand |
| # |
| # assembly_label (GN label, required) |
| # Label for the assembled_system() invocation to use, e.g. //build/images/fuchsia. |
| # |
| # is_bazel_assembled (bool, required) |
| # Whether the assembly label corresponds to a Bazel-assembled or GN-assembled product. |
| # Typically you'd want this value to be the same as `use_bazel_images_only`. |
| # |
| # namespace (string, optional) |
| # The effective namespace used by the system label. |
| # Defaults to the 'name' of the label in 'assembly_label'. |
| # Only applicable for GN/non-Bazel assembly. |
| # |
| # outputs (list of paths, required) |
| # Usual GN meaning, expects a single file to write to. |
| # |
| # testonly |
| # visibility |
| template("packages_from_product_assembler") { |
| assert( |
| defined(invoker.assembly_label), |
| "must define a `assembly_label` argument which points to an assembled_system() invocation") |
| assert(defined(invoker.outputs), "must define `outputs`") |
| assert(defined(invoker.is_bazel_assembled), |
| "must define `is_bazel_assembled`") |
| assert(!invoker.is_bazel_assembled || !defined(invoker.namespace), |
| "`namespace` is not allowed for Bazel-assembled products!") |
| |
| assert( |
| defined(invoker.package_set), |
| "must define a `package_set` argument specifying which package set to list") |
| valid_package_sets = [ |
| "base", |
| "cache", |
| "on_demand", |
| ] |
| assert(valid_package_sets + [ invoker.package_set ] - |
| [ invoker.package_set ] != valid_package_sets, |
| "the `package_set` argument must be one of: ${valid_package_sets}") |
| |
| _assembly_target_name = get_label_info(invoker.assembly_label, "name") |
| _assembly_dir = get_label_info(invoker.assembly_label, "dir") |
| _assembly_namespace = _assembly_target_name |
| _is_bazel_assembled = invoker.is_bazel_assembled |
| if (defined(invoker.namespace)) { |
| _assembly_namespace = invoker.namespace |
| } |
| |
| if (_is_bazel_assembled) { |
| _assembly_gen_dir = get_label_info(invoker.assembly_label, "target_out_dir") |
| _assembly_manifest = "${_assembly_gen_dir}/${_assembly_target_name}_product_assembly/image_assembly.json" |
| _assembly_dep = "${_assembly_dir}:${_assembly_namespace}_product_assembly" |
| } else { |
| _assembly_out_dir = get_label_info(invoker.assembly_label, "target_out_dir") |
| _assembly_manifest = |
| "${_assembly_out_dir}/${_assembly_target_name}/image_assembly.json" |
| _assembly_dep = "${_assembly_dir}:${_assembly_namespace}.product_assembler" |
| } |
| |
| python_action(target_name) { |
| forward_variables_from(invoker, |
| [ |
| "outputs", |
| "testonly", |
| "visibility", |
| ]) |
| binary_label = "//build/assembly/scripts:packages_from_product_assembler" |
| args = [ |
| "--assembly-manifest", |
| rebase_path(_assembly_manifest, root_build_dir), |
| "--package-set", |
| invoker.package_set, |
| "--output", |
| rebase_path(outputs[0], root_build_dir), |
| ] |
| if (_is_bazel_assembled) { |
| args += [ |
| "--bazel-execroot", |
| rebase_path(bazel_execroot, root_build_dir), |
| ] |
| } |
| inputs = [ _assembly_manifest ] |
| deps = [ _assembly_dep ] |
| } |
| } |