# 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/chromecast_build.gni")
import("//build/config/ui.gni")

declare_args() {
  # Ozone extra platforms file path. Can be overridden to build out of
  # tree ozone platforms.
  ozone_extra_path = "//ui/ozone/ozone_extra.gni"

  # Select platforms automatically. Turn this off for manual control.
  ozone_auto_platforms = use_ozone
}

declare_args() {
  # The platform that will used at runtime by default. This can be overridden
  # with the command line flag --ozone-platform=<platform>.
  ozone_platform = ""

  # Compile the 'cast' platform.
  ozone_platform_cast = false

  # Compile the 'gbm' platform.
  ozone_platform_gbm = false

  # Compile the 'headless' platform.
  ozone_platform_headless = false

  # Compile the 'scenic' platform.
  ozone_platform_scenic = false

  # Compile the 'x11' platform.
  ozone_platform_x11 = false

  # Compile the 'wayland' platform.
  ozone_platform_wayland = false

  # Compile the 'windows' platform.
  ozone_platform_windows = false

  # Compile the 'magma' platform.
  ozone_platform_magma = false

  if (ozone_auto_platforms) {
    # Use headless as the default platform unless modified below.
    ozone_platform = "headless"
    ozone_platform_headless = true

    if (is_cast_audio_only) {
      # Just use headless for audio-only Cast platforms.
    } else if (is_chromecast && !is_fuchsia) {
      # Enable the Cast ozone platform on all A/V Cast builds except Fuchsia.
      ozone_platform_cast = true

      # For visual desktop Chromecast builds, override the default "headless"
      # platform with --ozone-platform=x11.
      # TODO(halliwell): Create a libcast_graphics implementation for desktop
      # using X11, and disable this platform.
      if (is_cast_desktop_build && !is_cast_audio_only) {
        ozone_platform_x11 = true
      } else {
        ozone_platform = "cast"
      }
    } else if (is_chromeos) {
      ozone_platform = "x11"
      ozone_platform_gbm = true
      ozone_platform_x11 = true
    } else if (is_desktop_linux) {
      ozone_platform = "x11"
      ozone_platform_wayland = true
      ozone_platform_x11 = true
    } else if (is_win) {
      ozone_platform = "windows"
      ozone_platform_windows = true
    } else if (is_fuchsia) {
      ozone_platform = "scenic"
      ozone_platform_scenic = true
      ozone_platform_magma = true
    }
  }
}

import(ozone_extra_path)

_ozone_extra_directory = get_path_info(ozone_extra_path, "dir")

# Extra paths to add to targets visibility list.
ozone_external_platform_visibility = [ "$_ozone_extra_directory/*" ]

assert(use_ozone || !(ozone_platform_cast || ozone_platform_gbm ||
                          ozone_platform_headless || ozone_platform_x11 ||
                          ozone_platform_wayland || ozone_platform_windows ||
                          ozone_platform_magma || ozone_platform_scenic),
       "Must set use_ozone to select ozone platforms")
