# 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("//build/config/jumbo.gni")
import("//build/config/ui.gni")
import("//gpu/vulkan/features.gni")
import("//ui/ozone/ozone.gni")
import("//ui/ozone/ozone_extra.gni")
import("//testing/test.gni")

assert(use_ozone)

visibility = [ ":*" ]

# The list of platforms that will be built.
ozone_platforms = ozone_external_platforms

# Extra dependencies to pull into ui/ozone for built platforms.
ozone_platform_deps = ozone_external_platform_deps

# Extra dependencies to pull into ozone_unittests for built platforms.
ozone_platform_test_deps = ozone_external_platform_test_deps

if (ozone_platform_magma) {
  ozone_platforms += [ "magma" ]
  ozone_platform_deps += [ "platform/magma" ]
}

if (ozone_platform_windows) {
  ozone_platforms += [ "windows" ]
  ozone_platform_deps += [ "platform/windows" ]
}

if (ozone_platform_headless) {
  ozone_platforms += [ "headless" ]
  ozone_platform_deps += [ "platform/headless" ]
}

if (ozone_platform_gbm) {
  ozone_platforms += [ "gbm" ]
  ozone_platform_deps += [ "platform/drm:gbm" ]
  ozone_platform_test_deps += [ "platform/drm:gbm_unittests" ]
}

if (ozone_platform_cast) {
  ozone_platforms += [ "cast" ]
  ozone_platform_deps += [ "platform/cast" ]
}

if (ozone_platform_wayland) {
  ozone_platforms += [ "wayland" ]
  ozone_platform_deps += [ "platform/wayland" ]
  ozone_platform_test_deps += [ "platform/wayland:wayland_unittests" ]
}

if (ozone_platform_x11) {
  ozone_platforms += [ "x11" ]
  ozone_platform_deps += [ "platform/x11" ]
}

if (ozone_platform_scenic) {
  ozone_platforms += [ "scenic" ]
  ozone_platform_deps += [ "platform/scenic" ]
}

platform_list_cc_file = "$target_gen_dir/platform_list.cc"
platform_list_h_file = "$target_gen_dir/platform_list.h"
platform_list_txt_file = "$target_gen_dir/platform_list.txt"
constructor_list_cc_file = "$target_gen_dir/constructor_list.cc"

jumbo_component("ozone_base") {
  sources = [
    "ozone_base_export.h",
    "public/clipboard_delegate.h",
    "public/cursor_factory_ozone.cc",
    "public/cursor_factory_ozone.h",
    "public/gl_ozone.h",
    "public/gpu_platform_support_host.cc",
    "public/gpu_platform_support_host.h",
    "public/input_controller.cc",
    "public/input_controller.h",
    "public/overlay_candidates_ozone.cc",
    "public/overlay_candidates_ozone.h",
    "public/overlay_manager_ozone.h",
    "public/overlay_plane.cc",
    "public/overlay_plane.h",
    "public/overlay_surface.cc",
    "public/overlay_surface.h",
    "public/overlay_surface_candidate.cc",
    "public/overlay_surface_candidate.h",
    "public/ozone_switches.cc",
    "public/ozone_switches.h",
    "public/surface_factory_ozone.cc",
    "public/surface_factory_ozone.h",
    "public/surface_ozone_canvas.h",
    "public/swap_completion_callback.h",
  ]

  defines = [ "OZONE_BASE_IMPLEMENTATION" ]

  public_deps = [
    "//base",
    "//gpu/vulkan:buildflags",
    "//ipc",
    "//skia",
    "//ui/display/types",
    "//ui/display/util",
    "//ui/events",
    "//ui/events:dom_keycode_converter",
    "//ui/gfx",
    "//ui/gfx/geometry",
    "//ui/gfx/ipc",
    "//ui/gfx/ipc/buffer_types",
    "//ui/gfx/ipc/geometry",
    "//ui/gfx/ipc/skia",
    "//ui/gl",
  ]

  if (enable_vulkan) {
    public_deps += [ "//gpu/vulkan" ]
  }

  visibility += [
    # Everyone should depend on //ui/ozone instead except a handful of
    # things that would otherwise create a cycle.
    "//ui/base",
    "//ui/events/ozone/*",
    "//ui/ozone/common/*",
    "//ui/ozone/public/interfaces",
    "//ui/ozone/platform/*",
  ]
}

source_set("platform") {
  sources = [
    "common/stub_client_native_pixmap_factory.cc",
    "common/stub_client_native_pixmap_factory.h",
    "ozone_export.h",
    "platform_constructor_list.h",
    "platform_object.h",
    "platform_object_internal.h",
    "platform_selection.cc",
    "platform_selection.h",
    "public/client_native_pixmap_factory_ozone.cc",
    "public/ozone_gpu_test_helper.cc",
    "public/ozone_platform.cc",
    constructor_list_cc_file,
    platform_list_cc_file,
    platform_list_h_file,
  ]

  public = [
    "public/client_native_pixmap_factory_ozone.h",
    "public/ozone_gpu_test_helper.h",
    "public/ozone_platform.h",
  ]

  defines = [ "OZONE_IMPLEMENTATION" ]

  public_deps = [
    ":ozone_base",
    "//base",
    "//ipc",
    "//services/service_manager/public/cpp",
    "//skia",
    "//ui/display/types",
    "//ui/events",
    "//ui/events/devices",
    "//ui/gfx",
    "//ui/gfx/geometry",
    "//ui/platform_window",
  ]

  deps = [
    ":generate_constructor_list",
    ":generate_ozone_platform_list",
  ]

  deps += ozone_platform_deps

  # Platforms are always linked into //ui/ozone and can include our headers.
  allow_circular_includes_from = ozone_platform_deps

  # This is used for platform tests.
  visibility += [ "//ui/ozone/platform/*" ]
}

jumbo_component("ozone") {
  visibility = []
  visibility = [ "*" ]
  public_deps = [
    ":platform",
    "//ui/ozone/public/interfaces",
  ]
}

jumbo_source_set("test_support_internal") {
  testonly = true

  sources = [
    "test/mock_platform_window_delegate.cc",
    "test/mock_platform_window_delegate.h",
  ]

  configs += [ "//build/config:precompiled_headers" ]

  deps = [
    "//mojo/core/test:run_all_unittests",
    "//mojo/public/cpp/bindings",
    "//testing/gmock",
    "//testing/gtest",
    "//ui/gfx:test_support",
    "//ui/gfx/geometry",
    "//ui/ozone/public/interfaces:struct_trait_unit_test",
    "//ui/platform_window:platform_window",
  ]

  public_deps = [
    "//base/test:test_support",
  ]
}

jumbo_static_library("test_support") {
  testonly = true
  public_deps = [
    ":test_support_internal",
  ]
}

action("generate_ozone_platform_list") {
  script = "generate_ozone_platform_list.py"
  outputs = [
    platform_list_cc_file,
    platform_list_h_file,
    platform_list_txt_file,
  ]

  args =
      [
        "--output_cc=" + rebase_path(platform_list_cc_file, root_build_dir),
        "--output_h=" + rebase_path(platform_list_h_file, root_build_dir),
        "--output_txt=" + rebase_path(platform_list_txt_file, root_build_dir),
        "--default=$ozone_platform",
      ] + ozone_platforms

  visibility += [ "//media:*" ]
}

action("generate_constructor_list") {
  script = "generate_constructor_list.py"

  inputs = [
    platform_list_txt_file,
  ]
  outputs = [
    constructor_list_cc_file,
  ]

  args = [
    "--platform_list=" + rebase_path(platform_list_txt_file, root_build_dir),
    "--output_cc=" + rebase_path(constructor_list_cc_file, root_build_dir),
    "--namespace=ui",
    "--typename=OzonePlatform",
    "--typename=ClientNativePixmapFactory",
    "--using=gfx::ClientNativePixmapFactory",
    "--include=\"ui/gfx/client_native_pixmap_factory.h\"",
    "--include=\"ui/ozone/public/ozone_platform.h\"",
  ]

  deps = [
    ":generate_ozone_platform_list",
  ]
}

test("ozone_unittests") {
  deps = [
    ":test_support",
  ]

  # Add tests of platform internals.
  deps += ozone_platform_test_deps

  # Platform tests link ozone statically. Make sure we're not getting a
  # 2nd copy of any code via the component.
  assert_no_deps = [ "//ui/ozone" ]
}

# X11 backend has its own test suite only built when we are using the x11
# backend.
if (ozone_platform_x11) {
  test("ozone_x11_unittests") {
    deps = [
      ":test_support",
    ]

    deps += [ "platform/x11:x11_unittests" ]

    # Platform tests link ozone statically. Make sure we're not getting a
    # 2nd copy of any code via the component.
    assert_no_deps = [ "//ui/ozone" ]
  }
}
