# 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("//third_party/protobuf/proto_library.gni")
if (is_android) {
  import("//build/config/android/config.gni")
  import("//build/config/android/rules.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_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" ]
  # }
}

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

  if (!rtc_libvpx_build_vp9) {
    defines += [ "RTC_DISABLE_VP9" ]
  }

  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",
      "SSL_USE_OPENSSL",
      "USE_WEBRTC_DEV_BRANCH",
    ]
  } else {
    if (is_posix) {
      # Enable more warnings: -Wextra is currently disabled in Chromium.
      cflags = [
        "-Wextra",

        # Repeat some flags 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",
        "-Wundef",
      ]
    }
  }

  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 (!build_with_chromium) {
  # Target to build all the WebRTC production code.
  rtc_static_library("webrtc") {
    # Only the root target should depend on this.
    visibility = [ "//:default" ]

    sources = [
      # TODO(kjellander): Remove this whenever possible. GN's static_library
      # target type requires at least one object to avoid errors linking.
      "build/no_op_function.cc",

      # TODO(ossu): Keep this here until donwstream projects have updated.
      # http://bugs.webrtc.org/6716
      "call.h",
      "config.h",

      # TODO(aleloi): remove transport.h and the transport api
      # dependency once clients have updated to the new transport
      # location in webrtc/api/call/transport.h See
      # http://bugs.webrtc.org/6785.
      "transport.h",
    ]

    defines = []

    deps = [
      ":webrtc_common",
      "api",
      "api:transport_api",
      "audio",
      "base",
      "call",
      "common_audio",
      "common_video",
      "libjingle/xmllite",
      "libjingle/xmpp",
      "logging",
      "media",
      "modules",
      "modules/video_capture:video_capture_internal_impl",
      "p2p",
      "pc",
      "sdk",
      "stats",
      "system_wrappers",
      "video",
      "voice_engine",
    ]

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

  if (rtc_include_tests) {
    # Target to build all the WebRTC tests (but not examples or tools).
    # Executable in order to get a target that links all WebRTC code.
    rtc_executable("webrtc_tests") {
      testonly = true

      # Only the root target should depend on this.
      visibility = [ "//:default" ]

      deps = [
        ":rtc_unittests",
        ":video_engine_tests",
        ":webrtc_nonparallel_tests",
        ":webrtc_perf_tests",
        "api:peerconnection_unittests",
        "common_audio:common_audio_unittests",
        "common_video:common_video_unittests",
        "libjingle:xmllite_xmpp_unittests",
        "media:rtc_media_unittests",
        "modules:modules_tests",
        "modules:modules_unittests",
        "modules/audio_coding:audio_coding_tests",
        "modules/audio_processing:audio_processing_tests",
        "modules/rtp_rtcp:test_packet_masks_metrics",
        "modules/video_capture:video_capture_internal_impl",
        "pc:rtc_pc_unittests",
        "stats:rtc_stats_unittests",
        "system_wrappers:system_wrappers_unittests",
        "test",
        "video:screenshare_loopback",
        "video:video_loopback",
        "video:video_tests",
        "voice_engine:voe_cmd_test",
        "voice_engine:voice_engine_unittests",
      ]
      if (is_android) {
        deps += [
          ":android_junit_tests",
          "//webrtc/sdk/android:libjingle_peerconnection_android_unittest",
        ]
      } else {
        deps += [ "modules/video_capture:video_capture_tests" ]
      }
      if (!is_ios) {
        deps += [
          "modules/audio_device:audio_device_tests",
          "voice_engine:voe_auto_test",
        ]
      }
    }
  }
}

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

  if (!build_with_chromium && is_clang) {
    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
    suppressed_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",
      ]
    }
  }

  rtc_test("rtc_unittests") {
    testonly = true
    sources = [
      "api/fakemetricsobserver.cc",
      "base/analytics/exp_filter_unittest.cc",
      "base/analytics/percentile_filter_unittest.cc",
      "base/array_view_unittest.cc",
      "base/atomicops_unittest.cc",
      "base/autodetectproxy_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/file_unittest.cc",
      "base/filerotatingstream_unittest.cc",
      "base/fileutils_unittest.cc",
      "base/function_view_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/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/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/refcountedobject_unittest.cc",
      "base/rollingaccumulator_unittest.cc",
      "base/rtccertificate_unittest.cc",
      "base/rtccertificategenerator_unittest.cc",
      "base/safe_compare_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_unittest.cc",
      "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_annotations_unittest.cc",
      "base/thread_checker_unittest.cc",
      "base/thread_unittest.cc",
      "base/timestampaligner_unittest.cc",
      "base/timeutils_unittest.cc",
      "base/urlencode_unittest.cc",
      "base/weak_ptr_unittest.cc",
      "p2p/base/asyncstuntcpsocket_unittest.cc",
      "p2p/base/dtlstransportchannel_unittest.cc",
      "p2p/base/fakeportallocator.h",
      "p2p/base/faketransportcontroller.h",
      "p2p/base/jseptransport_unittest.cc",
      "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/transportcontroller_unittest.cc",
      "p2p/base/transportdescriptionfactory_unittest.cc",
      "p2p/base/turnport_unittest.cc",
      "p2p/base/turnserver_unittest.cc",
      "p2p/base/udptransportchannel_unittest.cc",
      "p2p/client/basicportallocator_unittest.cc",
      "p2p/stunprober/stunprober_unittest.cc",
    ]

    if (is_win) {
      sources += [
        "base/win32_unittest.cc",
        "base/win32regkey_unittest.cc",
        "base/win32window_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 (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 += [ ":rtc_unittests_config" ]

    if (!build_with_chromium && is_clang) {
      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
    }

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

    if (rtc_enable_protobuf) {
      deps += [ "logging:rtc_event_log_tests" ]
    }

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

    if (is_ios || is_mac) {
      deps += [
        "sdk:rtc_sdk_peerconnection_objc",
        "system_wrappers:system_wrappers_default",
        "//third_party/ocmock",
      ]
      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",
        "sdk/objc/Framework/UnitTests/avformatmappertests.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" ]
    }
  }

  # TODO(pbos): Rename test suite, this is no longer "just" for video targets.
  video_engine_tests_resources = [
    "//resources/foreman_cif_short.yuv",
    "//resources/voice_engine/audio_long16.pcm",
  ]

  if (is_ios) {
    bundle_data("video_engine_tests_bundle_data") {
      testonly = true
      sources = video_engine_tests_resources
      outputs = [
        "{{bundle_resources_dir}}/{{source_file_part}}",
      ]
    }
  }

  rtc_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",
    ]
    data = video_engine_tests_resources
    if (!build_with_chromium && is_clang) {
      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
    }
    if (is_android) {
      deps += [ "//testing/android/native_test:native_test_native_code" ]
      shard_timeout = 900
    }
    if (is_ios) {
      deps += [ ":video_engine_tests_bundle_data" ]
    }
  }

  webrtc_perf_tests_resources = [
    "//resources/audio_coding/speech_mono_16kHz.pcm",
    "//resources/audio_coding/testfile32kHz.pcm",
    "//resources/ConferenceMotion_1280_720_50.yuv",
    "//resources/difficult_photo_1850_1110.yuv",
    "//resources/foreman_cif.yuv",
    "//resources/google-wifi-3mbps.rx",
    "//resources/paris_qcif.yuv",
    "//resources/photo_1850_1110.yuv",
    "//resources/presentation_1850_1110.yuv",
    "//resources/verizon4g-downlink.rx",
    "//resources/voice_engine/audio_long16.pcm",
    "//resources/web_screenshot_1850_1110.yuv",
  ]

  if (is_ios) {
    bundle_data("webrtc_perf_tests_bundle_data") {
      testonly = true
      sources = webrtc_perf_tests_resources
      outputs = [
        "{{bundle_resources_dir}}/{{source_file_part}}",
      ]
    }
  }

  rtc_test("webrtc_perf_tests") {
    testonly = true
    configs += [ ":rtc_unittests_config" ]

    sources = [
      "call/call_perf_tests.cc",
      "call/rampup_tests.cc",
      "call/rampup_tests.h",
      "modules/audio_coding/codecs/opus/opus_complexity_unittest.cc",
      "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/audio_processing/residual_echo_detector_complexity_unittest.cc",
      "modules/remote_bitrate_estimator/remote_bitrate_estimators_test.cc",
      "video/full_stack_tests.cc",
    ]
    deps = [
      "modules/audio_coding:neteq_test_support",
      "modules/audio_processing",
      "modules/audio_processing:audioproc_test_utils",
      "modules/remote_bitrate_estimator:bwe_simulator_lib",
      "modules/rtp_rtcp",
      "test:test_common",
      "test:test_main",
      "test:test_renderer",
      "video:video_quality_test",
      "voice_engine",
      "//testing/gmock",
      "//testing/gtest",
    ]

    if (rtc_enable_intelligibility_enhancer) {
      defines = [ "WEBRTC_INTELLIGIBILITY_ENHANCER=1" ]
    } else {
      defines = [ "WEBRTC_INTELLIGIBILITY_ENHANCER=0" ]
    }

    data = webrtc_perf_tests_resources
    if (is_android) {
      deps += [ "//testing/android/native_test:native_test_native_code" ]
      shard_timeout = 2700
    }
    if (is_ios) {
      deps += [ ":webrtc_perf_tests_bundle_data" ]
    }
    if (!build_with_chromium && is_clang) {
      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
    }
    if (rtc_use_h264) {
      defines += [ "WEBRTC_USE_H264" ]
    }
  }

  rtc_test("webrtc_nonparallel_tests") {
    testonly = true
    configs += [ ":rtc_unittests_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" ]
      shard_timeout = 900
    }

    if (!build_with_chromium && is_clang) {
      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
    }
  }

  if (is_android) {
    junit_binary("android_junit_tests") {
      java_files = [
        "androidjunit/src/org/webrtc/CameraEnumerationTest.java",
        "examples/androidjunit/src/org/appspot/apprtc/DirectRTCClientTest.java",
        "examples/androidjunit/src/org/appspot/apprtc/TCPChannelClientTest.java",
      ]

      deps = [
        "//base:base_java_test_support",
        "//webrtc/examples:AppRTCMobile_javalib",
        "//webrtc/sdk/android:libjingle_peerconnection_java",
      ]
    }
  }
}
