# Copyright 2018 The Chromium OS 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("//common-mk/generate-dbus-adaptors.gni")
import("//common-mk/pkg_config.gni")

group("all") {
  deps = [
    ":cros-disks",
    ":libdisks",
    ":libdisks-adaptors",
  ]
  if (use.fuzzer) {
    deps += [
      ":cros-disks_filesystem_label_fuzzer",
      ":cros-disks_mount_options_fuzzer",
    ]
  }
  if (use.test) {
    deps += [ ":disks_testrunner" ]
  }
}

pkg_config("target_defaults") {
  pkg_deps = [
    "blkid",
    "libbrillo",
    "libchrome",
    "libmetrics",
    "libminijail",
    "libsession_manager-client",
  ]
  libs = [ "rootdev" ]
}

generate_dbus_adaptors("libdisks-adaptors") {
  dbus_service_config = "dbus_bindings/dbus-service-config.json"
  dbus_adaptors_out_dir = "include/cros-disks/dbus_adaptors"
  sources = [ "dbus_bindings/org.chromium.CrosDisks.xml" ]
}

static_library("libdisks") {
  sources = [
    "archive_manager.cc",
    "cros_disks_server.cc",
    "daemon.cc",
    "device_ejector.cc",
    "device_event.cc",
    "device_event_moderator.cc",
    "device_event_queue.cc",
    "disk.cc",
    "disk_manager.cc",
    "disk_monitor.cc",
    "drivefs_helper.cc",
    "drivefs_helper.h",
    "error_logger.cc",
    "file_reader.cc",
    "filesystem_label.cc",
    "format_manager.cc",
    "fuse_helper.cc",
    "fuse_mount_manager.cc",
    "fuse_mounter.cc",
    "metrics.cc",
    "mount_info.cc",
    "mount_manager.cc",
    "mount_options.cc",
    "mount_point.cc",
    "mounter.cc",
    "partition_manager.cc",
    "platform.cc",
    "process.cc",
    "quote.cc",
    "rar_manager.cc",
    "rename_manager.cc",
    "sandboxed_init.cc",
    "sandboxed_process.cc",
    "session_manager_proxy.cc",
    "smbfs_helper.cc",
    "sshfs_helper.cc",
    "system_mounter.cc",
    "udev_device.cc",
    "uri.cc",
    "usb_device_info.cc",
    "zip_manager.cc",
  ]
  configs += [ ":target_defaults" ]
  deps = [ ":libdisks-adaptors" ]
}

executable("cros-disks") {
  sources = [ "main.cc" ]
  configs += [ ":target_defaults" ]
  deps = [ ":libdisks" ]
}

if (use.fuzzer) {
  pkg_config("fuzzed_data_config") {
    pkg_deps = [ "libchrome-test" ]
  }
  executable("cros-disks_mount_options_fuzzer") {
    sources = [ "mount_options_fuzzer.cc" ]
    configs += [
      "//common-mk/common_fuzzer",
      ":fuzzed_data_config",
      ":target_defaults",
    ]
    configs -= [ "//common-mk:no_exceptions" ]
    deps = [ ":libdisks" ]
  }

  executable("cros-disks_filesystem_label_fuzzer") {
    sources = [ "fuzzers/filesystem_label_fuzzer.cc" ]
    configs += [
      "//common-mk/common_fuzzer:common_fuzzer",
      ":target_defaults",
    ]
    deps = [ ":libdisks" ]
  }
}

if (use.test) {
  pkg_config("disks_test_config") {
    pkg_deps = [ "libchrome-test" ]
  }
  executable("disks_testrunner") {
    sources = [
      "archive_manager_test.cc",
      "device_event_moderator_test.cc",
      "device_event_queue_test.cc",
      "disk_manager_test.cc",
      "disk_monitor_test.cc",
      "disk_test.cc",
      "drivefs_helper_test.cc",
      "error_logger_test.cc",
      "file_reader_test.cc",
      "filesystem_label_test.cc",
      "format_manager_test.cc",
      "fuse_helper_test.cc",
      "fuse_mount_manager_test.cc",
      "fuse_mounter_test.cc",
      "metrics_test.cc",
      "mount_info_test.cc",
      "mount_manager_test.cc",
      "mount_options_test.cc",
      "mount_point_test.cc",
      "mounter_test.cc",
      "platform_test.cc",
      "process_test.cc",
      "quote_test.cc",
      "rar_manager_test.cc",
      "rename_manager_test.cc",
      "sandboxed_init_test.cc",
      "smbfs_helper_test.cc",
      "sshfs_helper_test.cc",
      "system_mounter_test.cc",
      "udev_device_test.cc",
      "uri_test.cc",
      "usb_device_info_test.cc",
      "zip_manager_test.cc",
    ]
    configs += [
      "//common-mk:test",
      ":disks_test_config",
      ":target_defaults",
    ]
    deps = [
      ":libdisks",
      "//common-mk/testrunner",
    ]
  }
}
