# Copyright 2017 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.

if (!is_ios) {
  # iOS embeds the Service Manager but does not use anything in this library.
  # This avoids having an empty component library target, which can otherwise be
  # problematic.
  component("embedder") {
    public = [
      "main.h",
      "main_delegate.h",
      "process_type.h",
      "set_process_title.h",
      "set_process_title_linux.h",
      "shared_file_util.h",
    ]

    sources = [
      "main.cc",
      "main_delegate.cc",
      "set_process_title.cc",
      "set_process_title_linux.cc",
      "shared_file_util.cc",
    ]

    if (is_mac) {
      sources += [
        "mac_init.h",
        "mac_init.mm",
      ]

      libs = [ "Foundation.framework" ]
    }

    deps = [
      "//base:base_static",
      "//base:i18n",
      "//base/allocator:buildflags",
      "//components/tracing:startup_tracing",
    ]

    public_deps = [
      ":embedder_result_codes",
      ":embedder_switches",
      "//base",
      "//mojo/core/embedder",
      "//services/service_manager",
      "//services/service_manager/public/cpp",
      "//services/service_manager/public/cpp/service_executable:support",
      "//services/service_manager/public/cpp/service_executable:switches",
      "//services/service_manager/public/mojom",
    ]

    if (!is_nacl) {
      # NaCl stuff should not depend on skia as it would require platform and
      # cpu properties set.
      deps += [ "//ui/base" ]
    }

    defines = [ "IS_SERVICE_MANAGER_EMBEDDER_IMPL" ]
  }
}

component("embedder_switches") {
  sources = [
    "switches.cc",
    "switches.h",
  ]
  deps = [ "//base" ]
  defines = [ "IS_SERVICE_MANAGER_EMBEDDER_SWITCHES_IMPL" ]
}

source_set("embedder_result_codes") {
  sources = [ "result_codes.h" ]
}
