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

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