# Copyright 2019 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/cmx/cmx.gni")
import("//build/images/manifest.gni")

cm_compile("root.cm") {
  data = rebase_path("meta/root.cml")
}

# TODO(BLD-448): This should move into the devcoordinator package that's
# included in bootfs along with devcoordinator's binary and other
# resources/libraries. For now it's here since cm_compile doesn't exist in
# //zircon.
cm_compile("devcoordinator.cm") {
  data = rebase_path("meta/devcoordinator.cml")
}
cm_compile("console.cm") {
  data = rebase_path("meta/console.cml")
}
cm_compile("ptysvc.cm") {
  data = rebase_path("meta/ptysvc.cml")
}
cm_compile("sysinfo.cm") {
  data = rebase_path("meta/sysinfo.cml")
}

# TODO(BLD-448): Should become a package just containing the root manifests.
generate_manifest("root_manifests.bootfs") {
  deps = [
    ":console.cm",
    ":devcoordinator.cm",
    ":ptysvc.cm",
    ":root.cm",
    ":sysinfo.cm",
  ]

  root_cm_out = get_target_outputs(":root.cm")
  devc_cm_out = get_target_outputs(":devcoordinator.cm")
  console_cm_out = get_target_outputs(":console.cm")
  ptysvc_cm_out = get_target_outputs(":ptysvc.cm")
  sysinfo_cm_out = get_target_outputs(":sysinfo.cm")
  args = [
    "--entry=meta/root.cm=" + rebase_path(root_cm_out[0]),
    "--entry=meta/devcoordinator.cm=" + rebase_path(devc_cm_out[0]),
    "--entry=meta/console.cm=" + rebase_path(console_cm_out[0]),
    "--entry=meta/ptysvc.cm=" + rebase_path(ptysvc_cm_out[0]),
    "--entry=meta/sysinfo.cm=" + rebase_path(sysinfo_cm_out[0]),
  ]
}
