# 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("//build/config/fuchsia/zbi.gni")
import("//build/config/fuchsia/zircon.gni")
import("//build/images/manifest.gni")
import("//build/package.gni")

guest_packages = [
  get_label_info("//build/images:shell-commands", "label_no_toolchain"),
  get_label_info("//garnet/bin/appmgr", "label_no_toolchain"),
  get_label_info(
      "//garnet/bin/guest/integration_tests:guest_integration_tests_utils",
      "label_no_toolchain"),
  get_label_info("//garnet/bin/guest/pkg/zircon_guest:services_config",
                 "label_no_toolchain"),
  get_label_info("//garnet/bin/run", "label_no_toolchain"),
  get_label_info("//garnet/bin/sysmgr", "label_no_toolchain"),
  get_label_info("//garnet/bin/trace", "label_no_toolchain"),
  get_label_info("//garnet/go/src/pmd:pkgsvr", "label_no_toolchain"),
]

# The pkgsvr index is a manifest mapping `package_name/package_version` to
# the merkleroot of the package's meta.far file.
action("pkgsvr_index") {
  visibility = [ ":*" ]
  testonly = true
  script = "//build/images/manifest.py"
  args = [ "--contents" ]
  outputs = [
    "$target_out_dir/$target_name",
  ]
  args += [ "--output=" + rebase_path(outputs[0], root_build_dir) ]
  sources = []
  deps = []
  foreach(pkg_label, guest_packages) {
    # Find the response file written by package().
    pkg_target_name = get_label_info(pkg_label, "name")
    pkg_target_out_dir = get_label_info(pkg_label, "target_out_dir")
    pkg_rspfile = "$pkg_target_out_dir/${pkg_target_name}.pkgsvr_index.rsp"
    deps += [ "${pkg_label}.pkgsvr_index.rsp" ]
    sources += [ pkg_rspfile ]
    args += [ "@" + rebase_path(pkg_rspfile, root_build_dir) ]
  }
}

boot_manifest = "$target_out_dir/boot.manifest"
generate_manifest("guest.manifest") {
  visibility = [ ":*" ]
  testonly = true

  bootfs_manifest = boot_manifest
  bootfs_zircon_groups = "misc,test"

  args = []
  deps = []
  sources = []
  foreach(pkg_label, guest_packages) {
    # Find the response file written by package().
    pkg_target_name = get_label_info(pkg_label, "name")
    pkg_target_out_dir = get_label_info(pkg_label, "target_out_dir")
    pkg_system_rsp = "$pkg_target_out_dir/${pkg_target_name}.system.rsp"
    deps += [ pkg_label ]
    sources += [ pkg_system_rsp ]
    args += [ "@" + rebase_path(pkg_system_rsp, root_build_dir) ]
  }

  json = "guest_meta_package.json"
  sources += [ json ]
  args += [ "--entry=meta/package=" + rebase_path(json, root_build_dir) ]

  # Add the static packages (pkgsvr) index.
  deps += [ ":pkgsvr_index" ]
  pkgsvr_index = "$target_out_dir/pkgsvr_index"
  sources += [ pkgsvr_index ]
  args += [ "--entry=data/static_packages=" +
            rebase_path(pkgsvr_index, root_build_dir) ]
}

# Generate, sign, and seal the package file.
pm_build_package("guest.meta") {
  visibility = [ ":*" ]
  testonly = true
  manifest = ":guest.manifest"
}

guest_blob_manifest = "$root_build_dir/guest_blob.manifest"
action("guest_blob.manifest") {
  visibility = [ ":*" ]
  testonly = true
  deps = [
    ":guest.manifest",
    ":guest.meta",
  ]
  outputs = [
    guest_blob_manifest,
  ]
  depfile = guest_blob_manifest + ".d"
  guest_manifest_outputs = get_target_outputs(":guest.manifest")
  guest_manifest = guest_manifest_outputs[0]
  inputs = [
    guest_manifest,
  ]
  script = "//build/images/blob_manifest.py"
  args = [ "@{{response_file_name}}" ]
  response_file_contents = [
    "--depfile=" + rebase_path(depfile, root_build_dir),
    "--output=" + rebase_path(guest_blob_manifest, root_build_dir),
    "--input=" +
        rebase_path("$target_out_dir/guest.meta/blobs.json", root_build_dir),
  ]
  foreach(pkg_label, guest_packages) {
    pkg_target_name = get_label_info(pkg_label, "name")
    pkg_target_out_dir = get_label_info(pkg_label, "target_out_dir")
    pkg_blobs_rsp = "$pkg_target_out_dir/${pkg_target_name}.blobs.rsp"
    deps += [ "${pkg_label}.blobs.rsp" ]
    inputs += [ pkg_blobs_rsp ]
    response_file_contents +=
        [ "@" + rebase_path(pkg_blobs_rsp, root_build_dir) ]
  }
}

zircon_tool_action("guest_blob.blk") {
  visibility = [ ":*" ]
  testonly = true
  deps = [
    ":guest_blob.manifest",
  ]
  blob_image_path = "$target_out_dir/$target_name"
  outputs = [
    blob_image_path,
  ]
  depfile = blob_image_path + ".d"
  inputs = [
    guest_blob_manifest,
  ]
  tool = "blobfs"
  args = [
    "--depfile",
    rebase_path(blob_image_path, root_build_dir),
    "create",
    "--manifest",
    rebase_path(guest_blob_manifest, root_build_dir),
  ]
}

zircon_tool_action("guest_fvm") {
  testonly = true
  fvm = "$root_out_dir/guest_fvm.blk"
  outputs = [
    fvm,
  ]
  tool = "fvm"
  sources = []
  deps = [
    ":guest_blob.blk",
  ]
  foreach(label, deps) {
    sources += get_target_outputs(label)
  }
  args = [
           rebase_path(fvm, root_build_dir),
           "create",
           "--blob",
         ] + rebase_path(sources, root_build_dir)
}

# Generate the /boot/config/devmgr file.
action("devmgr_config.txt") {
  visibility = [ ":*" ]
  testonly = true
  script = "//build/images/manifest.py"
  outputs = [
    "$target_out_dir/$target_name",
  ]
  pkgfs_label = "//garnet/go/src/pmd:pkgsvr"
  pkgfs = "bin/" + get_label_info(pkgfs_label, "name")
  pkgfs_label += ".meta"
  pkgfs_pkg_out_dir = get_label_info(pkgfs_label, "target_out_dir") + "/" +
                      get_label_info(pkgfs_label, "name")
  pkgfs_blob_manifest = "$pkgfs_pkg_out_dir/meta/contents"
  system_image_merkleroot = "$target_out_dir/guest.meta/meta.far.merkle"

  deps = [
    ":guest.manifest",
    ":guest.meta",
    pkgfs_label,
  ]
  sources = [
    boot_manifest,
    pkgfs_blob_manifest,
    system_image_merkleroot,
  ]

  args = [
    "--output=" + rebase_path(outputs[0], root_build_dir),

    # Start with the fixed options.
    "--entry=devmgr.require-system=true",

    # Add the pkgfs command line, embedding the merkleroot of the system image.
    "--contents",
    "--rewrite=*=zircon.system.pkgfs.cmd={target}+{source}",
    "--entry=${pkgfs}=" + rebase_path(system_image_merkleroot, root_build_dir),
    "--no-contents",
    "--reset-rewrite",

    # Embed the pkgfs blob manifest with the "zircon.system.pkgfs.file."
    # prefix on target file names.
    "--rewrite=*=zircon.system.pkgfs.file.{target}={source}",
    "--manifest=" + rebase_path(pkgfs_blob_manifest, root_build_dir),
    "--reset-rewrite",
    "--include=bin/devhost",
    "--rewrite=bin/devhost=devhost.asan.strict=false",
    "--manifest=" + rebase_path(boot_manifest, root_build_dir),
  ]
}

zbi("guest") {
  testonly = true
  deps = [
    ":devmgr_config.txt",
    ":guest.manifest",
  ]
  inputs = [
    "${zircon_build_dir}/zircon.zbi",
    boot_manifest,
  ]
  manifest = [
    {
      outputs = [
        "config/devmgr",
      ]
      sources = get_target_outputs(":devmgr_config.txt")
    },
  ]
  cmdline = []
  cmdline_inputs = []
}
