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

guest_packages = [
  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,
  ]
  guest_manifest_outputs = get_target_outputs(":guest.manifest")
  guest_manifest = guest_manifest_outputs[0]
  inputs = [
    guest_manifest,
  ]
  script = "//build/images/manifest.py"
  args = [ "@{{response_file_name}}" ]
  response_file_contents = [
    "--sources",
    "--output=" + rebase_path(guest_blob_manifest, root_build_dir),
    "--manifest=" + rebase_path(guest_manifest, root_build_dir),
    "--entry=system_image/meta.far=" +
        rebase_path("$target_out_dir/guest.meta/meta.far", 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_blob_rsp = "$pkg_target_out_dir/${pkg_target_name}.blob.rsp"
    deps += [ "${pkg_label}.blob.rsp" ]
    inputs += [ pkg_blob_rsp ]
    response_file_contents +=
        [ "@" + rebase_path(pkg_blob_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 = []
}
