#
#  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 = [
    "a2dp_source.cpp",
    "core_stack.cpp",
    "daemon.cpp",
    "gatt_server.cpp",
    "ipc/ipc_handler.cpp",
    "ipc/ipc_handler_unix.cpp",
    "ipc/ipc_manager.cpp",
    "ipc/unix_ipc_host.cpp",
    "logging_helpers.cpp",
    "settings.cpp",
    "uuid.cpp"
  ]

  include_dirs = [
    "//",
    "//third_party/libchrome"
  ]
}

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

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

  include_dirs = [
    "//",
    "//third_party/libchrome"
  ]

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

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

  include_dirs = [
    "//",
    "//third_party/libchrome"
  ]

  deps = [
    ":service",
    "//third_party/gtest:gtest_main",
    "//third_party/libchrome:base",
    "//third_party/modp_b64",
  ]
}
