# 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/go/go_binary.gni")
import("//build/go/go_library.gni")
import("//build/go/go_test.gni")

go_library("botanist_lib") {
  name = "go.fuchsia.dev/fuchsia/tools/botanist/lib"
  deps = [
    "//src/sys/pkg/lib/repo",
    "//third_party/golibs:golang.org/x/crypto",
    "//tools/build",
    "//tools/lib/logger",
    "//tools/lib/osmisc",
    "//tools/lib/retry",
    "//tools/lib/runner",
    "//tools/lib/syslog",
    "//tools/net/mdns",
    "//tools/net/netboot",
    "//tools/net/tftp",
  ]
}

go_library("target") {
  name = "go.fuchsia.dev/fuchsia/tools/botanist/target"
  source_dir = "target"
  deps = [
    ":botanist_lib",
    "//third_party/golibs:github.com/creack/pty",
    "//tools/bootserver:bootserver_lib",
    "//tools/lib/iomisc",
    "//tools/lib/osmisc",
    "//tools/lib/ring",
    "//tools/net/netutil",
    "//tools/net/sshutil",
    "//tools/qemu",
    "//tools/serial",
  ]
}

go_library("main") {
  name = "go.fuchsia.dev/fuchsia/tools/botanist/cmd"
  source_dir = "cmd"
  deps = [
    ":botanist_lib",
    ":target",
    "//tools/lib/color",
    "//tools/lib/command",
    "//tools/lib/flagmisc",
    "//tools/lib/tarutil",
    "//tools/testing/runtests",
  ]
}

go_binary("botanist") {
  gopackage = "go.fuchsia.dev/fuchsia/tools/botanist/cmd"
  deps = [ ":main" ]
}

go_test("botanist_lib_tests") {
  gopackages = [ "go.fuchsia.dev/fuchsia/tools/botanist/lib" ]
  deps = [ ":botanist_lib" ]
}

go_test("botanist_target_tests") {
  gopackages = [ "go.fuchsia.dev/fuchsia/tools/botanist/target" ]
  deps = [ ":target" ]
}

group("tests") {
  testonly = true

  deps = [
    ":botanist_lib_tests",
    ":botanist_target_tests",
  ]
}
