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

# 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_egltest) {
  ozone_platforms += [ "egltest" ]
  ozone_platform_deps += [ "platform/egltest" ]
}

if (ozone_platform_test) {
  ozone_platforms += [ "test" ]
  ozone_platform_deps += [ "platform/test" ]
}

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

if (ozone_platform_dri) {
  ozone_platforms += [ "dri" ]
  ozone_platform_deps += [ "platform/dri" ]
  ozone_platform_test_deps += [ "platform/dri:dri_unittests" ]
}

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

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"

# 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/overlay_candidates_ozone.cc",
    "public/overlay_candidates_ozone.h",
    "public/surface_factory_ozone.cc",
    "public/surface_factory_ozone.h",
    "public/surface_ozone_canvas.h",
    "public/surface_ozone_egl.h",
  ]

  defines = [ "OZONE_BASE_IMPLEMENTATION" ]

  deps = [
    "//base",
    "//skia",
    "//ui/gfx/geometry",
  ]
}

component("ozone") {
  sources = [
    platform_list_cc_file,
    platform_list_h_file,
    constructor_list_cc_file,

    "common/display_mode_proxy.cc",
    "common/display_mode_proxy.h",
    "common/display_snapshot_proxy.cc",
    "common/display_snapshot_proxy.h",
    "common/display_util.cc",
    "common/display_util.h",
    "common/gpu/ozone_gpu_message_generator.cc",
    "common/gpu/ozone_gpu_message_generator.h",
    "common/gpu/ozone_gpu_message_params.cc",
    "common/gpu/ozone_gpu_message_params.h",
    "common/gpu/ozone_gpu_messages.h",
    "common/native_display_delegate_ozone.cc",
    "common/native_display_delegate_ozone.h",
    "public/ozone_platform.cc",
    "public/ozone_platform.h",
    "public/ozone_switches.cc",
    "public/ozone_switches.h",
    "public/ui_thread_gpu.cc",
    "public/ui_thread_gpu.h",
    "platform_selection.cc",
    "platform_selection.h",
  ]

  defines = [ "OZONE_IMPLEMENTATION" ]

  deps = [
    ":generate_constructor_list",
    ":generate_ozone_platform_list",
    ":ozone_base",
    "//base",
    "//ipc",
    "//skia",
    "//ui/display/types",
    "//ui/events",
    "//ui/events/ozone:events_ozone",
    "//ui/gfx",
    "//ui/gfx/geometry",
    "//ui/gfx/ipc",
    # TODO(GYP) the GYP version has a way to add additional dependencies via
    # build flags.
  ] + ozone_platform_deps

}

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

# GYP version: ui/ozone/ozone.gyp:generate_constructor_list
action("generate_constructor_list") {
  script = "generate_constructor_list.py"

  source_prereqs = [
    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",
    "--include=\"ui/ozone/public/ozone_platform.h\"",
  ]

  deps = [ ":generate_ozone_platform_list" ]
}

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

  deps = [
    "//base/test:test_support",
    "//testing/gtest",
  ] + ozone_platform_test_deps
}
