# 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 (current_cpu != "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 (current_cpu == "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 (current_cpu == "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 (current_cpu == "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_coding",
    "modules/video_processing",
    "system_wrappers",
    "tools",
    "video",
    "video_engine",
    "voice_engine",
  ]

  if (build_with_chromium) {
    deps += [
    "modules/video_capture",
    "modules/video_render",
    ]
  }
}

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.cc",
    "common_types.h",
    "config.h",
    "config.cc",
    "engine_configurations.h",
    "typedefs.h",
  ]

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

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