# 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_utils") {
  sources = [
    "lib/assert.cc",
    "lib/assert.h",
    "lib/crc32.h",
    "lib/crc32_wrapper.cc",
    "lib/lib_values.cc",
    "lib/lib_values.h",
    "lib/net_response_check.cc",
    "lib/net_response_check.h",
    "lib/rlz_api.h",
    "lib/rlz_enums.h",
    "lib/string_utils.cc",
    "lib/string_utils.h",
  ]

  public_configs = [ ":rlz_config" ]

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

if (!is_android) {
  source_set("rlz_lib") {
    sources = [
      "chromeos/lib/rlz_value_store_chromeos.cc",
      "chromeos/lib/rlz_value_store_chromeos.h",
      "ios/lib/machine_id_ios.cc",
      "lib/crc8.cc",
      "lib/crc8.h",
      "lib/financial_ping.cc",
      "lib/financial_ping.h",
      "lib/machine_id.cc",
      "lib/machine_id.h",
      "lib/rlz_lib.cc",
      "lib/rlz_lib.h",
      "lib/rlz_lib_clear.cc",
      "lib/rlz_value_store.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 = [
      ":rlz_utils",
      "//base",
      "//base/third_party/dynamic_annotations",
      "//net",
      "//url",
    ]

    if (is_posix) {
      sources += [
        "lib/recursive_cross_process_lock_posix.cc",
        "lib/recursive_cross_process_lock_posix.h",
      ]
    }
    if (is_chromeos) {
      deps += [ "//chromeos" ]
    }

    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",
    ]
    if (is_chromeos) {
      deps += [ "//chromeos" ]
    }
  }

  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",
      ":rlz_utils",
      ":test_support",
      "//base",
      "//net:test_support",
      "//testing/gmock",
      "//testing/gtest",
      "//third_party/zlib",
    ]
    if (is_chromeos) {
      deps += [ "//chromeos" ]
    }
  }
}

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

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