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

import("//build/config/chrome_build.gni")
import("//build/config/features.gni")
import("//build/config/ui.gni")
import("//extensions/features/features.gni")
import("//tools/grit/repack.gni")

assert(!is_ios, "Chromium/iOS shouldn't use anything in //chrome")

# Wraps repack_locales(), setting the source_patterns and deps required for
# Chrome.
#
# Extra Parameters:
#
#   additional_source_patterns [optional]
#      Extra source_patterns for repack_locales().
template("chrome_repack_locales") {
  repack_locales(target_name) {
    forward_variables_from(invoker, "*", [ "additional_source_patterns" ])

    # Each input pak file should also have a deps line.
    source_patterns = [
      "${root_gen_dir}/chrome/generated_resources_",
      "${root_gen_dir}/chrome/locale_settings_",
      "${root_gen_dir}/chrome/platform_locale_settings_",
      "${root_gen_dir}/components/strings/components_locale_settings_",
      "${root_gen_dir}/components/strings/components_strings_",
      "${root_gen_dir}/content/app/strings/content_strings_",
      "${root_gen_dir}/device/bluetooth/strings/bluetooth_strings_",
      "${root_gen_dir}/third_party/libaddressinput/address_input_strings_",
      "${root_gen_dir}/ui/strings/app_locale_settings_",
      "${root_gen_dir}/ui/strings/ui_strings_",
    ]
    if (!defined(deps)) {
      deps = []
    }
    deps += [
      "//chrome/app:generated_resources",
      "//chrome/app/resources:locale_settings",
      "//chrome/app/resources:platform_locale_settings",
      "//components/strings:components_locale_settings",
      "//components/strings:components_strings",
      "//content/app/strings",
      "//device/bluetooth/strings",
      "//third_party/libaddressinput:strings",
      "//ui/strings:app_locale_settings",
      "//ui/strings:ui_strings",
    ]
    if (defined(invoker.deps)) {
      deps += invoker.deps
    }

    if (is_chromeos) {
      source_patterns += [
        "${root_gen_dir}/ash/strings/ash_strings_",
        "${root_gen_dir}/remoting/resources/",
        "${root_gen_dir}/ui/chromeos/strings/ui_chromeos_strings_",
      ]
      deps += [
        "//ash/strings",
        "//remoting/resources",
        "//ui/chromeos/strings",
      ]
    }
    if (enable_extensions) {
      source_patterns +=
          [ "${root_gen_dir}/extensions/strings/extensions_strings_" ]
      deps += [ "//extensions/strings" ]
    }

    if (is_chrome_branded) {
      source_patterns += [
        "${root_gen_dir}/chrome/google_chrome_strings_",
        "${root_gen_dir}/components/strings/components_google_chrome_strings_",
      ]
      deps += [
        "//chrome/app:google_chrome_strings",
        "//components/strings:components_google_chrome_strings",
      ]
    } else {
      source_patterns += [
        "${root_gen_dir}/chrome/chromium_strings_",
        "${root_gen_dir}/components/strings/components_chromium_strings_",
      ]
      deps += [
        "//chrome/app:chromium_strings",
        "//components/strings:components_chromium_strings",
      ]
    }

    if (defined(invoker.additional_source_patterns)) {
      source_patterns += invoker.additional_source_patterns
    }
  }
}
