# 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" ] } } # 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", # Used for conditional changes to the compilation process that # are only needed for the Fuchsia toolchain. "-DICU_IS_IN_FUCHSIA", ] } } # 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 } } 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" ] } } 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" ] } } }