# Copyright 2018 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("//src/sys/build/components.gni")

# Defines a guest package.
#
# Parameters
#   zircon (string, optional)
#     Path to a Zircon kernel. Either "zircon" or "linux" must be specified.
#   linux (string, optional)
#     Path to a Linux kernel. Either "zircon" or "linux" must be specified.
#   ramdisk (string, optional)
#     Path to a ramdisk file to be loaded into the guest.
#   cmdline (string, optional)
#     Kernel cmdline string.
#   dtb_overlay (string, optional)
#     Path to a DTB overlay to be loaded for a Linux kernel.
#   block_devices (array, optional)
#     List of block devices to use.
#
template("guest_package") {
  assert(defined(invoker.zircon) || defined(invoker.linux), "")

  guest_config_target_name = "${target_name}_guest_config"
  guest_config_file = "${target_out_dir}/guest.cfg"

  action(guest_config_target_name) {
    script = "//src/virtualization/packages/generate_guest_config.py"
    outputs = [ guest_config_file ]

    args = []
    if (defined(invoker.zircon)) {
      args += [
        "--zircon",
        "data/kernel",
      ]
    }
    if (defined(invoker.linux)) {
      args += [
        "--linux",
        "data/kernel",
      ]
    }
    if (defined(invoker.ramdisk)) {
      args += [
        "--ramdisk",
        "data/ramdisk",
      ]
    }
    if (defined(invoker.cmdline)) {
      args += [
        "--cmdline",
        invoker.cmdline,
      ]
    }
    if (defined(invoker.dtb_overlay)) {
      args += [
        "--dtb-overlay",
        "data/dtb_overlay",
      ]
    }
    if (defined(invoker.block_devices)) {
      foreach(block_spec, invoker.block_devices) {
        args += [
          "--block",
          block_spec,
        ]
      }
    }
    if (defined(invoker.cpus)) {
      args += [
        "--cpus",
        invoker.cpus,
      ]
    }
    if (defined(invoker.memory)) {
      args += [
        "--memory",
        invoker.memory,
      ]
    }
    args += [ rebase_path("$guest_config_file") ]
  }

  guest_resource_target_name = "${target_name}_guest_resource"
  resource(guest_resource_target_name) {
    deps = [ ":$guest_config_target_name" ]
    sources = [ guest_config_file ]
    outputs = [ "data/guest.cfg" ]
  }
  resources = [ ":$guest_resource_target_name" ]

  if (defined(invoker.zircon)) {
    kernel = invoker.zircon
  } else if (defined(invoker.linux)) {
    kernel = invoker.linux
  }
  if (defined(kernel)) {
    kernel_resource_target_name = "${target_name}_kernel_resource"
    resource(kernel_resource_target_name) {
      forward_variables_from(invoker,
                             [
                               "deps",
                               "testonly",
                               "visibility",
                             ])
      sources = [ kernel ]
      outputs = [ "data/kernel" ]
    }
    resources += [ ":$kernel_resource_target_name" ]
  }

  if (defined(invoker.ramdisk)) {
    ramdisk_resource_target_name = "${target_name}_ramdisk_resource"
    resource(ramdisk_resource_target_name) {
      forward_variables_from(invoker,
                             [
                               "deps",
                               "testonly",
                               "visibility",
                             ])
      sources = [ invoker.ramdisk ]
      outputs = [ "data/ramdisk" ]
    }
    resources += [ ":$ramdisk_resource_target_name" ]
  }

  if (defined(invoker.dtb_overlay)) {
    dtb_resource_target_name = "${target_name}_dtb_resource"
    resource(dtb_resource_target_name) {
      forward_variables_from(invoker,
                             [
                               "deps",
                               "testonly",
                               "visibility",
                             ])
      sources = [ invoker.dtb_overlay ]
      outputs = [ "data/dtb_overlay" ]
    }
    resources += [ ":$dtb_resource_target_name" ]
  }

  # Rewrite old-style package#resources as new-style resource() targets.
  # Invokers can alternatively define resource() targets and add to deps.
  if (defined(invoker.resources)) {
    foreach(invoker_resource, invoker.resources) {
      invoker_resource_target_name =
          "${target_name}_invoker_resource_${invoker_resource.dest}"
      resource(invoker_resource_target_name) {
        forward_variables_from(invoker,
                               [
                                 "deps",
                                 "testonly",
                                 "visibility",
                               ])
        sources = [ invoker_resource.path ]
        outputs = [ "data/${invoker_resource.dest}" ]
      }
      resources += [ ":$invoker_resource_target_name" ]
    }
  }

  component_target_name = "${target_name}_component"
  component_name = target_name
  fuchsia_component(component_target_name) {
    forward_variables_from(invoker,
                           [
                             "testonly",
                             "visibility",
                           ])
    component_name = component_name
    manifest = "//src/virtualization/packages/meta/guest_package.cmx"
    deps = resources
  }

  fuchsia_package(target_name) {
    forward_variables_from(invoker,
                           [
                             "testonly",
                             "metadata",
                             "visibility",
                           ])
    deps = [ ":${component_target_name}" ]
  }
}

# Defines a guest prebuilt.
#
# Parameters
#   source (string, required)
#   output (string, required)
template("guest_prebuilt") {
  assert(defined(invoker.source), "")
  assert(defined(invoker.output), "")
  action(target_name) {
    script = "//src/virtualization/packages/check_image.sh"

    # If the input file exists, we want to copy it to the output.
    # Otherwise, we want to generate an empty file.
    #
    # GN has no way to specify an "optional input" -- we can either
    # specify an input (causing GN to error out if the file doesn't
    # exist); or not specify an input (meaning that GN will not rebuild
    # when the input image changes).
    #
    # We work around this by not specifying the input file as
    # a dependency explicitly, but having the "check_image.sh" script
    # out a depfile the first time it is run. This gives the script
    # a chance to run and generate a fake empty image file the first
    # time it runs, and after that, GN will correctly rebuild when
    # required.
    depfile = "${invoker.output}.d"

    args = [
      rebase_path(invoker.source, root_build_dir),
      rebase_path(invoker.output, root_build_dir),
      rebase_path(depfile, root_build_dir),
    ]

    outputs = [ invoker.output ]
  }
}
