blob: 1d15fb49bedfd91fcbed19eca380bcbfbe045cac [file] [log] [blame]
# 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")
}
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",
]
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" ]
}
}
# 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" ]
}
} 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" ]
# 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_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" ]
}
}
}