# 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")

config("system_wrappers_inherited_config") {
  include_dirs = [
    "interface",
  ]
}

static_library("system_wrappers") {
  sources = [
    "interface/aligned_array.h",
    "interface/aligned_malloc.h",
    "interface/atomic32.h",
    "interface/clock.h",
    "interface/compile_assert.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/set_thread_name_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" ]

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

  public_configs = [
    "..:common_inherited_config",
    ":system_wrappers_inherited_config",
  ]

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

  defines = []
  libs = []
  deps = []

  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.
    ]
  }

  include_dirs = [
    "source/spreadsortlib",
  ]

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

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

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

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

  deps = [
    ":system_wrappers",
  ]
}

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

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

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

  deps = [
    ":system_wrappers",
  ]
}

source_set("system_wrappers_default") {

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

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

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