# 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 (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_float_abi == "hard") {
      defines += [ "MIPS_FPU_LE" ]
    }
    if (mips_arch_variant == "r2") {
      defines += [ "MIPS32_R2_LE" ]
    }
    if (mips_dsp_rev == 1) {
      defines += [ "MIPS_DSP_R1_LE" ]
    } else if (mips_dsp_rev == 2) {
      defines += [
        "MIPS_DSP_R1_LE",
        "MIPS_DSP_R2_LE",
      ]
    }
  }

  # 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",
  ]
}
