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

if (is_android) {
  import("//build/config/android/config.gni")
  import("//build/config/android/rules.gni")
}
import("../build/webrtc.gni")

rtc_source_set("system_wrappers") {
  sources = [
    "include/aligned_array.h",
    "include/aligned_malloc.h",
    "include/atomic32.h",
    "include/clock.h",
    "include/cpu_features_wrapper.h",
    "include/cpu_info.h",
    "include/critical_section_wrapper.h",
    "include/data_log.h",
    "include/data_log_c.h",
    "include/data_log_impl.h",
    "include/event_wrapper.h",
    "include/field_trial.h",
    "include/file_wrapper.h",
    "include/fix_interlocked_exchange_pointer_win.h",
    "include/logging.h",
    "include/metrics.h",
    "include/ntp_time.h",
    "include/rtp_to_ntp.h",
    "include/rw_lock_wrapper.h",
    "include/sleep.h",
    "include/sort.h",
    "include/static_instance.h",
    "include/stl_util.h",
    "include/stringize_macros.h",
    "include/timestamp_extrapolator.h",
    "include/trace.h",
    "include/utf_util_win.h",
    "source/aligned_malloc.cc",
    "source/atomic32_win.cc",
    "source/clock.cc",
    "source/condition_variable_event_win.cc",
    "source/condition_variable_event_win.h",
    "source/cpu_features.cc",
    "source/cpu_info.cc",
    "source/data_log_c.cc",
    "source/event.cc",
    "source/event_timer_posix.cc",
    "source/event_timer_posix.h",
    "source/event_timer_win.cc",
    "source/event_timer_win.h",
    "source/file_impl.cc",
    "source/logging.cc",
    "source/rtp_to_ntp.cc",
    "source/rw_lock.cc",
    "source/rw_lock_posix.cc",
    "source/rw_lock_posix.h",
    "source/rw_lock_win.cc",
    "source/rw_lock_win.h",
    "source/rw_lock_winxp_win.cc",
    "source/rw_lock_winxp_win.h",
    "source/sleep.cc",
    "source/sort.cc",
    "source/timestamp_extrapolator.cc",
    "source/trace_impl.cc",
    "source/trace_impl.h",
    "source/trace_posix.cc",
    "source/trace_posix.h",
    "source/trace_win.cc",
    "source/trace_win.h",
  ]

  if (rtc_enable_data_logging) {
    sources += [ "source/data_log.cc" ]
  } else {
    sources += [ "source/data_log_no_op.cc" ]
  }

  defines = []
  libs = []
  deps = [
    "..:webrtc_common",
  ]

  if (is_android) {
    sources += [
      "include/logcat_trace_context.h",
      "source/logcat_trace_context.cc",
    ]

    defines += [ "WEBRTC_THREAD_RR" ]

    deps += [ ":cpu_features_android" ]

    libs += [ "log" ]
  }

  if (is_linux) {
    defines += [ "WEBRTC_THREAD_RR" ]

    if (!build_with_chromium) {
      deps += [ ":cpu_features_linux" ]
    }

    libs += [ "rt" ]
  }

  if (is_linux || is_android) {
    sources += [ "source/atomic32_non_darwin_unix.cc" ]
  }

  if (is_ios || is_mac) {
    defines += [ "WEBRTC_THREAD_RR" ]
    sources += [ "source/atomic32_darwin.cc" ]
  }

  # TODO(jschuh): Bug 1348: fix this warning.
  configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]

  if (is_win) {
    libs += [ "winmm.lib" ]

    cflags = [ "/wd4334" ]  # Ignore warning on shift operator promotion.
  }

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

  deps += [ "../base:rtc_base_approved" ]
}

rtc_source_set("field_trial_default") {
  sources = [
    "include/field_trial_default.h",
    "source/field_trial_default.cc",
  ]
}

rtc_source_set("metrics_default") {
  sources = [
    "include/metrics_default.h",
    "source/metrics_default.cc",
  ]
}

rtc_source_set("system_wrappers_default") {
  deps = [
    ":field_trial_default",
    ":metrics_default",
    ":system_wrappers",
  ]
}

if (is_android) {
  rtc_source_set("cpu_features_android") {
    sources = [
      "source/cpu_features_android.c",
    ]

    deps = [
      "//third_party/android_tools:cpu_features",
    ]
  }
}

if (is_linux) {
  rtc_source_set("cpu_features_linux") {
    sources = [
      "source/cpu_features_linux.c",
    ]
  }
}

if (rtc_include_tests) {
  rtc_test("system_wrappers_unittests") {
    testonly = true
    sources = [
      "source/aligned_array_unittest.cc",
      "source/aligned_malloc_unittest.cc",
      "source/clock_unittest.cc",
      "source/condition_variable_unittest.cc",
      "source/critical_section_unittest.cc",
      "source/data_log_c_helpers_unittest.c",
      "source/data_log_c_helpers_unittest.h",
      "source/data_log_helpers_unittest.cc",
      "source/event_timer_posix_unittest.cc",
      "source/logging_unittest.cc",
      "source/metrics_default_unittest.cc",
      "source/metrics_unittest.cc",
      "source/ntp_time_unittest.cc",
      "source/rtp_to_ntp_unittest.cc",
      "source/stl_util_unittest.cc",
      "source/stringize_macros_unittest.cc",
    ]
    if (rtc_enable_data_logging) {
      sources += [
        "source/data_log_unittest.cc",
        "source/data_log_unittest_disabled.cc",
      ]
    }

    configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]

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

    deps = [
      ":metrics_default",
      ":system_wrappers",
      "../test:test_support_main",
      "//testing/gtest",
    ]

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

      shard_timeout = 900
    }
  }
}
