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

import("//build/config/android/config.gni")
import("../build/webrtc.gni")

static_library("system_wrappers") {
  sources = [
    "interface/aligned_array.h",
    "interface/aligned_malloc.h",
    "interface/atomic32.h",
    "interface/clock.h",
    "interface/condition_variable_wrapper.h",
    "interface/cpu_info.h",
    "interface/cpu_features_wrapper.h",
    "interface/critical_section_wrapper.h",
    "interface/data_log.h",
    "interface/data_log_c.h",
    "interface/data_log_impl.h",
    "interface/event_tracer.h",
    "interface/event_wrapper.h",
    "interface/field_trial.h",
    "interface/file_wrapper.h",
    "interface/fix_interlocked_exchange_pointer_win.h",
    "interface/logging.h",
    "interface/metrics.h",
    "interface/ref_count.h",
    "interface/rtp_to_ntp.h",
    "interface/rw_lock_wrapper.h",
    "interface/scoped_ptr.h",
    "interface/scoped_refptr.h",
    "interface/scoped_vector.h",
    "interface/sleep.h",
    "interface/sort.h",
    "interface/static_instance.h",
    "interface/stl_util.h",
    "interface/stringize_macros.h",
    "interface/thread_wrapper.h",
    "interface/tick_util.h",
    "interface/timestamp_extrapolator.h",
    "interface/trace.h",
    "interface/trace_event.h",
    "interface/utf_util_win.h",
    "source/aligned_malloc.cc",
    "source/atomic32_mac.cc",
    "source/atomic32_win.cc",
    "source/clock.cc",
    "source/condition_variable.cc",
    "source/condition_variable_posix.cc",
    "source/condition_variable_posix.h",
    "source/condition_variable_event_win.cc",
    "source/condition_variable_event_win.h",
    "source/condition_variable_native_win.cc",
    "source/condition_variable_native_win.h",
    "source/cpu_info.cc",
    "source/cpu_features.cc",
    "source/critical_section.cc",
    "source/critical_section_posix.cc",
    "source/critical_section_posix.h",
    "source/critical_section_win.cc",
    "source/critical_section_win.h",
    "source/data_log_c.cc",
    "source/event.cc",
    "source/event_posix.cc",
    "source/event_posix.h",
    "source/event_tracer.cc",
    "source/event_win.cc",
    "source/event_win.h",
    "source/file_impl.cc",
    "source/file_impl.h",
    "source/logging.cc",
    "source/rtp_to_ntp.cc",
    "source/rw_lock.cc",
    "source/rw_lock_generic.cc",
    "source/rw_lock_generic.h",
    "source/rw_lock_posix.cc",
    "source/rw_lock_posix.h",
    "source/rw_lock_win.cc",
    "source/rw_lock_win.h",
    "source/sleep.cc",
    "source/sort.cc",
    "source/tick_util.cc",
    "source/thread.cc",
    "source/thread_posix.cc",
    "source/thread_posix.h",
    "source/thread_win.cc",
    "source/thread_win.h",
    "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",
  ]

  configs += [ "..:common_config" ]

  public_configs = [
    "..:common_inherited_config",
  ]

  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 += [
      "interface/logcat_trace_context.h",
      "source/logcat_trace_context.cc",
    ]

    defines += [
      "WEBRTC_THREAD_RR",
      # TODO(leozwang): Investigate CLOCK_REALTIME and CLOCK_MONOTONIC
      # support on Android. Keep WEBRTC_CLOCK_TYPE_REALTIME for now,
      # remove it after I verify that CLOCK_MONOTONIC is fully functional
      # with condition and event functions in system_wrappers.
      "WEBRTC_CLOCK_TYPE_REALTIME",
    ]

    deps += [ ":cpu_features_android" ]

    libs += [ "log" ]
  }

  if (is_linux) {
    defines += [
      "WEBRTC_THREAD_RR",
      # TODO(andrew): can we select this automatically?
      # Define this if the Linux system does not support CLOCK_MONOTONIC.
      #"WEBRTC_CLOCK_TYPE_REALTIME",
    ]

    libs += [ "rt" ]
  }

  if (!is_mac && !is_ios) {
    sources += [
      "source/atomic32_posix.cc",
    ]
  }

  if (is_ios || is_mac) {
    defines += [
      "WEBRTC_THREAD_RR",
      "WEBRTC_CLOCK_TYPE_REALTIME",
    ]
  }

  if (is_ios) {
    sources += [
      "source/atomic32_mac.cc",
    ]
  }

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

    cflags = [
      "/wd4267",  # size_t to int truncation.
      "/wd4334",  # Ignore warning on shift operator promotion.
    ]
  }

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

source_set("field_trial_default") {
  sources = [
    "interface/field_trial_default.h",
    "source/field_trial_default.cc",
  ]

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

  deps = [
    ":system_wrappers",
  ]
}

source_set("metrics_default") {
  sources = [
    "source/metrics_default.cc",
  ]

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

  deps = [
    ":system_wrappers",
  ]
}

source_set("system_wrappers_default") {

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

  deps = [
    ":field_trial_default",
    ":metrics_default",
  ]
}

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

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

    if (is_android_webview_build) {
      libs += [ "cpufeatures.a" ]
    } else {
      deps = [ "//third_party/android_tools:cpu_features" ]
    }
  }
}
