# Copyright 2014 The Chromium 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("../mojo_edk.gni")

mojo_edk_source_set("embedder") {
  # This isn't really a standalone target; it must be linked into the
  # mojo_system_impl component.
  mojo_edk_visibility = [ "mojo/edk/system" ]

  sources = [
    "channel_info_forward.h",
    "configuration.h",
    "embedder.cc",
    "embedder.h",
    "embedder_internal.h",
    "entrypoints.cc",
    "system_impl_private_entrypoints.cc",

    # Test-only code:
    # TODO(vtl): It's a little unfortunate that these end up in the same
    # component as non-test-only code. In the static build, this code should
    # hopefully be dead-stripped.
    "test_embedder.cc",
    "test_embedder.h",
  ]

  public_deps = [
    ":delegates",
    ":platform",
  ]

  mojo_sdk_public_deps = [ "mojo/public/cpp/system" ]

  mojo_edk_public_deps = [ "mojo/edk/platform" ]

  deps = [
    "//base",
  ]

  mojo_sdk_deps = [ "mojo/public/platform/native:system_impl_private_api" ]

  mojo_edk_deps = [ "mojo/edk/util" ]
}

mojo_edk_source_set("platform") {
  # This isn't really a standalone target; it must be linked into the
  # mojo_system_impl component.
  visibility = [ ":embedder" ]

  mojo_edk_visibility = [ "mojo/edk/system/*" ]

  sources = [
    "platform_channel_pair.cc",
    "platform_channel_pair.h",
    "platform_channel_utils.cc",
    "platform_channel_utils.h",
    "platform_handle.cc",
    "platform_handle.h",
    "platform_handle_utils.h",
    "platform_handle_utils_posix.cc",
    "platform_handle_vector.h",
    "platform_shared_buffer.h",
    "platform_support.h",
    "scoped_platform_handle.h",
    "simple_platform_shared_buffer.cc",
    "simple_platform_shared_buffer.h",
    "simple_platform_support.cc",
    "simple_platform_support.h",
  ]

  mojo_sdk_public_deps = [ "mojo/public/cpp/system" ]

  deps = [
    "//base",
  ]

  if (is_android) {
    deps += [ "//third_party/ashmem" ]
  }

  mojo_edk_deps = [ "mojo/edk/util" ]
}

mojo_edk_source_set("delegates") {
  # This isn't really a standalone target; it must be linked into the
  # mojo_system_impl component.
  visibility = [ ":embedder" ]

  mojo_edk_visibility = [ "mojo/edk/system" ]

  sources = [
    "master_process_delegate.h",
    "process_delegate.h",
    "process_type.h",
    "slave_info.h",
    "slave_process_delegate.h",
  ]

  mojo_sdk_public_deps = [ "mojo/public/cpp/system" ]
}

mojo_edk_unittests("mojo_edk_embedder_unittests") {
  sources = [
    "embedder_unittest.cc",
    "platform_channel_pair_unittest.cc",
    "simple_platform_shared_buffer_unittest.cc",
  ]

  deps = [
    "//base",
    "//testing/gtest",
  ]

  mojo_edk_deps = [
    "mojo/edk/base_edk",
    "mojo/edk/test:test_support",
    "mojo/edk/system",
    "mojo/edk/system/test",
    "mojo/edk/util",
  ]
}
