# Copyright 2019 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-proxies.gni")
import("//common-mk/mojom_bindings_generator.gni")
import("//common-mk/pkg_config.gni")

group("all") {
  deps = [
    ":dbus_bindings",
    ":mojo_bindings",
    ":smbfs",
  ]
  if (use.test) {
    deps += [ ":smbfs_test" ]
  }
}

pkg_config("target_defaults") {
  pkg_deps = [
    "libbrillo",
    "libchrome-${libbase_ver}",
    "libmojo-${libbase_ver}",
    "libpasswordprovider",
    "fuse",
    "smbclient",

    # system_api depends on protobuf (or protobuf-lite). It must
    # appear before protobuf or the linker flags won"t be in the right
    # order.
    "system_api",
    "protobuf-lite",
  ]
  defines = [ "FUSE_USE_VERSION=26" ]
}

static_library("libsmbfs") {
  sources = [
    "authpolicy_client.cc",
    "authpolicy_client.h",
    "filesystem.cc",
    "filesystem.h",
    "fuse_session.cc",
    "fuse_session.h",
    "inode_map.cc",
    "inode_map.h",
    "kerberos_artifact_client_interface.h",
    "kerberos_artifact_synchronizer.cc",
    "kerberos_artifact_synchronizer.h",
    "kerberos_client.cc",
    "kerberos_client.h",
    "request.cc",
    "request.h",
    "smb_filesystem.cc",
    "smb_filesystem.h",
    "smbfs.h",
    "smbfs_bootstrap_impl.cc",
    "smbfs_bootstrap_impl.h",
    "smbfs_daemon.cc",
    "smbfs_daemon.h",
    "smbfs_impl.cc",
    "smbfs_impl.h",
    "test_filesystem.cc",
    "test_filesystem.h",
    "util.cc",
    "util.h",
  ]
  configs += [ ":target_defaults" ]
  deps = [
    ":dbus_bindings",
    ":mojo_bindings",
  ]
}

generate_dbus_proxies("dbus_bindings") {
  sources = [
    "dbus_bindings/org.chromium.SmbFs.xml",
  ]
  proxy_output_file = "include/smbfs/dbus-proxies.h"
  mock_output_file = "include/smbfs/dbus-proxy-mocks.h"
}

generate_mojom_bindings("mojo_bindings") {
  mojo_root = "${platform2_root}"
  sources = [
    "mojom/ip_address.mojom",
    "mojom/smbfs.mojom",
  ]
  configs = [ ":target_defaults" ]
}

executable("smbfs") {
  sources = [
    "main.cc",
  ]
  configs += [ ":target_defaults" ]
  deps = [
    ":libsmbfs",
  ]
}

if (use.test) {
  pkg_config("smbfs_test_config") {
    pkg_deps = [ "libchrome-test-${libbase_ver}" ]
  }
  executable("smbfs_test") {
    configs += [
      "//common-mk:test",
      ":target_defaults",
      ":smbfs_test_config",
    ]
    deps = [
      ":libsmbfs",
      "//common-mk/testrunner:testrunner",
    ]
    sources = [
      "fake_kerberos_artifact_client.cc",
      "fake_kerberos_artifact_client.h",
      "inode_map_test.cc",
      "kerberos_artifact_synchronizer_test.cc",
      "smb_filesystem_test.cc",
      "smbfs_bootstrap_impl_test.cc",
      "util_test.cc",
    ]
  }
}
