# 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.

##########################################
# Though under //zircon, this build file #
# is meant to be used in the Fuchsia GN  #
# build.                                 #
# See fxbug.dev/36548.                   #
##########################################

assert(!defined(zx) || zx != "/",
       "This file can only be used in the Fuchsia GN build.")

import("//build/unification/zx_library.gni")

zx_library("inspect") {
  sdk = "source"
  sdk_publishable = true
  sdk_headers = [
    "lib/inspect/cpp/inspect.h",
    "lib/inspect/cpp/inspector.h",
    "lib/inspect/cpp/hierarchy.h",
    "lib/inspect/cpp/reader.h",
    "lib/inspect/cpp/health.h",
    "lib/inspect/cpp/value_list.h",
    "lib/inspect/cpp/vmo/state.h",
    "lib/inspect/cpp/vmo/types.h",
    "lib/inspect/cpp/vmo/block.h",
    "lib/inspect/cpp/vmo/heap.h",
    "lib/inspect/cpp/vmo/limits.h",
    "lib/inspect/cpp/vmo/scanner.h",
    "lib/inspect/cpp/vmo/snapshot.h",
  ]
  sources = [
    "health.cc",
    "hierarchy.cc",
    "inspector.cc",
    "reader.cc",
    "vmo/heap.cc",
    "vmo/scanner.cc",
    "vmo/snapshot.cc",
    "vmo/state.cc",
    "vmo/types.cc",
  ]

  public_deps = [
    "//zircon/public/lib/fit",
    "//zircon/public/lib/zx",
  ]

  deps = [
    "//sdk/lib/fdio",
    "//zircon/public/lib/fit",
    "//zircon/public/lib/zx",
  ]

  # TODO(fxbug.dev/58162): delete the below and fix compiler warnings
  configs += [ "//build/config:Wno-conversion" ]
}

group("tests") {
  testonly = true
  deps = [ "tests" ]
}
