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

declare_args() {
  # Assume Chromium build for now, since that's the priority case for getting GN
  # up and running with WebRTC.
  build_with_chromium = true
  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_json = true
  rtc_build_libjpeg = true
  rtc_build_libyuv = true
  rtc_build_libvpx = true
  rtc_build_vp9 = 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_chromium) {
    # Exclude pulse audio on Chromium since its prerequisites don't require
    # pulse audio.
    rtc_include_pulse_audio = false

    # Exclude internal ADM since Chromium uses its own IO handling.
    rtc_include_internal_audio_device = false

  } else {
    # Settings for the standalone (not-in-Chromium) build.

    # TODO(andrew): For now, disable the Chrome plugins, which causes a
    # flood of chromium-style warnings. Investigate enabling them:
    # http://code.google.com/p/webrtc/issues/detail?id=163
    clang_use_chrome_plugins = false

    rtc_include_pulse_audio = true
    rtc_include_internal_audio_device = true
  }

  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
  }

  # WebRTC builds ARM v7 Neon instruction set optimized code for both iOS and
  # Android, which is why we currently cannot use the variables in
  # //build/config/arm.gni (since it disables Neon for Android).
  rtc_build_armv7_neon = (current_cpu == "arm" && arm_version >= 7)
}

# 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"
rtc_libyuv_dir = "//third_party/libyuv"
rtc_opus_dir = "//third_party/opus"
