# Copyright 2018 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("//build/config/nacl/config.gni")
import("//testing/test.gni")

component("embedder_internal") {
  output_name = "mojo_core_embedder_internal"
  public_deps = [
    ":impl_for_embedder",
  ]
  visibility = [
    ":test_sources",
    "//mojo:*",
    "//mojo/core/embedder",
  ]
}

# Bits of the EDK library which do not depend on public API linkage. It is
# not allowed for this target or any of its transitive dependencies to depend
# on anything under //mojo/public beyond strict C type definitions.
#
# This is templated because it's consumed by both the ":embedder_internal"
# component library as well as the ":mojo_core" shared library. In the former
# case we want to export symbols, but in the latter case we don't. The template
# stamps out two nearly identical targets which differ only in what symbols they
# export.
template("core_impl_source_set") {
  source_set(target_name) {
    if (invoker.for_shared_library) {
      visibility = [ ":shared_library" ]
    } else {
      visibility = [ ":embedder_internal" ]
    }

    public = [
      "channel.h",
      "configuration.h",
      "connection_params.h",
      "core.h",
      "data_pipe_consumer_dispatcher.h",
      "data_pipe_control_message.h",
      "data_pipe_producer_dispatcher.h",
      "dispatcher.h",
      "embedder/configuration.h",
      "embedder/process_error_callback.h",
      "entrypoints.h",
      "handle_signals_state.h",
      "handle_table.h",
      "invitation_dispatcher.h",
      "message_pipe_dispatcher.h",
      "node_controller.h",
      "options_validation.h",
      "platform_handle_dispatcher.h",
      "platform_handle_utils.h",
      "platform_shared_memory_mapping.h",
      "request_context.h",
      "scoped_process_handle.h",
      "shared_buffer_dispatcher.h",
      "user_message_impl.h",
    ]

    sources = [
      "atomic_flag.h",
      "broker.h",
      "broker_win.cc",
      "channel.cc",
      "channel_win.cc",
      "configuration.cc",
      "connection_params.cc",
      "core.cc",
      "data_pipe_consumer_dispatcher.cc",
      "data_pipe_control_message.cc",
      "data_pipe_producer_dispatcher.cc",
      "dispatcher.cc",
      "entrypoints.cc",
      "handle_table.cc",
      "invitation_dispatcher.cc",
      "message_pipe_dispatcher.cc",
      "node_channel.cc",
      "node_channel.h",
      "node_controller.cc",
      "platform_handle_dispatcher.cc",
      "platform_handle_in_transit.cc",
      "platform_handle_in_transit.h",
      "platform_handle_utils.cc",
      "platform_shared_memory_mapping.cc",
      "request_context.cc",
      "scoped_process_handle.cc",
      "shared_buffer_dispatcher.cc",
      "user_message_impl.cc",
      "watch.cc",
      "watch.h",
      "watcher_dispatcher.cc",
      "watcher_dispatcher.h",
      "watcher_set.cc",
      "watcher_set.h",
    ]

    public_deps = [
      "//base",
      "//mojo/core/ports",
      "//mojo/public/c/system:headers",
      "//mojo/public/cpp/platform",
    ]

    if (is_fuchsia) {
      sources += [ "channel_fuchsia.cc" ]

      public_deps += [ "//third_party/fuchsia-sdk/sdk:fdio" ]
    }

    if (is_posix) {
      if (!is_nacl || is_nacl_nonsfi) {
        sources += [
          "broker_posix.cc",
          "channel_posix.cc",
        ]
      }
    }

    if (is_mac && !is_ios) {
      sources += [
        "mach_port_relay.cc",
        "mach_port_relay.h",
      ]
    }

    if (!is_nacl || is_nacl_nonsfi) {
      sources += [
        "broker_host.cc",
        "broker_host.h",
      ]
    }

    defines = []
    if (invoker.for_shared_library) {
      defines += [ "MOJO_CORE_SHARED_LIBRARY" ]
    } else {
      defines += [ "MOJO_SYSTEM_IMPL_IMPLEMENTATION" ]
    }

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

    if (is_win) {
      cflags = [ "/wd4324" ]  # Structure was padded due to __declspec(align()),
                              # which is uninteresting.
    }

    # Use target_os == "chromeos" instead of is_chromeos because we need to
    # build NaCl targets (i.e. IRT) for ChromeOS the same as the rest of ChromeOS.
    if (is_android || target_os == "chromeos") {
      defines += [ "MOJO_CORE_LEGACY_PROTOCOL" ]
    }
  }
}

core_impl_source_set("impl_for_embedder") {
  for_shared_library = false
}

if (is_chromeos || is_linux || is_android || is_win) {
  core_impl_source_set("impl_for_shared_library") {
    for_shared_library = true
  }

  shared_library("shared_library") {
    output_name = "mojo_core"
    sources = [
      "mojo_core.cc",
    ]
    defines = [ "MOJO_CORE_SHARED_LIBRARY" ]
    deps = [
      ":impl_for_shared_library",
      "//mojo/public/c/system:headers",
    ]
    if (is_win) {
      inputs = [
        "mojo_core.def",
      ]
      ldflags = [ "/DEF:" + rebase_path("mojo_core.def", root_build_dir) ]
    } else {
      configs += [ ":export_only_thunks_api" ]
    }
  }

  if (is_chromeos) {
    if (target_cpu == "arm" || target_cpu == "arm64") {
      android32_toolchain = "android_clang_arm"
      android64_toolchain = "android_clang_arm64"
    } else {
      android32_toolchain = "android_clang_x86"
      android64_toolchain = "android_clang_x64"
    }

    group("shared_libraries_for_arc") {
      deps = [
        ":shared_library_arc32",
        ":shared_library_arc64",
      ]
    }

    copy("shared_library_arc32") {
      sources = [
        "${root_out_dir}/${android32_toolchain}/libmojo_core.so",
      ]
      outputs = [
        "${root_out_dir}/libmojo_core_arc32.so",
      ]
      deps = [
        ":shared_library(//build/toolchain/android:${android32_toolchain})",
      ]
    }

    copy("shared_library_arc64") {
      sources = [
        "${root_out_dir}/${android64_toolchain}/libmojo_core.so",
      ]
      outputs = [
        "${root_out_dir}/libmojo_core_arc64.so",
      ]
      deps = [
        ":shared_library(//build/toolchain/android:${android64_toolchain})",
      ]
    }
  }

  config("export_only_thunks_api") {
    inputs = [
      "export_only_thunks_api.lst",
    ]
    ldflags = [ "-Wl,--version-script=" +
                rebase_path("//mojo/core/export_only_thunks_api.lst",
                            root_build_dir) ]
  }

  if (is_chromeos || is_linux || is_win) {
    test("mojo_core_unittests") {
      sources = [
        "mojo_core_unittest.cc",
        "run_all_core_unittests.cc",
      ]

      deps = [
        "//base",
        "//base/test:test_support",
        "//mojo/public/c/system",
        "//mojo/public/cpp/platform",
        "//mojo/public/cpp/system",
        "//testing/gtest",
      ]

      data_deps = [
        ":shared_library",
      ]
    }
  }
}

source_set("test_utils") {
  testonly = true

  sources = [
    "test_utils.cc",
    "test_utils.h",
  ]

  public_deps = [
    "//mojo/public/c/system",
    "//mojo/public/cpp/system",
  ]

  deps = [
    "//base",
    "//base/test:test_support",
    "//mojo/core/test:test_support",
    "//testing/gtest:gtest",
  ]
}

source_set("test_sources") {
  testonly = true
  sources = [
    "channel_unittest.cc",
    "core_test_base.cc",
    "core_test_base.h",
    "core_unittest.cc",
    "embedder_unittest.cc",
    "handle_table_unittest.cc",
    "message_pipe_unittest.cc",
    "message_unittest.cc",
    "options_validation_unittest.cc",
    "platform_handle_dispatcher_unittest.cc",
    "quota_unittest.cc",
    "shared_buffer_dispatcher_unittest.cc",
    "shared_buffer_unittest.cc",
    "signals_unittest.cc",
    "trap_unittest.cc",
  ]

  if (!is_ios) {
    sources += [
      "data_pipe_unittest.cc",
      "invitation_unittest.cc",
      "multiprocess_message_pipe_unittest.cc",
      "platform_wrapper_unittest.cc",
    ]
  }

  deps = [
    ":test_utils",
    "//base",
    "//base/test:test_support",
    "//mojo/core:embedder_internal",
    "//mojo/core/embedder",
    "//mojo/core/ports:tests",
    "//mojo/core/test:run_all_unittests",
    "//mojo/core/test:test_support",
    "//mojo/public/cpp/system",
    "//testing/gmock",
    "//testing/gtest",
  ]
}
