chromium/chromecast/chromecast.gni

# Copyright 2015 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//build/config/cast.gni")
import("//build/config/locales.gni")
import("//components/cast_streaming/features.gni")
import("//media/media_options.gni")

# These args blocks should contain arguments used within the //chromecast
# directory. Arguments which are used in other Chrome components should
# be instead declared in //build/config/cast.gni.
declare_args() {
  # True if Chromecast build is targeted for linux desktop. This type of build
  # is useful for testing and development, but currently supports only a subset
  # of Cast functionality. Though this defaults to true for x86 Linux devices,
  # this should be overridden manually for an embedded x86 build.
  is_cast_desktop_build =
      target_os == "linux" && (target_cpu == "x86" || target_cpu == "x64") &&
      enable_cast_receiver

  # chromecast_branding is used to include or exclude Google-branded components.
  # Set it to "public" for a Chromium build.
  chromecast_branding = "public"
}

declare_args() {
  # If true, IS_CAST_DEBUG_BUILD() will evaluate to 1 in version.h. Otherwise,
  # it will evaluate to 0. Overriding this when is_debug=false is useful for
  # doing engineering builds.
  cast_is_debug = is_debug

  # The incremental build number. The Cast automated builders will set this
  # value to indicate the buildset. Note: The default value should be greater
  # than any value the builder may assign to prevent attempted automatic updates
  # when the default value is used.
  cast_build_incremental = "999999"

  # Set true to enable assistant features.
  enable_assistant = false

  # Set to true if there is a full mixer implementation; if not, we create a
  # shim mixer service receiver that pushes audio to the CMA backend.
  have_full_mixer = is_cast_audio_only

  # If true, the mixer will be instantiated inside cast_shell. When false, the
  # mixer is expected to be running in another process.
  mixer_in_cast_shell = true

  # Set to true on devices where the VolumeControl implementation is in the
  # libcast_avsettings_1.0.so instead of in libcast_media_1.0.so.
  cast_volume_control_in_avsettings = false

  # Set to true for builds targeting ARC.
  is_android_arc = false

  if (is_android) {
    # Set to true to get logcat from a remote service
    # If false, will only get the logs of the app.
    use_remote_service_logcat = false
  }

  # Set to true to enable a CMA media backend that allows mixed audio to be
  # output with sync'd video.
  enable_video_with_mixed_audio = false

  # unified flag to pick monotonic_clock OR monotonic_clock_raw
  media_clock_monotonic_raw = !is_android && !is_cast_desktop_build

  # Include 'Android' in user agent string to avoid being served desktop
  # versions of websites.
  # TODO(halliwell): consider making this default for all Cast hardware.
  use_android_user_agent = false

  # Contain default command line switches we want to set.
  # This will get joined into a comma-separated list that looks like:
  #   "test-flag-one=public,test-flag-two=true,test-flag-three=1,"
  # TODO(ziyangch): make the parsing logic have ability to quote/escape characters.
  default_command_line_flags = []

  # Set to true to disable secure flac/opus support in EME, when using
  # cast CMA media backend and supporting Widevine or Playready.
  disable_secure_flac_and_opus_decoding = false

  # Set to true to enable mixing in CastAudioManager. Only needed on devices
  # that do not have a mixer in the CMA backend.
  enable_cast_audio_manager_mixer =
      chromecast_branding == "google" && !is_cast_audio_only && !is_android

  # Set to true to enable video capture service for video input and output.
  enable_video_capture_service = false

  # Set to true to enable external Mojo services to communicate with services
  # within cast_shell.
  enable_external_mojo_services = is_linux || is_chromeos || is_android

  # Support using system perfetto tracing
  enable_perfetto_tracing = false

  # Support using system perfetto tracing
  enable_perfetto_tracing = false

  # Recording happens at this sample rate. Must be 16000, 48000 or 96000 Hz.
  audio_input_sample_rate = 16000

  # Whether use unix sockets in Cast input/output stream.
  use_unix_sockets = is_linux || is_chromeos || is_android

  # Set to true to enable audio capture service for audio input.
  enable_audio_capture_service = false

  # Extra rpath to use for standalone services.
  iot_service_rpath = ""

  # Set to true to enable media overlay for volume bar, etc.
  enable_media_overlay = false

  # Set to true to forward crashes to the system's crash handler instead of
  # handling them internally.  This disables the built-in crash handler.
  use_system_crash_handler = false

  # True to use the Chromium runtime for cast rendering.
  enable_chromium_runtime_cast_renderer = false

  # True to use the remoting implementation of cast streaming for the cast web
  # runtime (as opposed to the mirroring-only implementation).
  enable_remoting_for_cwr = false

  # device specific string to append to User string.
  device_user_agent_suffix = ""

  # link vendor-supplied functionality as shared libraries. When true,
  # cast_shared_library targets are normal shared libraries. When false,
  # they become source_sets.
  use_vendor_shlibs = !is_android

  # build APKs/bundles for the listed device types. Each APK has different
  # features enabled in its manifest to ensure it is only distributed to select
  # devices.
  android_device_types = [
    "generic",
    "atv",
    "tablet",
    "automotive",
  ]

  # Use Starboard graphics backend. Compile it in statically.
  enable_starboard_graphics = false

  # Build Starboard graphics backend as shared library.
  starboard_graphics_is_shared = false

  # Use Starboard media backend.
  enable_starboard_media = false
}

declare_args() {
  # Use Playready CDMs for internal non-desktop builds.
  enable_playready = !is_cast_desktop_build && chromecast_branding != "public"
}

# This is the release version, which takes the form <major>.<minor>. Internal
# builds will read the value from an internal file containing this value as a
# string. Public builds, lacking this file, will set a dummy value.
if (chromecast_branding == "public") {
  cast_build_release = "eng." + getenv("USER")
} else {
  cast_build_release =
      read_file("//chromecast/internal/build/cast_build_release", "trim string")
}

# All locales supported by Cast builds. This provides a single point of
# reference for all GN files referencing a locales list.
# |locales_without_pseudolocales| is declared in //build/config/locales.gni.
# See https://chromium-review.googlesource.com/488166/ for why we can't use
# pseudolocales in chromecast.
cast_locales = locales_without_pseudolocales

# Android currently supports more locales than Desktop and ChromeOS.
# If Cast will also the android files update this and the Cast grd files.
if (is_android) {
  # Subtract out additional Android locales
  cast_locales -= extended_locales
}
if (!(is_ios || is_chromeos)) {
  # Subtract out the additional desktop locales
  cast_locales -= [
    "af",
    "ur",
  ]
}

# Use Chromecast CDMs for protected content. Some Android platforms use
# MediaDrm for CDM support.
declare_args() {
  use_chromecast_cdms = true
}

foreach(target_type,
        [
          "executable",
          "loadable_module",
          "source_set",
        ]) {
  template("cast_${target_type}") {
    target(target_type, target_name) {
      forward_variables_from(invoker, "*", TESTONLY_AND_VISIBILITY)
      forward_variables_from(invoker, [ "testonly" ])

      configs += [ "//chromecast:cast_config" ]
    }
  }
}

template("cast_shared_library") {
  if (use_vendor_shlibs) {
    target_type = "shared_library"
  } else {
    target_type = "source_set"
  }
  target(target_type, target_name) {
    forward_variables_from(invoker, "*", TESTONLY_AND_VISIBILITY)
    forward_variables_from(invoker, [ "testonly" ])

    configs += [ "//chromecast:cast_config" ]
  }
}

# Set the defaults for each target. The defaults for these target wrappers
# should match their unwrapped counterparts in BUILDCONFIG.gn. The variables
# referenced below are declared in BUILDCONFIG.gn.
set_defaults("cast_executable") {
  configs = default_executable_configs
}

set_defaults("cast_shared_library") {
  configs = default_shared_library_configs
  if (is_android) {
    configs -= [ "//build/config/android:hide_all_but_jni_onload" ]
  }
}

set_defaults("cast_loadable_module") {
  configs = default_shared_library_configs
  if (is_android) {
    configs -= [ "//build/config/android:hide_all_but_jni_onload" ]
  }
}

set_defaults("cast_source_set") {
  configs = default_compiler_configs
}