# 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/dbus",
        "//chromeos/system",
      ]
    }

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

  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/dbus:test_support",
        "//chromeos/system",
      ]
    }
  }
}

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