# 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" ]
  }

  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",
    ]
  }

  # TODO(fxbug.dev/69585): This target uses raw zx::channel with LLCPP which is deprecated.
  # Please migrate to typed channel APIs (fidl::ClientEnd<T>, fidl::ServerEnd<T>).
  # See linked bug for details.
  configs += [ "//build/cpp:fidl-llcpp-deprecated-raw-channels" ]
}

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" ]
}
