#
#  Copyright (C) 2015 Google
#
#  Licensed under the Apache License, Version 2.0 (the "License");
#  you may not use this file except in compliance with the License.
#  You may obtain a copy of the License at:
#
#  http://www.apache.org/licenses/LICENSE-2.0
#
#  Unless required by applicable law or agreed to in writing, software
#  distributed under the License is distributed on an "AS IS" BASIS,
#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#  See the License for the specific language governing permissions and
#  limitations under the License.
#

source_set("service") {
  sources = [
    "adapter.cc",
    "daemon.cc",
    "gatt_client.cc",
    "gatt_server.cc",
    "gatt_server_old.cc",
    "logging_helpers.cc",
    "low_energy_client.cc",
    "settings.cc",
    "common/bluetooth/advertise_data.cc",
    "common/bluetooth/adapter_state.cc",
    "common/bluetooth/uuid.cc",
    "common/bluetooth/scan_filter.cc",
    "common/bluetooth/scan_result.cc",
    "common/bluetooth/scan_settings.cc",
    "common/bluetooth/gatt_identifier.cc",
    "common/bluetooth/advertise_settings.cc",
    "common/bluetooth/util/atomic_string.cc",
    "common/bluetooth/util/address_helper.cc",
    "hal/bluetooth_interface.cc",
    "hal/bluetooth_gatt_interface.cc",
    "hal/fake_bluetooth_gatt_interface.cc",
    "hal/fake_bluetooth_interface.cc",
    "hal/gatt_helpers.cc",
    "ipc/ipc_handler.cc",
    "ipc/linux_ipc_host.cc",
    "ipc/ipc_manager.cc",
    "ipc/ipc_handler_linux.cc",
  ]

  include_dirs = [
    "//",
    "//service/common",
    "//third_party/modp_b64/modp64",
    libhw_include_path,
  ]

  deps = [
    "//third_party/libchrome:base"
  ]
}

executable("bluetoothtbd") {
  sources = [
    "main.cc",
  ]

  deps = [
    ":service",
    "//btcore",
    "//third_party/libchrome:base",
    "//third_party/modp_b64",
  ]

  include_dirs = [ "//" ]

  libs = [
    "-ldl",
    "-lpthread",
    "-lrt",
  ]
}

executable("service_unittests") {
  testonly = true
  sources = [
    "test/fake_hal_util.cc",
    "test/ipc_linux_unittest.cc",
    "test/settings_unittest.cc",
    "test/uuid_unittest.cc",
  ]

  include_dirs = [ "//" ]

  deps = [
    ":service",
    "//third_party/googletest:gmock_main",
    "//third_party/libchrome:base",
    "//third_party/modp_b64",
  ]
}
