# 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("../webrtc.gni")

rtc_static_library("system_wrappers") {
  visibility = [ "*" ]
  sources = [
    "include/clock.h",
    "include/cpu_info.h",
    "include/event_wrapper.h",
    "include/ntp_time.h",
    "include/rtp_to_ntp_estimator.h",
    "include/sleep.h",
    "source/clock.cc",
    "source/cpu_features.cc",
    "source/cpu_info.cc",
    "source/event.cc",
    "source/event_timer_win.cc",
    "source/event_timer_win.h",
    "source/rtp_to_ntp_estimator.cc",
    "source/sleep.cc",
  ]

  defines = []
  libs = []
  deps = [
    ":cpu_features_api",
    ":field_trial_api",
    ":metrics_api",
    ":runtime_enabled_features_api",
    "..:webrtc_common",
    "../:typedefs",
    "../api:optional",
    "../modules:module_api_public",
    "../rtc_base:checks",
    "../rtc_base/synchronization:rw_lock_wrapper",
  ]

  if (is_posix || is_fuchsia) {
    sources += [
      "source/event_timer_posix.cc",
      "source/event_timer_posix.h",
    ]
  }

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

    if (build_with_mozilla) {
      include_dirs = [
        "/config/external/nspr",
        "/nsprpub/lib/ds",
        "/nsprpub/pr/include",
      ]
    } else {
      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_ios || is_mac) {
    defines += [ "WEBRTC_THREAD_RR" ]
  }

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

    # Windows needs ../rtc_base:rtc_base due to include of
    # webrtc/rtc_base/win32.h in source/clock.cc.
    deps += [ "../rtc_base:rtc_base" ]
  }

  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 += [
    "../rtc_base:rtc_base_approved",
    "../rtc_base:rtc_numerics",
  ]
}

rtc_source_set("cpu_features_api") {
  sources = [
    "include/cpu_features_wrapper.h",
  ]
  deps = [
    "..:webrtc_common",
    "../:typedefs",
  ]
}

rtc_source_set("field_trial_api") {
  sources = [
    "include/field_trial.h",
  ]
}

rtc_source_set("runtime_enabled_features_api") {
  visibility = [ "*" ]
  sources = [
    "include/runtime_enabled_features.h",
  ]
}

rtc_source_set("metrics_api") {
  visibility = [ "*" ]
  sources = [
    "include/metrics.h",
  ]
  deps = [
    "..:webrtc_common",
    "../rtc_base:checks",
    "../rtc_base:rtc_base_approved",
  ]
}

rtc_source_set("field_trial_default") {
  visibility = [ "*" ]
  sources = [
    "include/field_trial_default.h",
    "source/field_trial_default.cc",
  ]
  deps = [
    ":field_trial_api",
  ]
}

rtc_source_set("runtime_enabled_features_default") {
  visibility = [ "*" ]
  sources = [
    "source/runtime_enabled_features_default.cc",
  ]
  deps = [
    ":runtime_enabled_features_api",
    "../rtc_base:rtc_base_approved",
  ]
}

rtc_source_set("metrics_default") {
  visibility = [ "*" ]
  sources = [
    "include/metrics_default.h",
    "source/metrics_default.cc",
  ]
  deps = [
    ":metrics_api",
    "../rtc_base:rtc_base_approved",
  ]
}

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

if (is_android && !build_with_mozilla) {
  rtc_static_library("cpu_features_android") {
    sources = [
      "source/cpu_features_android.c",
    ]

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

if (is_linux) {
  rtc_static_library("cpu_features_linux") {
    sources = [
      "source/cpu_features_linux.c",
    ]
    deps = [
      ":cpu_features_api",
    ]
  }
}

if (rtc_include_tests) {
  rtc_test("system_wrappers_unittests") {
    testonly = true
    sources = [
      "source/clock_unittest.cc",
      "source/metrics_default_unittest.cc",
      "source/metrics_unittest.cc",
      "source/ntp_time_unittest.cc",
      "source/rtp_to_ntp_estimator_unittest.cc",
    ]
    configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]

    if (is_posix || is_fuchsia) {
      sources += [
        "source/event_timer_posix_unittest.cc",
      ]
    }

    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 = [
      ":metrics_api",
      ":metrics_default",
      ":system_wrappers",
      "..:webrtc_common",
      "../:typedefs",
      "../rtc_base:rtc_base_approved",
      "../test:test_main",
      "//testing/gtest",
    ]

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

      shard_timeout = 900
    }
  }
}
