# 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/linux/pkg_config.gni")
import("//build/config/sanitizers/sanitizers.gni")
import("build/webrtc.gni")
import("//testing/test.gni")
import("//third_party/protobuf/proto_library.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 = []
  cflags = []
  ldflags = []
  if (build_with_mozilla) {
    defines += [ "WEBRTC_MOZILLA_BUILD" ]
  }
  if (build_with_chromium) {
    defines = [
      # TODO(kjellander): Cleanup unused ones and move defines closer to
      # the source when webrtc:4256 is completed.
      "FEATURE_ENABLE_SSL",
      "FEATURE_ENABLE_VOICEMAIL",
      "EXPAT_RELATIVE_PATH",
      "GTEST_RELATIVE_PATH",
      "NO_MAIN_THREAD_WRAPPING",
      "NO_SOUND_SYSTEM",
      "WEBRTC_CHROMIUM_BUILD",
    ]
    include_dirs = [
      # The overrides must be included first as that is the mechanism for
      # selecting the override headers in Chromium.
      "../webrtc_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_ios && rtc_use_objc_h264) {
    defines += [ "WEBRTC_OBJC_H264" ]
  }
  if (is_linux) {
    defines += [ "WEBRTC_LINUX" ]
  }
  if (is_mac) {
    defines += [ "WEBRTC_MAC" ]
  }
  if (is_win) {
    defines += [
      "WEBRTC_WIN",
      "_CRT_SECURE_NO_WARNINGS",  # Suppress warnings about _vsnprinf
    ]
  }
  if (is_android) {
    defines += [
      "WEBRTC_LINUX",
      "WEBRTC_ANDROID",
    ]
  }
  if (is_chromeos) {
    defines += [ "CHROMEOS" ]
  }

  if (rtc_sanitize_coverage != "") {
    assert(is_clang, "sanitizer coverage requires clang")
    cflags += [ "-fsanitize-coverage=${rtc_sanitize_coverage}" ]
    ldflags += [ "-fsanitize-coverage=${rtc_sanitize_coverage}" ]
  }

  # TODO(GYP): Support these in GN.
  # if (is_bsd) {
  #   defines += [ "BSD" ]
  # }
  # if (is_openbsd) {
  #   defines += [ "OPENBSD" ]
  # }
  # if (is_freebsd) {
  #   defines += [ "FREEBSD" ]
  # }
}

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

config("common_config") {
  cflags = []
  cflags_cc = []
  defines = []

  if (rtc_restrict_logging) {
    defines += [ "WEBRTC_RESTRICT_LOGGING" ]
  }

  if (rtc_include_internal_audio_device) {
    defines += [ "WEBRTC_INCLUDE_INTERNAL_AUDIO_DEVICE" ]
  }

  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_relative_path) {
    defines += [ "EXPAT_RELATIVE_PATH" ]
  }

  if (build_with_chromium) {
    defines += [
      # NOTICE: Since common_inherited_config is used in public_configs for our
      # targets, there's no point including the defines in that config here.
      # TODO(kjellander): Cleanup unused ones and move defines closer to the
      # source when webrtc:4256 is completed.
      "ENABLE_EXTERNAL_AUTH",
      "HAVE_OPENSSL_SSL_H",
      "HAVE_SCTP",
      "HAVE_SRTP",
      "HAVE_WEBRTC_VIDEO",
      "HAVE_WEBRTC_VOICE",
      "LOGGING_INSIDE_WEBRTC",
      "SRTP_RELATIVE_PATH",
      "SSL_USE_OPENSSL",
      "USE_WEBRTC_DEV_BRANCH",
    ]
  } 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 += [
        "-Wimplicit-fallthrough",
        "-Wthread-safety",
        "-Winconsistent-missing-override",
      ]
    }
  }

  if (current_cpu == "arm64") {
    defines += [ "WEBRTC_ARCH_ARM64" ]
    defines += [ "WEBRTC_HAS_NEON" ]
  }

  if (current_cpu == "arm") {
    defines += [ "WEBRTC_ARCH_ARM" ]
    if (arm_version >= 7) {
      defines += [ "WEBRTC_ARCH_ARM_V7" ]
      if (arm_use_neon) {
        defines += [ "WEBRTC_HAS_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",
      ]
    }
  }

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

  if (use_libfuzzer || use_drfuzz || use_afl) {
    # Used in Chromium's overrides to disable logging
    defines += [ "WEBRTC_UNSAFE_FUZZER_MODE" ]
  }
}

config("common_objc") {
  libs = [ "Foundation.framework" ]
  precompiled_header = "sdk/objc/WebRTC-Prefix.pch"
  precompiled_source = "sdk/objc/WebRTC-Prefix.pch"
}

if (!is_ios || !build_with_chromium) {
  source_set("webrtc") {
    sources = [
      "call.h",
      "config.h",
      "transport.h",
    ]

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

    deps = [
      ":webrtc_common",
      "audio",
      "base:rtc_base",
      "call",
      "common_audio",
      "common_video",
      "modules",
      "system_wrappers",
      "tools",
      "video",
      "voice_engine",
    ]

    if (build_with_chromium) {
      deps += [ "modules/video_capture" ]
    } else {
      # TODO(kjellander): Enable for Chromium as well when bugs.webrtc.org/4256
      # is fixed. Right now it's not possible due to circular dependencies.
      deps += [
        "api",
        "media",
        "p2p",
        "pc",
      ]
    }

    if (rtc_enable_protobuf) {
      defines += [ "ENABLE_RTC_EVENT_LOG" ]
      deps += [ ":rtc_event_log_proto" ]
    }
  }
}

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

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

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

  if (is_clang && !is_nacl) {
    # 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" ]
  }
}

if (rtc_enable_protobuf) {
  proto_library("rtc_event_log_proto") {
    sources = [
      "call/rtc_event_log.proto",
    ]
    proto_out_dir = "webrtc/call"
  }
}

source_set("rtc_event_log") {
  sources = [
    "call/rtc_event_log.cc",
    "call/rtc_event_log.h",
    "call/rtc_event_log_helper_thread.cc",
    "call/rtc_event_log_helper_thread.h",
  ]

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

  deps = [
    ":webrtc_common",
    "modules/rtp_rtcp",
  ]

  if (rtc_enable_protobuf) {
    defines += [ "ENABLE_RTC_EVENT_LOG" ]
    deps += [ ":rtc_event_log_proto" ]
  }
  if (is_clang && !is_nacl) {
    # 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" ]
  }
}

if (rtc_enable_protobuf) {
  source_set("rtc_event_log_parser") {
    sources = [
      "call/rtc_event_log_parser.cc",
      "call/rtc_event_log_parser.h",
    ]

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

    public_deps = [
      ":rtc_event_log_proto",
      ":webrtc_common",
    ]

    if (is_clang && !is_nacl) {
      # 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" ]
    }
  }
}

if (use_libfuzzer || use_drfuzz || use_afl) {
  # This target is only here for gn to discover fuzzer build targets under
  # webrtc/test/fuzzers/.
  group("webrtc_fuzzers_dummy") {
    testonly = true
    deps = [
      "test/fuzzers:webrtc_fuzzer_main",
    ]
  }
}

if (rtc_include_tests) {
  config("rtc_unittests_config") {
    # GN orders flags on a target before flags from configs. The default config
    # adds -Wall, and this flag have to be after -Wall -- so they need to
    # come from a config and can"t be on the target directly.
    if (is_clang) {
      cflags = [
        "-Wno-missing-braces",
        "-Wno-sign-compare",
        "-Wno-unused-const-variable",
      ]
    }
  }

  test("rtc_unittests") {
    testonly = true
    sources = [
      "base/array_view_unittest.cc",
      "base/atomicops_unittest.cc",
      "base/autodetectproxy_unittest.cc",
      "base/bandwidthsmoother_unittest.cc",
      "base/base64_unittest.cc",
      "base/basictypes_unittest.cc",
      "base/bind_unittest.cc",
      "base/bitbuffer_unittest.cc",
      "base/buffer_unittest.cc",
      "base/bufferqueue_unittest.cc",
      "base/bytebuffer_unittest.cc",
      "base/byteorder_unittest.cc",
      "base/callback_unittest.cc",
      "base/copyonwritebuffer_unittest.cc",
      "base/crc32_unittest.cc",
      "base/criticalsection_unittest.cc",
      "base/event_tracer_unittest.cc",
      "base/event_unittest.cc",
      "base/exp_filter_unittest.cc",
      "base/filerotatingstream_unittest.cc",
      "base/fileutils_unittest.cc",
      "base/helpers_unittest.cc",
      "base/httpbase_unittest.cc",
      "base/httpcommon_unittest.cc",
      "base/httpserver_unittest.cc",
      "base/ipaddress_unittest.cc",
      "base/logging_unittest.cc",
      "base/md5digest_unittest.cc",
      "base/messagedigest_unittest.cc",
      "base/messagequeue_unittest.cc",
      "base/mod_ops_unittest.cc",
      "base/multipart_unittest.cc",
      "base/nat_unittest.cc",
      "base/network_unittest.cc",
      "base/onetimeevent_unittest.cc",
      "base/optional_unittest.cc",
      "base/optionsfile_unittest.cc",
      "base/pathutils_unittest.cc",
      "base/platform_thread_unittest.cc",
      "base/profiler_unittest.cc",
      "base/proxy_unittest.cc",
      "base/proxydetect_unittest.cc",
      "base/random_unittest.cc",
      "base/rate_limiter_unittest.cc",
      "base/rate_statistics_unittest.cc",
      "base/ratelimiter_unittest.cc",
      "base/ratetracker_unittest.cc",
      "base/referencecountedsingletonfactory_unittest.cc",
      "base/rollingaccumulator_unittest.cc",
      "base/rtccertificate_unittest.cc",
      "base/rtccertificategenerator_unittest.cc",
      "base/scopedptrcollection_unittest.cc",
      "base/sequenced_task_checker_unittest.cc",
      "base/sha1digest_unittest.cc",
      "base/sharedexclusivelock_unittest.cc",
      "base/signalthread_unittest.cc",
      "base/sigslot_unittest.cc",
      "base/sigslottester.h",
      "base/sigslottester.h.pump",
      "base/stream_unittest.cc",
      "base/stringencode_unittest.cc",
      "base/stringutils_unittest.cc",
      "base/swap_queue_unittest.cc",

      # TODO(ronghuawu): Reenable this test.
      # "systeminfo_unittest.cc",
      "base/task_queue_unittest.cc",
      "base/task_unittest.cc",
      "base/testclient_unittest.cc",
      "base/thread_checker_unittest.cc",
      "base/thread_unittest.cc",
      "base/timestampaligner_unittest.cc",
      "base/timeutils_unittest.cc",
      "base/urlencode_unittest.cc",
      "base/versionparsing_unittest.cc",

      # TODO(ronghuawu): Reenable this test.
      # "windowpicker_unittest.cc",
      "p2p/base/dtlstransportchannel_unittest.cc",
      "p2p/base/fakeportallocator.h",
      "p2p/base/faketransportcontroller.h",
      "p2p/base/p2ptransportchannel_unittest.cc",
      "p2p/base/port_unittest.cc",
      "p2p/base/portallocator_unittest.cc",
      "p2p/base/pseudotcp_unittest.cc",
      "p2p/base/relayport_unittest.cc",
      "p2p/base/relayserver_unittest.cc",
      "p2p/base/stun_unittest.cc",
      "p2p/base/stunport_unittest.cc",
      "p2p/base/stunrequest_unittest.cc",
      "p2p/base/stunserver_unittest.cc",
      "p2p/base/tcpport_unittest.cc",
      "p2p/base/testrelayserver.h",
      "p2p/base/teststunserver.h",
      "p2p/base/testturnserver.h",
      "p2p/base/transport_unittest.cc",
      "p2p/base/transportcontroller_unittest.cc",
      "p2p/base/transportdescriptionfactory_unittest.cc",
      "p2p/base/turnport_unittest.cc",
      "p2p/base/turnserver_unittest.cc",
      "p2p/client/basicportallocator_unittest.cc",
      "p2p/stunprober/stunprober_unittest.cc",
    ]

    if (is_linux) {
      sources += [
        "base/latebindingsymboltable_unittest.cc",

        # TODO(ronghuawu): Reenable this test.
        # "linux_unittest.cc",
        "base/linuxfdwalk_unittest.cc",
      ]
    }

    if (is_win) {
      sources += [
        "base/win32_unittest.cc",
        "base/win32regkey_unittest.cc",
        "base/win32window_unittest.cc",
        "base/win32windowpicker_unittest.cc",
        "base/winfirewall_unittest.cc",
      ]
    }

    if (is_mac) {
      sources += [ "base/macutils_unittest.cc" ]
    }

    if (is_posix) {
      sources += [
        "base/ssladapter_unittest.cc",
        "base/sslidentity_unittest.cc",
        "base/sslstreamadapter_unittest.cc",
      ]
    }
    if (is_ios || (is_mac && target_cpu != "x86")) {
      defines = [ "CARBON_DEPRECATED=YES" ]
    }

    if (rtc_use_quic) {
      sources += [
        "p2p/quic/quicconnectionhelper_unittest.cc",
        "p2p/quic/quicsession_unittest.cc",
        "p2p/quic/quictransport_unittest.cc",
        "p2p/quic/quictransportchannel_unittest.cc",
        "p2p/quic/reliablequicstream_unittest.cc",
      ]
    }

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

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

    deps = [
      "base:rtc_base",
      "base:rtc_base_tests_utils",
      "base:rtc_task_queue",
      "p2p:libstunprober",
      "p2p:rtc_p2p",
      "//testing/gmock",
      "//testing/gtest",
    ]

    if (is_android) {
      deps += [ "//testing/android/native_test:native_test_support" ]
    }

    if (is_ios || (is_mac && mac_deployment_target == "10.7")) {
      deps += [
        "sdk:rtc_sdk_peerconnection_objc",
        "system_wrappers:system_wrappers_default",
      ]
      sources += [
        "sdk/objc/Framework/UnitTests/RTCConfigurationTest.mm",
        "sdk/objc/Framework/UnitTests/RTCDataChannelConfigurationTest.mm",
        "sdk/objc/Framework/UnitTests/RTCIceCandidateTest.mm",
        "sdk/objc/Framework/UnitTests/RTCIceServerTest.mm",
        "sdk/objc/Framework/UnitTests/RTCMediaConstraintsTest.mm",
        "sdk/objc/Framework/UnitTests/RTCSessionDescriptionTest.mm",
      ]

      # TODO(tkchin): Cleanup this warning.
      cflags = [ "-Wno-objc-property-no-attribute" ]

      # |-ObjC| flag needed to make sure category method implementations
      # are included:
      # https://developer.apple.com/library/mac/qa/qa1490/_index.html
      ldflags = [ "-ObjC" ]
    }
  }

  test("xmllite_xmpp_unittests") {
    configs += [
      ":common_config",
      ":rtc_unittests_config",
    ]
    public_configs = [ ":common_inherited_config" ]

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

    deps = [
      "base:rtc_base_tests_utils",
      "libjingle/xmllite:rtc_xmllite",
      "libjingle/xmpp:rtc_xmpp",
      "//testing/gtest",
    ]

    sources = [
      "libjingle/xmllite/qname_unittest.cc",
      "libjingle/xmllite/xmlbuilder_unittest.cc",
      "libjingle/xmllite/xmlelement_unittest.cc",
      "libjingle/xmllite/xmlnsstack_unittest.cc",
      "libjingle/xmllite/xmlparser_unittest.cc",
      "libjingle/xmllite/xmlprinter_unittest.cc",
      "libjingle/xmpp/fakexmppclient.h",
      "libjingle/xmpp/hangoutpubsubclient_unittest.cc",
      "libjingle/xmpp/jid_unittest.cc",
      "libjingle/xmpp/mucroomconfigtask_unittest.cc",
      "libjingle/xmpp/mucroomdiscoverytask_unittest.cc",
      "libjingle/xmpp/mucroomlookuptask_unittest.cc",
      "libjingle/xmpp/mucroomuniquehangoutidtask_unittest.cc",
      "libjingle/xmpp/pingtask_unittest.cc",
      "libjingle/xmpp/pubsubclient_unittest.cc",
      "libjingle/xmpp/pubsubtasks_unittest.cc",
      "libjingle/xmpp/util_unittest.cc",
      "libjingle/xmpp/util_unittest.h",
      "libjingle/xmpp/xmppengine_unittest.cc",
      "libjingle/xmpp/xmpplogintask_unittest.cc",
      "libjingle/xmpp/xmppstanzaparser_unittest.cc",
    ]
  }

  # TODO(pbos): Rename test suite, this is no longer "just" for video targets.
  test("video_engine_tests") {
    testonly = true
    deps = [
      "audio:audio_tests",
      "call:call_tests",
      "modules/video_capture",
      "test:test_common",
      "test:test_main",
      "video:video_tests",
    ]
    if (is_clang) {
      # Suppress warnings from the Chromium Clang plugin.
      # See http://code.google.com/p/webrtc/issues/detail?id=163 for details.
      configs -= [ "//build/config/clang:find_bad_constructs" ]
    }
  }

  source_set("video_quality_test") {
    testonly = true
    configs += [ ":common_config" ]
    public_configs = [ ":common_inherited_config" ]
    sources = [
      "video/video_quality_test.cc",
      "video/video_quality_test.h",
    ]
    deps = [
      ":webrtc",
      "system_wrappers",
      "//testing/gtest",
    ]
    if (!is_android) {
      deps += [ "modules/video_capture:video_capture_internal_impl" ]
    }
    if (is_clang) {
      # Suppress warnings from the Chromium Clang plugin.
      # See http://code.google.com/p/webrtc/issues/detail?id=163 for details.
      configs -= [ "//build/config/clang:find_bad_constructs" ]
    }
  }

  test("webrtc_perf_tests") {
    testonly = true
    configs += [
      ":common_config",
      ":rtc_unittests_config",
    ]
    public_configs = [ ":common_inherited_config" ]
    sources = [
      "call/call_perf_tests.cc",
      "call/rampup_tests.cc",
      "call/rampup_tests.h",
      "modules/audio_coding/neteq/test/neteq_performance_unittest.cc",
      "modules/audio_processing/audio_processing_performance_unittest.cc",
      "modules/audio_processing/level_controller/level_controller_complexity_unittest.cc",
      "modules/remote_bitrate_estimator/remote_bitrate_estimators_test.cc",
      "video/full_stack.cc",
    ]
    deps = [
      ":video_quality_test",
      ":webrtc",
      "modules/audio_coding:neteq_test_support",
      "modules/audio_processing",
      "modules/audio_processing:audioproc_test_utils",
      "modules/remote_bitrate_estimator:bwe_simulator",
      "modules/rtp_rtcp",
      "test:channel_transport",
      "test:test_common",
      "test:test_main",
      "test:test_renderer",
      "voice_engine",
      "//testing/gmock",
      "//testing/gtest",
    ]
    if (is_android) {
      deps += [ "//testing/android/native_test:native_test_native_code" ]
    }
    if (is_clang) {
      # Suppress warnings from the Chromium Clang plugin.
      # See http://code.google.com/p/webrtc/issues/detail?id=163 for details.
      configs -= [ "//build/config/clang:find_bad_constructs" ]
    }
  }

  test("webrtc_nonparallel_tests") {
    testonly = true
    configs += [
      ":common_config",
      ":rtc_unittests_config",
    ]
    public_configs = [ ":common_inherited_config" ]
    sources = [
      "base/nullsocketserver_unittest.cc",
      "base/physicalsocketserver_unittest.cc",
      "base/socket_unittest.cc",
      "base/socket_unittest.h",
      "base/socketaddress_unittest.cc",
      "base/virtualsocket_unittest.cc",
    ]
    deps = [
      "base:rtc_base",
      "base:rtc_base_tests_utils",
      "//testing/gtest",
    ]
    if (is_win) {
      sources += [ "base/win32socketserver_unittest.cc" ]
    }
    if (is_android) {
      deps += [ "//testing/android/native_test:native_test_support" ]
    }

    if (is_mac) {
      sources += [ "base/macsocketserver_unittest.cc" ]
    }
    if (is_ios || (is_mac && target_cpu != "x86")) {
      defines = [ "CARBON_DEPRECATED=YES" ]
    }
    if (is_clang) {
      # Suppress warnings from the Chromium Clang plugin.
      # See http://code.google.com/p/webrtc/issues/detail?id=163 for details.
      configs -= [ "//build/config/clang:find_bad_constructs" ]
    }
  }
}
