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

# =============================================
#   PLEASE DO NOT ADD MORE FLAGS TO THIS FILE
# =============================================
#
# These flags are effectively global. Your feature flag should go near the
# code it controls. Most of these items are here now because they control
# legacy global #defines passed to the compiler (now replaced with generated
# buildflag headers -- see //build/buildflag_header.gni).
#
# There is more advice on where to put build flags in the "Build flag" section
# of //build/config/BUILDCONFIG.gn.

import("//build/config/cast.gni")
import("//build/config/chrome_build.gni")

declare_args() {
  # Enables proprietary codecs and demuxers; e.g. H264, AAC, MP3, and MP4.
  # We always build Google Chrome and Chromecast with proprietary codecs.
  #
  # Note: this flag is used by WebRTC which is DEPSed into Chrome. Moving it
  # out of //build will require using the build_overrides directory.
  #
  # Do not add any other conditions to the following line.
  #
  # TODO(crbug.com/1314528): Remove chromecast-related conditions and force
  # builds to explicitly specify this.
  proprietary_codecs = is_chrome_branded || is_castos || is_cast_android ||
                       is_chrome_for_testing_branded

  # libudev usage. This currently only affects the content layer.
  use_udev = (is_linux && !is_castos) || is_chromeos

  use_dbus = is_linux || is_chromeos

  use_gio = is_linux && !is_castos

  use_blink = !is_ios
}
#
# =============================================
#   PLEASE DO NOT ADD MORE FLAGS TO THIS FILE
# =============================================
#
# See comment at the top.
