# 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/host_byteorder.gni")
import("//third_party/icu/config.gni")
import("//third_party/icu/sources.gni")

if (is_android) {
  import("//build/config/android/rules.gni")
}

if (is_mac && !icu_is_in_fuchsia) {
  import("//build/config/sanitizers/sanitizers.gni")
}

if (is_starboard) {
  import("//cobalt/build/contents_dir.gni")
}

assert(!icu_disable_thin_archive || !is_component_build,
       "icu_disable_thin_archive only works in static library builds")

# Meta target that includes both icuuc and icui18n. Most targets want both.
# You can depend on the individually if you need to.
group("icu") {
  public_deps = [
    ":icui18n",
    ":icuuc",
  ]
}

# Shared config used by ICU and all dependents.
config("icu_config") {
  defines = [
    # Tell ICU to not insert |using namespace icu;| into its headers,
    # so that chrome's source explicitly has to use |icu::|.
    "U_USING_ICU_NAMESPACE=0",

    # We don't use ICU plugins and dyload is only necessary for them.
    # NaCl-related builds also fail looking for dlfcn.h when it's enabled.
    "U_ENABLE_DYLOAD=0",

    # v8/Blink need to know whether Chromium's copy of ICU is used or not.
    "USE_CHROMIUM_ICU=1",

    # Enable tracing to connect to UMA but disable tracing of resource
    # to avoid performance issues.
    "U_ENABLE_TRACING=1",
    "U_ENABLE_RESOURCE_TRACING=0",

    # Disable unused ICU code
    "UCONFIG_ONLY_HTML_CONVERSION",
    "UCONFIG_NO_COLLATION",
    "UCONFIG_NO_LEGACY_CONVERSION",
    "UCONFIG_NO_TRANSLITERATION",
    "UCONFIG_NO_REGULAR_EXPRESSIONS"
  ]

  if (is_starboard) {
    defines -= [
      "USE_CHROMIUM_ICU=1",
      "U_ENABLE_TRACING=1",
      "U_ENABLE_RESOURCE_TRACING=0",
    ]
  }

  if (!is_component_build) {
    defines += [ "U_STATIC_IMPLEMENTATION" ]
  }

  include_dirs = [
    "source/common",
    "source/i18n",
  ]

  if (icu_use_data_file) {
    defines += [ "ICU_UTIL_DATA_IMPL=ICU_UTIL_DATA_FILE" ]
  } else {
    defines += [ "ICU_UTIL_DATA_IMPL=ICU_UTIL_DATA_STATIC" ]
  }

  if (is_win) {
    defines += [ "UCHAR_TYPE=wchar_t" ]
  } else {
    defines += [ "UCHAR_TYPE=uint16_t" ]
  }

  if (is_starboard && is_win) {
    cflags = [ "/wd4805"]
  }
}

if (is_starboard) {
  config("icu_dependent_config") {
    if (is_win) {
      cflags = [ "/utf-8" ]
    }
  }
}

# Config used only by ICU code.
config("icu_code") {
  cflags = []
  defines = [
    "HAVE_DLOPEN=0",

    # Only build encoding coverters and detectors necessary for HTML5.
    "UCONFIG_ONLY_HTML_CONVERSION=1",

    # TODO(jshin): do we still need this?
    "UCONFIG_USE_WINDOWS_LCID_MAPPING_API=0",

    # No dependency on the default platform encoding.
    # Will cut down the code size.
    "U_CHARSET_IS_UTF8=1",
  ]

  if (is_win) {
    # Disable some compiler warnings.
    cflags += [
      "/wd4005",  # Macro redefinition.
      "/wd4068",  # Unknown pragmas.
      "/wd4267",  # Conversion from size_t on 64-bits.
      "/utf-8",  # ICU source files are in UTF-8.
    ]
  } else if (is_linux || is_chromeos || is_android || icu_is_in_fuchsia) {
    cflags += [ "-Wno-unused-function" ]
  }
  if (is_clang) {
    cflags += [
      # ICU has some code with the pattern:
      #   if (found = uprv_getWindowsTimeZoneInfo(...))
      "-Wno-parentheses",

      # ucnv2022.cpp contains three functions that are only used when
      # certain preprocessor defines are set.
      # unistr.cpp also has an unused function for non-component builds.
      "-Wno-unused-function",

      # putil.cpp contains unused variables when building for iOS simulators.
      "-Wno-unused-variable",
    ]
  }
  if (is_clang || is_linux || is_chromeos || is_android || icu_is_in_fuchsia) {
    cflags += [
      # ICU uses its own deprecated functions.
      "-Wno-deprecated-declarations",
    ]
  }
  if (icu_is_in_fuchsia) {
    cflags += [
      # Disable spurious thread safety errors in umutex.cpp
      "-Wno-thread-safety",

      # Can probably remove the below after
      # https://unicode-org.atlassian.net/projects/ICU/issues/ICU-20869
      # is fixed.
      "-Wno-implicit-int-float-conversion",
      "-Wno-conversion",
    ]
  }
}

# Config used to set default visibility to hidden.
config("visibility_hidden") {
  cflags = []
  if (is_mac || is_linux || is_chromeos || is_android || is_fuchsia) {
    cflags += [ "-fvisibility=hidden" ]
  }
}

template("generate_icu_component") {
  if (icu_is_in_fuchsia) {
    target(default_library_type, target_name) {
      forward_variables_from(invoker,
                             "*",
                             [
                               "testonly",
                               "visibility",
                             ])
      assert(fuchsia_output_name_postfix == "")

      # ICU uses RTTI, replace the default "no rtti" config (if applied).
      configs += [
        "//build/config:no_rtti",
        "//build/config:symbol_visibility_hidden",
      ]
      configs -= [
        "//build/config:no_rtti",
        "//build/config:symbol_visibility_hidden",
      ]

      configs += [ "//build/config:rtti" ]

      # These need to be applied after the main configs so the "-Wno-*" options
      # take effect.
      configs += [ ":icu_code" ]
      configs += extra_configs
      public_configs = [ ":icu_config" ]
      if (is_starboard) {
        all_dependent_configs = [ ":icu_dependent_config" ]
      }
    }
  } else {
    component(target_name) {
      forward_variables_from(invoker,
                             "*",
                             [
                               "testonly",
                               "visibility",
                             ])
      if (is_fuchsia) {
        # Fuchsia puts its own libicu*.so in /system/lib where we need to put our
        # .so when doing component builds, so we need to give this a different name.
        output_name = "${target_name}_cr${fuchsia_output_name_postfix}"
      } else {
        assert(fuchsia_output_name_postfix == "")
      }

      # ICU uses RTTI, replace the default "no rtti" config (if applied).
      configs += [
        "//build/config/compiler:no_rtti",
        "//build/config/compiler:chromium_code",
      ]
      configs -= [
        "//build/config/compiler:no_rtti",
        "//build/config/compiler:chromium_code",
      ]
      configs += [
        "//build/config/compiler:rtti",
        "//build/config/compiler:no_chromium_code",
      ]

      # These need to be applied after the main configs so the "-Wno-*" options
      # take effect.
      configs += [ ":icu_code" ]
      configs += extra_configs
      public_configs = [ ":icu_config" ]
      if (is_starboard) {
        all_dependent_configs = [ ":icu_dependent_config" ]
      }

      # Make icu into a standalone static library. Currently This is only useful
      # on Chrome OS.
      if (invoker.check_thin_archive && icu_disable_thin_archive) {
        configs -= [ "//build/config/compiler:thin_archive" ]
        complete_static_lib = true
      }
    }
  }
}

template("generate_icui18n") {
  if (!icu_is_in_fuchsia) {
    check_thin_archive = true
  }

  generate_icu_component(target_name) {
    assert(defined(invoker.icuuc_deps), "Need the 'icuuc_deps' parameter.")
    icuuc_deps = invoker.icuuc_deps

    fuchsia_output_name_postfix = ""
    if (defined(invoker.fuchsia_output_name_postfix)) {
      fuchsia_output_name_postfix = invoker.fuchsia_output_name_postfix
    }

    forward_variables_from(invoker,
                           "*",
                           [
                             "testonly",
                             "visibility",
                           ])

    sources = icu18n_sources
    public = icu18n_public

    defines = [ "U_I18N_IMPLEMENTATION" ]
    deps = icuuc_deps

    if (is_starboard) {
      check_includes = false
    }
  }
}

generate_icui18n("icui18n") {
  extra_configs = []
  icuuc_deps = [ ":icuuc" ]
}

generate_icui18n("icui18n_hidden_visibility") {
  extra_configs = [ ":visibility_hidden" ]
  icuuc_deps = [ ":icuuc_hidden_visibility" ]
  if (is_fuchsia && !icu_is_in_fuchsia) {
    fuchsia_output_name_postfix = "_hidden_visibility"
  }
}

template("generate_icuuc") {
  if (!icu_is_in_fuchsia) {
    check_thin_archive = false
  }

  generate_icu_component(target_name) {
    fuchsia_output_name_postfix = ""
    if (defined(invoker.fuchsia_output_name_postfix)) {
      fuchsia_output_name_postfix = invoker.fuchsia_output_name_postfix
    }

    forward_variables_from(invoker,
                           "*",
                           [
                             "testonly",
                             "visibility",
                           ])

    sources = icuuc_sources
    public = icuuc_public

    defines = [ "U_COMMON_IMPLEMENTATION" ]
    deps = [ ":icudata" ]

    if (icu_use_data_file) {
      sources += [ "source/stubdata/stubdata.cpp" ]
    }

    defines += [ "U_ICUDATAENTRY_IN_COMMON" ]

    if (is_starboard) {
      public_deps = [ "//starboard:starboard_headers_only" ]
      defines += [
        "U_HAVE_NL_LANGINFO_CODESET=0",
        "U_HAVE_NL_LANGINFO=0"
      ]
    }
  }
}

generate_icuuc("icuuc") {
  extra_configs = []
}
generate_icuuc("icuuc_hidden_visibility") {
  extra_configs = [ ":visibility_hidden" ]
  if (is_fuchsia && !icu_is_in_fuchsia) {
    fuchsia_output_name_postfix = "_hidden_visibility"
  }
}

if (is_android && enable_java_templates) {
  android_assets("icu_assets") {
    if (icu_use_data_file) {
      sources = [ "$root_out_dir/icudtl.dat" ]
      deps = [ ":icudata" ]
      disable_compression = true
    }
  }

  android_assets("icu_extra_assets") {
    if (icu_use_data_file) {
      sources = [ "$root_out_dir/icudtl_extra.dat" ]
      deps = [ ":extra_icudata" ]
      disable_compression = true
    }
  }
}

if (is_android) {
  # Use android_small for now to keep the size till we decide to switch to the new one.
  data_dir = "android_small"
} else if (is_ios) {
  data_dir = "ios"
} else if (is_chromeos) {
  data_dir = "chromeos"
} else {
  data_dir = "common"
}

if (current_cpu == "mips" || current_cpu == "mips64" ||
    host_byteorder == "big") {
  data_bundle_prefix = "icudtb"
} else {
  data_bundle_prefix = "icudtl"
}
data_bundle = "${data_bundle_prefix}.dat"

if (icu_use_data_file) {
  if (is_starboard) {
    not_needed([ "data_bundle", "data_dir" ])
    copy("icudata") {
      install_content = true
      filename = "icudt68l.dat"
      sources = [ "$static_contents_source_dir/icu/$filename"]
      output = "$sb_static_contents_output_data_dir/icu/$filename"
      outputs = [ output ]
      data = [ output ]
    }
  } else if (is_ios) {
    bundle_data("icudata") {
      sources = [ "$data_dir/$data_bundle" ]
      outputs = [ "{{bundle_resources_dir}}/{{source_file_part}}" ]
    }
  } else {
    copy("icudata") {
      sources = [ "$data_dir/$data_bundle" ]
      outputs = [ "$root_out_dir/$data_bundle" ]
      data = [ "$root_out_dir/$data_bundle" ]
    }
  }

  copy("extra_icudata") {
    sources = [ "//third_party/icu/android_small/icudtl_extra.dat" ]
    outputs = [ "$root_out_dir/icudtl_extra.dat" ]
  }
} else {
  data_assembly = "$target_gen_dir/${data_bundle_prefix}_dat.S"
  inline_data_assembly = "$target_gen_dir/${data_bundle_prefix}_dat.cc"
  action("make_data_assembly") {
    script = "scripts/make_data_assembly.py"
    inputs = [ "$data_dir/$data_bundle" ]
    outputs = [ data_assembly ]
    args = [
      rebase_path(inputs[0], root_build_dir),
      rebase_path(data_assembly, root_build_dir),
    ]
    if (is_mac || is_ios) {
      args += [ "--mac" ]
    } else if (is_win) {
      args += [ "--win" ]
    }
  }

  if (is_win) {
    action("make_inline_data_assembly") {
      deps = [ ":make_data_assembly" ]
      script = "scripts/asm_to_inline_asm.py"
      inputs = [ data_assembly ]
      outputs = [ inline_data_assembly ]
      args = rebase_path([
                           data_assembly,
                           inline_data_assembly,
                         ],
                         root_build_dir)
    }
  } else {
    not_needed([ "inline_data_assembly" ])
  }

  source_set("icudata") {
    defines = [ "U_HIDE_DATA_SYMBOL" ]
    if (is_win) {
      sources = [ inline_data_assembly ]
      deps = [ ":make_inline_data_assembly" ]
    } else {
      sources = [ data_assembly ]
      deps = [ ":make_data_assembly" ]
    }
  }
}
