# Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
#
# Use of this source code is governed by a BSD-style license
# that can be found in the LICENSE file in the root of the source
# tree. An additional intellectual property rights grant can be found
# in the file PATENTS.  All contributing project authors may
# be found in the AUTHORS file in the root of the source tree.

import("//build/config/arm.gni")
import("//build/config/mips.gni")
import("//build_overrides/webrtc.gni")

declare_args() {
  build_with_libjingle = true

  # Disable this to avoid building the Opus audio codec.
  rtc_include_opus = true

  # Used to specify an external Jsoncpp include path when not compiling the
  # library that comes with WebRTC (i.e. rtc_build_json == 0).
  rtc_jsoncpp_root = "//third_party/jsoncpp/source/include"

  # Used to specify an external OpenSSL include path when not compiling the
  # library that comes with WebRTC (i.e. rtc_build_ssl == 0).
  rtc_ssl_root = ""

  # Selects fixed-point code where possible.
  rtc_prefer_fixed_point = false

  # Enable data logging. Produces text files with data logged within engines
  # which can be easily parsed for offline processing.
  rtc_enable_data_logging = false

  # Enables the use of protocol buffers for debug recordings.
  rtc_enable_protobuf = true

  # Disable these to not build components which can be externally provided.
  rtc_build_expat = true
  rtc_build_icu = true
  rtc_build_json = true
  rtc_build_libjpeg = true
  rtc_build_libvpx = true
  rtc_build_libyuv = true
  rtc_build_openmax_dl = true
  rtc_build_opus = true
  rtc_build_ssl = true
  rtc_build_vp9 = true

  # Disable by default.
  rtc_have_dbus_glib = false

  # Enable to use the Mozilla internal settings.
  build_with_mozilla = false

  rtc_enable_android_opensl = false

  # Link-Time Optimizations.
  # Executes code generation at link-time instead of compile-time.
  # https://gcc.gnu.org/wiki/LinkTimeOptimization
  rtc_use_lto = false

  if (build_with_libjingle) {
    rtc_include_tests = false
    rtc_restrict_logging = true
  } else {
    rtc_include_tests = true
    rtc_restrict_logging = false
  }

  if (is_ios) {
    rtc_build_libjpeg = false
    rtc_enable_protobuf = false
  }

  if (current_cpu == "arm") {
    rtc_prefer_fixed_point = true
  }

  # TODO(ljubomir): Unset rtc_use_openmax_dl for mips64el once mips64el gets
  # supported in GN (since openmax_dl is not supported for mips64el).
  if (!is_ios && (current_cpu != "arm" || arm_version >= 7)) {
    rtc_use_openmax_dl = true
  } else {
    rtc_use_openmax_dl = false
  }

  # Determines whether NEON code will be built.
  rtc_build_with_neon =
      (current_cpu == "arm" && (arm_use_neon || arm_optionally_use_neon)) ||
      current_cpu == "arm64"

  # Enable this to use HW H.264 encoder/decoder on iOS PeerConnections.
  # Enabling this may break interop with Android clients that support H264.
  rtc_use_objc_h264 = false
}

# Make it possible to provide custom locations for some libraries (move these
# up into declare_args should we need to actually use them for the GN build).
rtc_libvpx_dir = "//third_party/libvpx_new"
rtc_libyuv_dir = "//third_party/libyuv"
rtc_opus_dir = "//third_party/opus"
