# 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/crypto.gni")
import("//build/config/linux/pkg_config.gni")
import("build/webrtc.gni")

# Contains the defines and includes in common.gypi that are duplicated both as
# target_defaults and direct_dependent_settings.
config("common_inherited_config") {
  defines = []
  if (build_with_mozilla) {
    defines += [ "WEBRTC_MOZILLA_BUILD" ]
  }
  if (build_with_chromium) {
    defines = [
      "WEBRTC_CHROMIUM_BUILD",
      "LOGGING_INSIDE_WEBRTC",
    ]
    include_dirs = [
      # overrides must be included first as that is the mechanism for
      # selecting the override headers in Chromium.
      "overrides",
      # Allow includes to be prefixed with webrtc/ in case it is not an
      # immediate subdirectory of the top-level.
      "..",
    ]
  }
  if (is_posix) {
    defines += [ "WEBRTC_POSIX" ]
  }
  if (is_ios) {
    defines += [
      "WEBRTC_MAC",
      "WEBRTC_IOS",
    ]
  }
  if (is_linux) {
    defines += [ "WEBRTC_LINUX" ]
  }
  if (is_mac) {
    defines += [ "WEBRTC_MAC" ]
  }
  if (is_win) {
    defines += [ "WEBRTC_WIN" ]
  }
  if (is_android) {
    defines += [
      "WEBRTC_LINUX",
      "WEBRTC_ANDROID",
    ]
    if (enable_android_opensl) {
      defines += [ "WEBRTC_ANDROID_OPENSLES" ]
    }
  }
}

pkg_config("dbus-glib") {
  packages = [ "dbus-glib-1" ]
}

config("common_config") {
  if (restrict_webrtc_logging) {
    defines = [ "WEBRTC_RESTRICT_LOGGING" ]
  }

  if (have_dbus_glib) {
    defines += [ "HAVE_DBUS_GLIB" ]
    # TODO(kjellander): Investigate this, it seems like include <dbus/dbus.h>
    # is still not found even if the execution of
    # build/config/linux/pkg-config.py dbus-glib-1 returns correct include
    # dirs on Linux.
    all_dependent_configs = [ "dbus-glib" ]
  }

  if (enable_video) {
    defines += [ "WEBRTC_MODULE_UTILITY_VIDEO" ]
  }

  if (!build_with_chromium) {
    if (is_posix) {
      # -Wextra is currently disabled in Chromium"s common.gypi. Enable
      # for targets that can handle it. For Android/arm64 right now
      # there will be an "enumeral and non-enumeral type in conditional
      # expression" warning in android_tools/ndk_experimental"s version
      # of stlport.
      # See: https://code.google.com/p/chromium/issues/detail?id=379699
      if (cpu_arch != "arm64" || !is_android) {
        cflags = [
          "-Wextra",
          # We need to repeat some flags from Chromium"s common.gypi
          # here that get overridden by -Wextra.
          "-Wno-unused-parameter",
          "-Wno-missing-field-initializers",
          "-Wno-strict-overflow",
        ]
        cflags_cc = [
          "-Wnon-virtual-dtor",
          # This is enabled for clang; enable for gcc as well.
          "-Woverloaded-virtual",
        ]
      }
    }

    if (is_clang) {
      cflags += [ "-Wthread-safety" ]
    }
  }

  if (cpu_arch == "arm") {
    defines += [ "WEBRTC_ARCH_ARM" ]
    if (arm_version == 7) {
      defines += [ "WEBRTC_ARCH_ARM_V7" ]
      if (arm_use_neon) {
        defines += [ "WEBRTC_ARCH_ARM_NEON" ]
      } else {
        defines += [ "WEBRTC_DETECT_ARM_NEON" ]
      }
    }
  }

  if (cpu_arch == "mipsel") {
    defines += [ "MIPS32_LE" ]
    if (mips_fpu) {
      defines += [ "MIPS_FPU_LE" ]
      cflags += [ "-mhard-float" ]
    } else {
      cflags += [ "-msoft-float" ]
    }
    if (mips_arch_variant == "mips32r2") {
      defines += [ "MIPS32_R2_LE" ]
      cflags += [ "-mips32r2" ]
      cflags_cc += [ "-mips32r2" ]
    }
    if (mips_dsp_rev == 1) {
      defines += [ "MIPS_DSP_R1_LE" ]
      cflags += [ "-mdsp" ]
      cflags_cc += [ "-mdsp" ]
    } else if (mips_dsp_rev == 2) {
      defines += [
        "MIPS_DSP_R1_LE",
        "MIPS_DSP_R2_LE",
      ]
      cflags += [ "-mdspr2" ]
      cflags_cc += [ "-mdspr2" ]
    }
  }

  # TODO(kjellander): Handle warnings on Windows where WebRTC differ from the
  # default warnings set in build/config/compiler/BUILD.gn.

  if (is_android && is_clang) {
    # The Android NDK doesn"t provide optimized versions of these
    # functions. Ensure they are disabled for all compilers.
    cflags += [
      "-fno-builtin-cos",
      "-fno-builtin-sin",
      "-fno-builtin-cosf",
      "-fno-builtin-sinf",
    ]
  }
}

static_library("webrtc") {
  deps = [
    "base:webrtc_base",
  ]
}
