# 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/config.gni")
import("//build/packages/prebuilt_package_with_flavors.gni")
import("//src/chromium/build_args.gni")

# Generates a prebuilt_package_with_flavors target which allows
# choosing which flavor to use for Chromium packages.
#
# Parameters:
#   prebuilt_archive_base_path: Base path for the prebuilt archive.
#   debug_archive_base_path: Base path for the debug archive.
#   custom_package_path: The path to the package inside a custom chromium
#       build output directory.
#   selections (optional): Flavor choice. This allows flavor to be changed based
#       on other build args.

template("generate_flavors") {
  prebuilt_package_with_flavors("${target_name}_pkg") {
    forward_variables_from(invoker,
                           [
                             "selections",
                             "testonly",
                           ])
    package_name = invoker.target_name
    visibility = [ rebase_path(":${invoker.target_name}") ]
    default = "release"
    flavors = [
      {
        name = "release"
        archive = "${invoker.prebuilt_archive_base_path}/arch/$target_cpu/${invoker.target_name}.far"
        production_safe = true
        debug_archive = "${invoker.debug_archive_base_path}/${invoker.target_name}.symbols.tar.bz2"
      },
      {
        name = "canary"
        archive = "${invoker.prebuilt_archive_base_path}_latest/arch/$target_cpu/${invoker.target_name}.far"
        production_safe = true
      },
      {
        name = "custom"
        archive = "$chromium_build_dir${invoker.custom_package_path}"
      },
    ]
  }
}

# Generates a config for Chromium packages. See //build/config.gni for
# documentation of the parameters below.

template("generate_config") {
  config_data("${target_name}_config") {
    forward_variables_from(invoker,
                           [
                             "for_pkg",
                             "outputs",
                             "sources",
                             "testonly",
                           ])
    visibility = [ rebase_path(":${invoker.target_name}") ]
  }
}

# Helper template that generates a prebuilt_package_with_flavors target and
# a config_data target for a given Chromium package. List of parameters is
# the combined parameters in the generate_config and generate_flavors templates.

template("generate_pkg_and_config") {
  generate_flavors(target_name) {
    forward_variables_from(invoker,
                           [
                             "custom_package_path",
                             "debug_archive_base_path",
                             "prebuilt_archive_base_path",
                             "selections",
                             "testonly",
                           ])
  }
  generate_config(target_name) {
    forward_variables_from(invoker,
                           [
                             "for_pkg",
                             "outputs",
                             "sources",
                             "testonly",
                           ])
  }
}
