# Copyright 2014 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# Note that this build file assumes rlz_use_chrome_net which is a condition in
# the GYP file, but is always true for Chrome builds.

import("//testing/test.gni")

config("rlz_config") {
  defines = [ "RLZ_NETWORK_IMPLEMENTATION_CHROME_NET" ]
}

source_set("rlz_lib") {
  sources = [
    "chromeos/lib/machine_id_chromeos.cc",
    "chromeos/lib/rlz_value_store_chromeos.cc",
    "chromeos/lib/rlz_value_store_chromeos.h",
    "ios/lib/machine_id_ios.cc",
    "lib/assert.cc",
    "lib/assert.h",
    "lib/crc32.h",
    "lib/crc32_wrapper.cc",
    "lib/crc8.cc",
    "lib/crc8.h",
    "lib/financial_ping.cc",
    "lib/financial_ping.h",
    "lib/lib_values.cc",
    "lib/lib_values.h",
    "lib/machine_id.cc",
    "lib/machine_id.h",
    "lib/recursive_cross_process_lock_posix.cc",
    "lib/recursive_cross_process_lock_posix.h",
    "lib/rlz_enums.h",
    "lib/rlz_lib.cc",
    "lib/rlz_lib.h",
    "lib/rlz_lib_clear.cc",
    "lib/rlz_value_store.h",
    "lib/string_utils.cc",
    "lib/string_utils.h",
    "mac/lib/machine_id_mac.cc",
    "mac/lib/rlz_value_store_mac.h",
    "mac/lib/rlz_value_store_mac.mm",
    "win/lib/lib_mutex.cc",
    "win/lib/lib_mutex.h",
    "win/lib/machine_deal.cc",
    "win/lib/machine_deal.h",
    "win/lib/machine_id_win.cc",
    "win/lib/process_info.cc",
    "win/lib/process_info.h",
    "win/lib/registry_util.cc",
    "win/lib/registry_util.h",
    "win/lib/rlz_lib_win.cc",
    "win/lib/rlz_value_store_registry.cc",
    "win/lib/rlz_value_store_registry.h",
  ]

  # TODO(jschuh): crbug.com/167187 fix size_t to int truncations.
  configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]

  public_configs = [ ":rlz_config" ]

  deps = [
    "//base",
    "//base/third_party/dynamic_annotations",
    "//net",
    "//third_party/zlib",
    "//url",
  ]

  if (is_mac) {
    libs = [
      "Foundation.framework",
      "IOKit.framework",
    ]
  }

  if (is_ios) {
    # These _mac files are also used on iOS.
    set_sources_assignment_filter([])
    sources += [
      "mac/lib/rlz_value_store_mac.h",
      "mac/lib/rlz_value_store_mac.mm",
    ]
    set_sources_assignment_filter(sources_assignment_filter)
  }
}

source_set("test_support") {
  testonly = true
  sources = [
    "test/rlz_test_helpers.cc",
    "test/rlz_test_helpers.h",
  ]
  deps = [
    ":rlz_lib",
    "//base",
    "//base/test:test_support",
    "//testing/gtest",
  ]
}

test("rlz_unittests") {
  sources = [
    "lib/crc32_unittest.cc",
    "lib/crc8_unittest.cc",
    "lib/financial_ping_test.cc",
    "lib/lib_values_unittest.cc",
    "lib/machine_id_unittest.cc",
    "lib/rlz_lib_test.cc",
    "lib/string_utils_unittest.cc",
    "test/rlz_unittest_main.cc",
    "win/lib/machine_deal_test.cc",
  ]

  # TODO(jschuh): crbug.com/167187 fix size_t to int truncations.
  configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]

  deps = [
    ":rlz_lib",
    ":test_support",
    "//base",
    "//net:test_support",
    "//testing/gmock",
    "//testing/gtest",
    "//third_party/zlib",
  ]
}

if (!is_ios) {
  executable("rlz_id") {
    sources = [
      "examples/rlz_id.cc",
    ]
    deps = [
      ":rlz_lib",
      "//build/config/sanitizers:deps",
      "//build/win:default_exe_manifest",
    ]
  }
}

if (is_win) {
  shared_library("rlz") {
    sources = [
      "win/dll/dll_main.cc",
      "win/dll/exports.cc",
    ]
    deps = [
      ":rlz_lib",
      "//build/config/sanitizers:deps",
      "//third_party/zlib",
    ]
  }
}
