# 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/virtualization/buildtools/linux_paths.gni")
import("//src/virtualization/buildtools/romfs_image.gni")
import("//src/virtualization/packages/guest_package.gni")

declare_args() {
  # Package the rootfs as a QCOW image (as opposed to a flat file).
  debian_guest_qcow = true
  debian_guest_earlycon = false
}

initrd_image = "initrd.img"
rootfs_image = "rootfs.qcow2"
tests_image = "tests.romfs"
linux_image = "vmlinuz"

guest_prebuilt("initrd") {
  source = "//prebuilt/virtualization/packages/debian_guest/images/${target_cpu}/${initrd_image}"
  output = "${target_out_dir}/debian/${initrd_image}"
}

guest_prebuilt("rootfs") {
  source = "//prebuilt/virtualization/packages/debian_guest/images/${target_cpu}/${rootfs_image}"
  output = "${target_out_dir}/debian/${rootfs_image}"
}

guest_prebuilt("kernel") {
  source = "//prebuilt/virtualization/packages/debian_guest/images/${target_cpu}/${linux_image}"
  output = "${target_out_dir}/debian/${linux_image}"
}

romfs_image("tests") {
  deps = [
    "//src/virtualization/tests/memory_test_util(${linux_exe_toolchain})",
    "//src/virtualization/tests/virtio_block_test_util(${linux_exe_toolchain})",
    "//src/virtualization/tests/virtio_gpu_test_util(${linux_exe_toolchain})",
    "//src/virtualization/tests/virtio_input_test_util(${linux_exe_toolchain})",
    "//src/virtualization/tests/virtio_net_test_util(${linux_exe_toolchain})",
    "//src/virtualization/tests/virtio_rng_test_util(${linux_exe_toolchain})",
    "//src/virtualization/tests/virtio_vsock_test_util(${linux_exe_toolchain})",
  ]

  inputs = [
    "${linux_exe_path}/virtio_block_test_util",
    "${linux_exe_path}/virtio_gpu_test_util",
    "${linux_exe_path}/virtio_input_test_util",
    "${linux_exe_path}/virtio_net_test_util",
    "${linux_exe_path}/virtio_rng_test_util",
    "${linux_exe_path}/virtio_vsock_test_util",
    "${linux_exe_path}/memory_test_util",
  ]

  output = "$target_out_dir/debian/${tests_image}"
}

guest_package("debian_guest") {
  default_net = true
  virtio_balloon = true
  virtio_console = true
  virtio_gpu = true
  virtio_mem = false
  virtio_rng = true
  virtio_sound = true
  virtio_sound_input = false
  virtio_vsock = true

  deps = [
    ":initrd",
    ":kernel",
    ":tests",
  ]

  cmdline = "root=/dev/vda rw systemd.log_target=kmsg"
  if (debian_guest_earlycon) {
    if (target_cpu == "x64") {
      cmdline += " earlycon=uart,io,0x3f8 console=tty0 keep_bootcon"
    } else if (target_cpu == "arm64") {
      cmdline += " earlycon=pl011,0x808300000 console=tty0 keep_bootcon"
    } else {
      panic("Unsupported architecture ${target_cpu}")
    }
  }

  linux = "${target_out_dir}/debian/${linux_image}"
  ramdisk = "${target_out_dir}/debian/${initrd_image}"

  disk_name = "filesystem.img"
  if (debian_guest_qcow) {
    deps += [ ":rootfs" ]
    disk_path = rebase_path("${target_out_dir}/debian/${rootfs_image}")
    disk_options = "ro,qcow,volatile"
  } else {
    disk_path = rebase_path("${target_out_dir}/debian/rootfs.img")
    disk_options = "ro,volatile"
  }
  resources = [
    {
      path = disk_path
      dest = disk_name
    },
  ]
  block_devices = [ "data/${disk_name},${disk_options}" ]

  tests_filename = "tests.romfs"
  resources += [
    {
      path = rebase_path("$target_out_dir/debian/${tests_image}")
      dest = tests_filename
    },
  ]
  block_devices += [ "data/${tests_filename},ro" ]

  deps += [ "//src/virtualization/lib/guest_interaction:extras" ]
  gis_out_dir =
      get_label_info("//src/virtualization/lib/guest_interaction:extras",
                     "target_out_dir")
  resources += [
    {
      path = rebase_path("$gis_out_dir/linux/extras.img")
      dest = "extras.img"
    },
  ]
  block_devices += [ "data/extras.img,ro" ]
}
