# 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/fidl/fidl.gni")
import("//src/sys/build/components.gni")

declare_args() {
  # Set this to true when configuring gn args to enable blobfs page-in
  # metrics recording.
  # This will also increase the inspect VMO size for blobfs to 2 MiB,
  # to accommodate the large number of metrics entries.
  blobfs_page_in_metrics_recording = false
}

static_library("blobfs") {
  friend = [
    ":decompressor_impl",
    "test:*",
  ]
  visibility = [
    "//src/storage/*",
    "//zircon/system/ulib/fvm-host",
    "//zircon/system/utest/blobfs-bench",
    "//zircon/system/utest/fs-management",
    "//zircon/system/utest/fs-test-utils",
    "//zircon/system/utest/fvm",
    "//zircon/tools/blobfs",
  ]
  public = [
    "blob_layout.h",
    "blobfs_inspector.h",
    "cache_policy.h",
    "common.h",
    "format.h",
    "fsck.h",
    "fsck_host.h",
    "host.h",
    "mkfs.h",
    "mount.h",
    "node_finder.h",
  ]
  sources = [
    "allocator/extent_reserver.cc",
    "allocator/extent_reserver.h",
    "allocator/node_reserver.cc",
    "allocator/node_reserver.h",
    "blob_layout.cc",
    "blobfs_checker.cc",
    "common.cc",
    "compression/chunked.cc",
    "compression/chunked.h",
    "compression/compressor.h",
    "compression/decompressor.cc",
    "compression/decompressor.h",
    "compression/lz4.cc",
    "compression/lz4.h",
    "compression/seekable_decompressor.h",
    "compression/zstd_plain.cc",
    "compression/zstd_plain.h",
    "compression/zstd_seekable.cc",
    "compression/zstd_seekable.h",
    "compression_settings.cc",
    "inspector/blobfs_inspector.cc",
    "inspector/parser.cc",
    "inspector/parser.h",
    "iterator/allocated_extent_iterator.cc",
    "iterator/allocated_extent_iterator.h",
    "iterator/allocated_node_iterator.cc",
    "iterator/allocated_node_iterator.h",
    "iterator/block_iterator.cc",
    "iterator/block_iterator.h",
    "iterator/block_iterator_provider.h",
    "iterator/extent_iterator.h",
    "iterator/vector_extent_iterator.cc",
    "iterator/vector_extent_iterator.h",
  ]
  public_deps = [
    # format.h includes digest.h.
    "//src/lib/digest",
    "//src/storage/lib/watchdog",
    "//zircon/public/lib/bitmap",
    "//zircon/public/lib/fit",
    "//zircon/public/lib/zxc",
    "//zircon/system/ulib/fs",
    "//zircon/system/ulib/fs/journal",
    "//zircon/system/ulib/fs/transaction",
    "//zircon/system/ulib/range",
    "//zircon/system/ulib/storage/buffer",
  ]
  deps = [
    "compression/configs",
    "//sdk/lib/syslog/cpp",
    "//src/lib/chunked-compression",
    "//src/lib/digest",
    "//src/storage/fvm",
    "//third_party/boringssl",
    "//third_party/zstd:zstdseek",
    "//zircon/public/lib/bitmap",
    "//zircon/public/lib/cksum",
    "//zircon/public/lib/fbl",
    "//zircon/public/lib/fit",
    "//zircon/public/lib/lz4",
    "//zircon/public/lib/safemath",
    "//zircon/public/lib/zircon-internal",
    "//zircon/public/lib/zxc",
    "//zircon/system/ulib/disk_inspector",
    "//zircon/system/ulib/fs/journal",
    "//zircon/system/ulib/fs/transaction",
    "//zircon/system/ulib/range",
    "//zircon/system/ulib/storage/buffer",
    "//zircon/system/ulib/storage/operation",
  ]
  if (is_fuchsia) {
    sources += [
      "allocator/allocator.cc",
      "blob.cc",
      "blob_cache.cc",
      "blob_corruption_notifier.cc",
      "blob_loader.cc",
      "blob_verifier.cc",
      "blobfs.cc",
      "cache_node.cc",
      "compression/blob_compressor.cc",
      "compression/external_decompressor.cc",
      "directory.cc",
      "format.cc",
      "fsck.cc",
      "health_check_service.cc",
      "iterator/node_populator.cc",
      "metrics.cc",
      "mount.cc",
      "pager/page_watcher.cc",
      "pager/transfer_buffer.cc",
      "pager/user_pager.cc",
      "query.cc",
      "read_metrics.cc",
      "runner.cc",
      "transaction.cc",
      "verification_metrics.cc",
    ]
    public_deps += [
      ":fuchsia.blobfs.internal",
      ":fuchsia.blobfs.internal_llcpp",
      "//sdk/fidl/fuchsia.blobfs:fuchsia.blobfs_llcpp",
      "//sdk/fidl/fuchsia.fs:fuchsia.fs_llcpp",
      "//src/sys/pkg/fidl/fuchsia.update.verify:fuchsia.update.verify_llcpp",
      "//zircon/system/ulib/block-client",
      "//zircon/system/ulib/fs/metrics:metrics-cobalt",
      "//zircon/system/ulib/fs/metrics:metrics-composite-latency-event",
      "//zircon/system/ulib/fs/metrics:metrics-inspect",
    ]
    deps += [
      "//sdk/fidl/fuchsia.blobfs:fuchsia.blobfs_c",
      "//sdk/fidl/fuchsia.blobfs:fuchsia.blobfs_llcpp",
      "//sdk/fidl/fuchsia.io:fuchsia.io_llcpp",
      "//sdk/fidl/fuchsia.scheduler",
      "//sdk/lib/fdio",
      "//sdk/lib/sys/inspect/cpp",
      "//sdk/lib/syslog/cpp",
      "//third_party/zstd",
      "//zircon/public/lib/async",
      "//zircon/public/lib/async-cpp",
      "//zircon/public/lib/sync",
      "//zircon/public/lib/zx",
      "//zircon/system/ulib/async-default",
      "//zircon/system/ulib/async-loop",
      "//zircon/system/ulib/async-loop:async-loop-cpp",
      "//zircon/system/ulib/async-loop:async-loop-default",
      "//zircon/system/ulib/backtrace-request",
      "//zircon/system/ulib/block-client",
      "//zircon/system/ulib/fidl-async:fidl-async-cpp",
      "//zircon/system/ulib/fidl-utils",
      "//zircon/system/ulib/fzl",
      "//zircon/system/ulib/id_allocator",
      "//zircon/system/ulib/trace",
      "//zircon/system/ulib/trace-engine",
      "//zircon/system/ulib/trace-provider:trace-provider-with-fdio",
    ]
  } else {
    sources += [
      "fsck_host.cc",
      "host.cc",
    ]
    deps += [ "//zircon/system/ulib/fs-host" ]
  }
  configs += [
    # TODO(fxbug.dev/58162): delete the below and fix compiler warnings
    "//build/config:Wno-conversion",
  ]

  if (blobfs_page_in_metrics_recording) {
    defines = [
      # Enable blobfs page-in metrics.
      "BLOBFS_ENABLE_PAGE_IN_METRICS",

      # The page-in metrics feature requires a large Inspect VMO (>512KB) for blobfs.
      "BLOBFS_ENABLE_LARGE_INSPECT_VMO",
    ]
  }
}

fidl("fuchsia.blobfs.internal") {
  sources = [ "compression/decompressor_sandbox/decompressor.fidl" ]
  public_deps = [ "//zircon/vdso/zx" ]
}

source_set("decompressor_impl") {
  visibility = [ "./*" ]
  sources = [
    "compression/decompressor_sandbox/decompressor_impl.cc",
    "compression/decompressor_sandbox/decompressor_impl.h",
  ]
  deps = [
    ":blobfs",
    ":fuchsia.blobfs.internal",
    ":fuchsia.blobfs.internal_llcpp",
    "//sdk/fidl/fuchsia.scheduler",
    "//sdk/lib/fidl/cpp:cpp",
    "//sdk/lib/sys/cpp:cpp",
    "//sdk/lib/syslog/cpp:cpp",
    "//src/lib/chunked-compression",
    "//src/lib/digest",
    "//zircon/public/lib/zxc",
    "//zircon/system/ulib/fs/journal",
    "//zircon/system/ulib/fzl",
    "//zircon/system/ulib/trace",
  ]
}

executable("decompressor") {
  sources = [ "compression/decompressor_sandbox/main.cc" ]
  deps = [
    ":decompressor_impl",
    ":fuchsia.blobfs.internal",
    "//sdk/lib/fidl/cpp:cpp",
    "//sdk/lib/sys/cpp:cpp",
    "//sdk/lib/syslog/cpp:cpp",
    "//src/lib/digest",
    "//zircon/public/lib/zxc",
    "//zircon/system/ulib/async-loop:async-loop-cpp",
    "//zircon/system/ulib/async-loop:async-loop-default",
    "//zircon/system/ulib/fs/journal",
    "//zircon/system/ulib/fzl",
    "//zircon/system/ulib/trace",
    "//zircon/system/ulib/trace-provider:trace-provider-with-fdio",
  ]
}

fuchsia_component("decompressor-sandbox") {
  manifest = "meta/decompressor_sandbox.cml"
  deps = [ ":decompressor" ]
}

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