# 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/ui.gni")
import("//ui/ozone/ozone.gni")
import("//testing/test.gni")

assert(use_ozone)

visibility = [ ":*" ]

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

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

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

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

if (ozone_platform_caca) {
  ozone_platforms += [ "caca" ]
  ozone_platform_deps += [ "platform/caca" ]
}

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" ]
}

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"

config("vgem_map") {
  if (use_vgem_map) {
    defines = [ "USE_VGEM_MAP" ]
  }
}

# GYP version: ui/ozone/ozone.gyp:ozone_base
component("ozone_base") {
  sources = [
    "public/cursor_factory_ozone.cc",
    "public/cursor_factory_ozone.h",
    "public/gpu_platform_support.cc",
    "public/gpu_platform_support.h",
    "public/gpu_platform_support_host.cc",
    "public/gpu_platform_support_host.h",
    "public/input_controller.cc",
    "public/input_controller.h",
    "public/native_pixmap.h",
    "public/overlay_candidates_ozone.cc",
    "public/overlay_candidates_ozone.h",
    "public/overlay_manager_ozone.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/surface_ozone_egl.cc",
    "public/surface_ozone_egl.h",
    "public/system_input_injector.h",
  ]

  defines = [ "OZONE_BASE_IMPLEMENTATION" ]

  public_deps = [
    "//base",
    "//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/geometry",
    "//ui/gfx/ipc/skia",
    "//ui/gl",
  ]

  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/gl",
    "//ui/ozone/platform/*",
    "//ui/ozone/common/*",
  ]
}

source_set("platform") {
  sources = [
    "common/stub_client_native_pixmap_factory.cc",
    "common/stub_client_native_pixmap_factory.h",
    "platform_selection.cc",
    "platform_selection.h",
    "public/client_native_pixmap_factory.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.h",
    "public/ozone_gpu_test_helper.h",
    "public/ozone_platform.h",
  ]

  defines = [ "OZONE_IMPLEMENTATION" ]

  public_deps = [
    ":ozone_base",
    "//base",
    "//ipc",
    "//skia",
    "//ui/display/types",
    "//ui/events",
    "//ui/events/devices",
    "//ui/gfx",
    "//ui/gfx/geometry",
    "//ui/ozone/gl",
    "//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/*" ]
}

component("ozone") {
  visibility = []
  visibility = [ "*" ]
  public_deps = [
    ":platform",
  ]
}

# GYP version: ui/ozone/ozone.gyp:generate_ozone_platform_list
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:*" ]
}

# GYP version: ui/ozone/ozone.gyp:generate_constructor_list
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",
    "--include=\"ui/ozone/public/ozone_platform.h\"",
    "--include=\"ui/ozone/public/client_native_pixmap_factory.h\"",
  ]

  deps = [
    ":generate_ozone_platform_list",
  ]
}

test("ozone_unittests") {
  sources = [
    "run_all_unittests.cc",
  ]

  deps = [
    "//base/test:test_support",
    "//testing/gtest",
    "//ui/gfx/geometry",
  ]

  # 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" ]
}
