# Copyright 2018 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

assert(is_fuchsia)

import("//build/config/chromecast_build.gni")
import("//build/config/fuchsia/config.gni")
import("//build/config/fuchsia/package.gni")
import("//build/config/sysroot.gni")
import("//build/util/generate_wrapper.gni")

blobstore_qcow_path = "$root_out_dir/fvm.blk.qcow2"

# Generates a script which deploys and executes a package on a device.
#
# Parameters:
#   package: The package() target which will be run.
#   package_name_override: Specifies the name of the generated package, if its
#       name is different than the |package| target name. This value must match
#       package_name_override in the |package| target.
#   package_deps: An array of [package, package_name_override] array pairs
#       which specify additional dependency packages to be installed
#       prior to execution.
#   runner_script: The runner script implementation to use, relative to
#       "build/fuchsia". Defaults to "exe_runner.py".
#   install_only: If true, executing the script will only install the package
#       on the device, but not run it.
template("fuchsia_package_runner") {
  forward_variables_from(invoker, [ "runner_script" ])

  if (defined(invoker.package_name_override)) {
    _pkg_shortname = invoker.package_name_override
  } else {
    _pkg_shortname = get_label_info(invoker.package, "name")
  }

  _pkg_dir = "$root_out_dir/gen/" + get_label_info(invoker.package, "dir") +
             "/" + _pkg_shortname
  _manifest_path = "$_pkg_dir/${_pkg_shortname}.archive_manifest"
  _package_path = "$_pkg_dir/${_pkg_shortname}.far"

  if (!defined(runner_script)) {
    runner_script = "//build/fuchsia/exe_runner.py"
  }

  generated_run_pkg_script_path = "$root_build_dir/bin/run_${_pkg_shortname}"
  generated_install_pkg_script_path =
      "$root_build_dir/bin/install_$_pkg_shortname"

  _generate_runner_target = "${target_name}__generate_runner"
  _generate_installer_target = "${target_name}__generate_installer"
  _generate_template = "${target_name}__generate_template"

  # Generates a script to install and optionally run a package.
  #
  # Parameters:
  #   |install_only|: If true, builds a script that only installs a package.
  #   |script_path|: The path of the script to generate.
  template(_generate_template) {
    generate_wrapper(target_name) {
      forward_variables_from(invoker,
                             [
                               "install_only",
                               "script_path",
                               "target",
                               "testonly",
                             ])

      executable = runner_script
      wrapper_script = script_path

      deps = [
        "//build/config/fuchsia:blobstore_extended_qcow2",
        invoker.package,
      ]

      if (defined(invoker.deps)) {
        deps += invoker.deps
      }

      data = [
        _manifest_path,
        "//build/fuchsia/",
        "//build/util/lib/",
        "//third_party/llvm-build/Release+Asserts/bin/llvm-symbolizer",
        "${qemu_root}/",
        "${fuchsia_sdk}/",
        "${boot_image_root}/",
      ]

      data_deps = [
        invoker.package,
      ]

      executable_args = []

      if (defined(invoker.package_deps)) {
        foreach(cur_package, invoker.package_deps) {
          deps += [ cur_package[0] ]
          dep_package_path =
              get_label_info(cur_package[0], "target_gen_dir") + "/" +
              cur_package[1] + "/" + cur_package[1] + ".far"
          _rebased_dep_package_path =
              rebase_path(dep_package_path, root_build_dir)
          executable_args += [
            "--package-dep",
            "@WrappedPath(${_rebased_dep_package_path})",
          ]
        }
      }

      _rebased_package_path = rebase_path(_package_path, root_build_dir)
      executable_args += [
        "--output-directory",
        "@WrappedPath(.)",
        "--target-cpu",
        target_cpu,
        "--package",
        "@WrappedPath(${_rebased_package_path})",
        "--package-name",
        _pkg_shortname,
      ]

      if (defined(invoker.use_test_server) && invoker.use_test_server) {
        executable_args += [ "--enable-test-server" ]
      }

      if (defined(install_only) && install_only) {
        executable_args += [ "--install-only" ]
      }
    }
  }

  target(_generate_template, _generate_runner_target) {
    forward_variables_from(invoker, "*")
    script_path = generated_run_pkg_script_path
  }

  target(_generate_template, _generate_installer_target) {
    forward_variables_from(invoker, "*")
    script_path = generated_install_pkg_script_path
    install_only = true
  }

  # Build the installer script, and the runner for non-|install_only| targets.
  group(target_name) {
    forward_variables_from(invoker, [ "testonly" ])
    deps = [
      ":${_generate_installer_target}",
    ]

    # Generate a runner script if the target is not install-only.
    if (!defined(invoker.install_only)) {
      deps += [ ":${_generate_runner_target}" ]
    }
  }
}
