# 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: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 = []
}
