# 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",
      "//services/network/public/cpp:cpp",
      "//services/network/public/mojom",
      "//url",
    ]

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

    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",
      "//services/network/public/cpp:cpp",
      "//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",
      "//mojo/core/embedder",
      "//net:test_support",
      "//services/network:test_support",
      "//testing/gmock",
      "//testing/gtest",
      "//third_party/zlib",
    ]
    if (is_chromeos) {
      deps += [
        "//chromeos:test_support",
        "//chromeos/dbus:test_support",
      ]
    }
  }
}

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