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

# TODO(kjellander): Rebase this to webrtc/build/common.gypi changes after r6330.

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",
    ]
    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 (rtc_enable_android_opensl) {
      defines += [ "WEBRTC_ANDROID_OPENSLES" ]
    }
  }
}

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

config("common_config") {
  cflags = []
  cflags_cc = []
  if (rtc_restrict_logging) {
    defines = [ "WEBRTC_RESTRICT_LOGGING" ]
  }

  if (rtc_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 (rtc_enable_video) {
    defines += [ "WEBRTC_MODULE_UTILITY_VIDEO" ]
  }

  if (build_with_chromium) {
    defines += [ "LOGGING_INSIDE_WEBRTC" ]
  } else {
    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 == "arm64") {
    defines += [ "WEBRTC_ARCH_ARM" ]
    # TODO(zhongwei) Defining an unique WEBRTC_NEON and
    # distinguishing ARMv7 NEON and ARM64 NEON by
    # WEBRTC_ARCH_ARM_V7 and WEBRTC_ARCH_ARM64 should be better.

    # This macro is used to distinguish ARMv7 NEON and ARM64 NEON
    defines += [ "WEBRTC_ARCH_ARM64_NEON" ]
  }

  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 if (is_android) {
        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 == "r2") {
      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",
    ]
  }
}

source_set("webrtc") {
  sources = [
    "call.h",
    "config.h",
    "experiments.h",
    "frame_callback.h",
    "transport.h",
  ]

  configs += [ ":common_config" ]
  public_configs = [ ":common_inherited_config"]

  deps = [
    ":webrtc_common",
    "base:rtc_base",
    "common_audio",
    "common_video",
    "modules/audio_coding",
    "modules/audio_conference_mixer",
    "modules/audio_device",
    "modules/audio_processing",
    "modules/bitrate_controller",
    "modules/desktop_capture",
    "modules/media_file",
    "modules/rtp_rtcp",
    "modules/utility",
    "modules/video_capture",
    "modules/video_coding",
    "modules/video_processing",
    "modules/video_render",
    "system_wrappers",
    "tools",
    "video",
    "video_engine",
    "voice_engine",
  ]
}

if (!build_with_chromium) {
  executable("webrtc_tests") {
    testonly = true
    deps = [
      ":webrtc",
      "modules/video_render:video_render_internal_impl",
      "modules/video_capture:video_capture_internal_impl",
      "test",
    ]
  }
}

source_set("webrtc_common") {
  sources = [
    "common_types.h",
    "config.h",
    "config.cc",
    "engine_configurations.h",
    "typedefs.h",
  ]

  if (is_clang) {
    # Suppress warnings from Chrome's Clang plugins.
    # See http://code.google.com/p/webrtc/issues/detail?id=163 for details.
    configs -= [ "//build/config/clang:find_bad_constructs" ]
  }

  configs += [ ":common_config" ]
  public_configs = [ ":common_inherited_config" ]
}

source_set("gtest_prod") {
  sources = [
    "test/testsupport/gtest_prod_util.h",
  ]
}
