xref: /aosp_15_r20/external/cronet/third_party/icu/BUILD.gn (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker# Copyright 2014 The Chromium Authors. All rights reserved.
2*6777b538SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker# found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Workerimport("//build/config/features.gni")
6*6777b538SAndroid Build Coastguard Workerimport("//build/config/host_byteorder.gni")
7*6777b538SAndroid Build Coastguard Workerimport("config.gni")
8*6777b538SAndroid Build Coastguard Workerimport("sources.gni")
9*6777b538SAndroid Build Coastguard Worker
10*6777b538SAndroid Build Coastguard Workerif (is_android) {
11*6777b538SAndroid Build Coastguard Worker  import("//build/config/android/rules.gni")
12*6777b538SAndroid Build Coastguard Worker}
13*6777b538SAndroid Build Coastguard Worker
14*6777b538SAndroid Build Coastguard Workerif (is_mac && !icu_is_in_fuchsia) {
15*6777b538SAndroid Build Coastguard Worker  import("//build/config/sanitizers/sanitizers.gni")
16*6777b538SAndroid Build Coastguard Worker}
17*6777b538SAndroid Build Coastguard Worker
18*6777b538SAndroid Build Coastguard Workerassert(!icu_disable_thin_archive || !is_component_build,
19*6777b538SAndroid Build Coastguard Worker       "icu_disable_thin_archive only works in static library builds")
20*6777b538SAndroid Build Coastguard Worker
21*6777b538SAndroid Build Coastguard Worker# Meta target that includes both icuuc and icui18n. Most targets want both.
22*6777b538SAndroid Build Coastguard Worker# You can depend on the individually if you need to.
23*6777b538SAndroid Build Coastguard Workergroup("icu") {
24*6777b538SAndroid Build Coastguard Worker  public_deps = [
25*6777b538SAndroid Build Coastguard Worker    ":icui18n",
26*6777b538SAndroid Build Coastguard Worker    ":icuuc",
27*6777b538SAndroid Build Coastguard Worker  ]
28*6777b538SAndroid Build Coastguard Worker}
29*6777b538SAndroid Build Coastguard Worker
30*6777b538SAndroid Build Coastguard Worker# Shared config used by ICU and all dependents.
31*6777b538SAndroid Build Coastguard Workerconfig("icu_config") {
32*6777b538SAndroid Build Coastguard Worker  defines = [
33*6777b538SAndroid Build Coastguard Worker    # Tell ICU to not insert |using namespace icu;| into its headers,
34*6777b538SAndroid Build Coastguard Worker    # so that chrome's source explicitly has to use |icu::|.
35*6777b538SAndroid Build Coastguard Worker    "U_USING_ICU_NAMESPACE=0",
36*6777b538SAndroid Build Coastguard Worker
37*6777b538SAndroid Build Coastguard Worker    # We don't use ICU plugins and dyload is only necessary for them.
38*6777b538SAndroid Build Coastguard Worker    # NaCl-related builds also fail looking for dlfcn.h when it's enabled.
39*6777b538SAndroid Build Coastguard Worker    "U_ENABLE_DYLOAD=0",
40*6777b538SAndroid Build Coastguard Worker
41*6777b538SAndroid Build Coastguard Worker    # v8/Blink need to know whether Chromium's copy of ICU is used or not.
42*6777b538SAndroid Build Coastguard Worker    "USE_CHROMIUM_ICU=1",
43*6777b538SAndroid Build Coastguard Worker
44*6777b538SAndroid Build Coastguard Worker    # Enable tracing to connect to UMA but disable tracing of resource
45*6777b538SAndroid Build Coastguard Worker    # to avoid performance issues.
46*6777b538SAndroid Build Coastguard Worker    "U_ENABLE_TRACING=1",
47*6777b538SAndroid Build Coastguard Worker    "U_ENABLE_RESOURCE_TRACING=0",
48*6777b538SAndroid Build Coastguard Worker  ]
49*6777b538SAndroid Build Coastguard Worker
50*6777b538SAndroid Build Coastguard Worker  if (!is_component_build) {
51*6777b538SAndroid Build Coastguard Worker    defines += [ "U_STATIC_IMPLEMENTATION" ]
52*6777b538SAndroid Build Coastguard Worker  }
53*6777b538SAndroid Build Coastguard Worker
54*6777b538SAndroid Build Coastguard Worker  include_dirs = [
55*6777b538SAndroid Build Coastguard Worker    "source/common",
56*6777b538SAndroid Build Coastguard Worker    "source/i18n",
57*6777b538SAndroid Build Coastguard Worker  ]
58*6777b538SAndroid Build Coastguard Worker
59*6777b538SAndroid Build Coastguard Worker  if (icu_use_data_file) {
60*6777b538SAndroid Build Coastguard Worker    defines += [ "ICU_UTIL_DATA_IMPL=ICU_UTIL_DATA_FILE" ]
61*6777b538SAndroid Build Coastguard Worker  } else {
62*6777b538SAndroid Build Coastguard Worker    defines += [ "ICU_UTIL_DATA_IMPL=ICU_UTIL_DATA_STATIC" ]
63*6777b538SAndroid Build Coastguard Worker  }
64*6777b538SAndroid Build Coastguard Worker}
65*6777b538SAndroid Build Coastguard Worker
66*6777b538SAndroid Build Coastguard Worker# Config used only by ICU code.
67*6777b538SAndroid Build Coastguard Workerconfig("icu_code") {
68*6777b538SAndroid Build Coastguard Worker  cflags = []
69*6777b538SAndroid Build Coastguard Worker  defines = [
70*6777b538SAndroid Build Coastguard Worker    "HAVE_DLOPEN=0",
71*6777b538SAndroid Build Coastguard Worker
72*6777b538SAndroid Build Coastguard Worker    # Only build encoding coverters and detectors necessary for HTML5.
73*6777b538SAndroid Build Coastguard Worker    "UCONFIG_ONLY_HTML_CONVERSION=1",
74*6777b538SAndroid Build Coastguard Worker
75*6777b538SAndroid Build Coastguard Worker    "UCONFIG_USE_ML_PHRASE_BREAKING=1",
76*6777b538SAndroid Build Coastguard Worker
77*6777b538SAndroid Build Coastguard Worker    # TODO(jshin): do we still need this?
78*6777b538SAndroid Build Coastguard Worker    "UCONFIG_USE_WINDOWS_LCID_MAPPING_API=0",
79*6777b538SAndroid Build Coastguard Worker
80*6777b538SAndroid Build Coastguard Worker    # No dependency on the default platform encoding.
81*6777b538SAndroid Build Coastguard Worker    # Will cut down the code size.
82*6777b538SAndroid Build Coastguard Worker    "U_CHARSET_IS_UTF8=1",
83*6777b538SAndroid Build Coastguard Worker  ]
84*6777b538SAndroid Build Coastguard Worker
85*6777b538SAndroid Build Coastguard Worker  if (is_win) {
86*6777b538SAndroid Build Coastguard Worker    # Disable some compiler warnings.
87*6777b538SAndroid Build Coastguard Worker    cflags += [
88*6777b538SAndroid Build Coastguard Worker      "/wd4005",  # Macro redefinition.
89*6777b538SAndroid Build Coastguard Worker      "/wd4068",  # Unknown pragmas.
90*6777b538SAndroid Build Coastguard Worker      "/wd4267",  # Conversion from size_t on 64-bits.
91*6777b538SAndroid Build Coastguard Worker      "/utf-8",  # ICU source files are in UTF-8.
92*6777b538SAndroid Build Coastguard Worker    ]
93*6777b538SAndroid Build Coastguard Worker    if (!is_clang) {
94*6777b538SAndroid Build Coastguard Worker      cflags += [
95*6777b538SAndroid Build Coastguard Worker        # Ignore some msvc warnings here because V8 still supports msvc.
96*6777b538SAndroid Build Coastguard Worker        "/wd4244",  # Conversion: possible loss of data.
97*6777b538SAndroid Build Coastguard Worker      ]
98*6777b538SAndroid Build Coastguard Worker      defines += [
99*6777b538SAndroid Build Coastguard Worker        # https://crbug.com/1274247
100*6777b538SAndroid Build Coastguard Worker        # <ctgmath> is deprecated in C++17, but ICU still uses it, so we should
101*6777b538SAndroid Build Coastguard Worker        # silence the warning for now.
102*6777b538SAndroid Build Coastguard Worker        "_SILENCE_CXX17_C_HEADER_DEPRECATION_WARNING",
103*6777b538SAndroid Build Coastguard Worker      ]
104*6777b538SAndroid Build Coastguard Worker    }
105*6777b538SAndroid Build Coastguard Worker  } else if (is_linux || is_chromeos || is_android || icu_is_in_fuchsia) {
106*6777b538SAndroid Build Coastguard Worker    cflags += [ "-Wno-unused-function" ]
107*6777b538SAndroid Build Coastguard Worker  }
108*6777b538SAndroid Build Coastguard Worker  if (is_clang) {
109*6777b538SAndroid Build Coastguard Worker    cflags += [
110*6777b538SAndroid Build Coastguard Worker      # ICU has some code with the pattern:
111*6777b538SAndroid Build Coastguard Worker      #   if (found = uprv_getWindowsTimeZoneInfo(...))
112*6777b538SAndroid Build Coastguard Worker      "-Wno-parentheses",
113*6777b538SAndroid Build Coastguard Worker
114*6777b538SAndroid Build Coastguard Worker      # ucnv2022.cpp contains three functions that are only used when
115*6777b538SAndroid Build Coastguard Worker      # certain preprocessor defines are set.
116*6777b538SAndroid Build Coastguard Worker      # unistr.cpp also has an unused function for non-component builds.
117*6777b538SAndroid Build Coastguard Worker      "-Wno-unused-function",
118*6777b538SAndroid Build Coastguard Worker
119*6777b538SAndroid Build Coastguard Worker      # putil.cpp contains unused variables when building for iOS simulators.
120*6777b538SAndroid Build Coastguard Worker      "-Wno-unused-variable",
121*6777b538SAndroid Build Coastguard Worker
122*6777b538SAndroid Build Coastguard Worker      # ICU has decided not to fix this warning as doing so would break its
123*6777b538SAndroid Build Coastguard Worker      # stable API.
124*6777b538SAndroid Build Coastguard Worker      "-Wno-ambiguous-reversed-operator",
125*6777b538SAndroid Build Coastguard Worker    ]
126*6777b538SAndroid Build Coastguard Worker  }
127*6777b538SAndroid Build Coastguard Worker  if (is_clang || is_linux || is_chromeos || is_android || icu_is_in_fuchsia) {
128*6777b538SAndroid Build Coastguard Worker    cflags += [
129*6777b538SAndroid Build Coastguard Worker      # ICU uses its own deprecated functions.
130*6777b538SAndroid Build Coastguard Worker      "-Wno-deprecated-declarations",
131*6777b538SAndroid Build Coastguard Worker    ]
132*6777b538SAndroid Build Coastguard Worker  }
133*6777b538SAndroid Build Coastguard Worker  if (icu_is_in_fuchsia) {
134*6777b538SAndroid Build Coastguard Worker    cflags += [
135*6777b538SAndroid Build Coastguard Worker      # Disable spurious thread safety errors in umutex.cpp
136*6777b538SAndroid Build Coastguard Worker      "-Wno-thread-safety",
137*6777b538SAndroid Build Coastguard Worker
138*6777b538SAndroid Build Coastguard Worker      # Can probably remove the below after
139*6777b538SAndroid Build Coastguard Worker      # https://unicode-org.atlassian.net/projects/ICU/issues/ICU-20869
140*6777b538SAndroid Build Coastguard Worker      # is fixed.
141*6777b538SAndroid Build Coastguard Worker      "-Wno-implicit-int-float-conversion",
142*6777b538SAndroid Build Coastguard Worker      "-Wno-conversion",
143*6777b538SAndroid Build Coastguard Worker
144*6777b538SAndroid Build Coastguard Worker      # Needed for C++20
145*6777b538SAndroid Build Coastguard Worker      "-Wno-ambiguous-reversed-operator",
146*6777b538SAndroid Build Coastguard Worker      "-Wno-rewrite-not-bool",
147*6777b538SAndroid Build Coastguard Worker      "-Wno-deprecated-anon-enum-enum-conversion",
148*6777b538SAndroid Build Coastguard Worker      "-Wno-deprecated-array-compare",
149*6777b538SAndroid Build Coastguard Worker      "-Wno-deprecated-pragma",
150*6777b538SAndroid Build Coastguard Worker
151*6777b538SAndroid Build Coastguard Worker      # Used for conditional changes to the compilation process that
152*6777b538SAndroid Build Coastguard Worker      # are only needed for the Fuchsia toolchain.
153*6777b538SAndroid Build Coastguard Worker      "-DICU_IS_IN_FUCHSIA",
154*6777b538SAndroid Build Coastguard Worker    ] + icu_fuchsia_extra_compile_flags
155*6777b538SAndroid Build Coastguard Worker  }
156*6777b538SAndroid Build Coastguard Worker  if (current_cpu == "wasm") {
157*6777b538SAndroid Build Coastguard Worker    # Tell ICU that we are a 32 bit platform, otherwise,
158*6777b538SAndroid Build Coastguard Worker    # double-conversion-utils.h doesn't know how to operate.
159*6777b538SAndroid Build Coastguard Worker    defines += [ "__i386__" ]
160*6777b538SAndroid Build Coastguard Worker  }
161*6777b538SAndroid Build Coastguard Worker}
162*6777b538SAndroid Build Coastguard Worker
163*6777b538SAndroid Build Coastguard Worker# Config used to set default visibility to hidden.
164*6777b538SAndroid Build Coastguard Workerconfig("visibility_hidden") {
165*6777b538SAndroid Build Coastguard Worker  cflags = []
166*6777b538SAndroid Build Coastguard Worker  if (is_mac || is_linux || is_chromeos || is_android || is_fuchsia) {
167*6777b538SAndroid Build Coastguard Worker    cflags += [ "-fvisibility=hidden" ]
168*6777b538SAndroid Build Coastguard Worker  }
169*6777b538SAndroid Build Coastguard Worker}
170*6777b538SAndroid Build Coastguard Worker
171*6777b538SAndroid Build Coastguard Workertemplate("generate_icu_component") {
172*6777b538SAndroid Build Coastguard Worker  if (icu_is_in_fuchsia) {
173*6777b538SAndroid Build Coastguard Worker    target(default_library_type, target_name) {
174*6777b538SAndroid Build Coastguard Worker      forward_variables_from(invoker,
175*6777b538SAndroid Build Coastguard Worker                             "*",
176*6777b538SAndroid Build Coastguard Worker                             [
177*6777b538SAndroid Build Coastguard Worker                               "testonly",
178*6777b538SAndroid Build Coastguard Worker                               "visibility",
179*6777b538SAndroid Build Coastguard Worker                             ])
180*6777b538SAndroid Build Coastguard Worker      assert(fuchsia_output_name_postfix == "")
181*6777b538SAndroid Build Coastguard Worker
182*6777b538SAndroid Build Coastguard Worker      # If icu_use_target_out_dir is defined and set, then the component
183*6777b538SAndroid Build Coastguard Worker      # will be output in the regular target_out_dir, rather than the default
184*6777b538SAndroid Build Coastguard Worker      # root_build_dir.
185*6777b538SAndroid Build Coastguard Worker      # See README.fuchsia for details.
186*6777b538SAndroid Build Coastguard Worker      if (defined(icu_use_target_out_dir) && icu_use_target_out_dir) {
187*6777b538SAndroid Build Coastguard Worker        output_dir = target_out_dir
188*6777b538SAndroid Build Coastguard Worker      }
189*6777b538SAndroid Build Coastguard Worker
190*6777b538SAndroid Build Coastguard Worker      # ICU uses RTTI, replace the default "no rtti" config (if applied).
191*6777b538SAndroid Build Coastguard Worker      configs += [
192*6777b538SAndroid Build Coastguard Worker        "//build/config:no_rtti",
193*6777b538SAndroid Build Coastguard Worker        "//build/config:symbol_visibility_hidden",
194*6777b538SAndroid Build Coastguard Worker      ]
195*6777b538SAndroid Build Coastguard Worker      configs -= [
196*6777b538SAndroid Build Coastguard Worker        "//build/config:no_rtti",
197*6777b538SAndroid Build Coastguard Worker        "//build/config:symbol_visibility_hidden",
198*6777b538SAndroid Build Coastguard Worker      ]
199*6777b538SAndroid Build Coastguard Worker
200*6777b538SAndroid Build Coastguard Worker      configs += [ "//build/config:rtti" ]
201*6777b538SAndroid Build Coastguard Worker
202*6777b538SAndroid Build Coastguard Worker      # These need to be applied after the main configs so the "-Wno-*" options
203*6777b538SAndroid Build Coastguard Worker      # take effect.
204*6777b538SAndroid Build Coastguard Worker      configs += [ ":icu_code" ]
205*6777b538SAndroid Build Coastguard Worker      configs += extra_configs
206*6777b538SAndroid Build Coastguard Worker      # Add Fuchsia-specific configs
207*6777b538SAndroid Build Coastguard Worker      configs += icu_fuchsia_extra_configs
208*6777b538SAndroid Build Coastguard Worker      # Remove Fuchsia-specific configs, the "add-then-remove" ensures that
209*6777b538SAndroid Build Coastguard Worker      # removing a config that is not there does not fail.
210*6777b538SAndroid Build Coastguard Worker      configs += icu_fuchsia_remove_configs
211*6777b538SAndroid Build Coastguard Worker      configs -= icu_fuchsia_remove_configs
212*6777b538SAndroid Build Coastguard Worker      public_configs = [ ":icu_config" ]
213*6777b538SAndroid Build Coastguard Worker    }
214*6777b538SAndroid Build Coastguard Worker  } else {
215*6777b538SAndroid Build Coastguard Worker    component(target_name) {
216*6777b538SAndroid Build Coastguard Worker      forward_variables_from(invoker,
217*6777b538SAndroid Build Coastguard Worker                             "*",
218*6777b538SAndroid Build Coastguard Worker                             [
219*6777b538SAndroid Build Coastguard Worker                               "testonly",
220*6777b538SAndroid Build Coastguard Worker                               "visibility",
221*6777b538SAndroid Build Coastguard Worker                             ])
222*6777b538SAndroid Build Coastguard Worker
223*6777b538SAndroid Build Coastguard Worker      # If icu_use_target_output_dir is defined and set, then the component
224*6777b538SAndroid Build Coastguard Worker      # will be output in the regular target_out_dir, rather than the default
225*6777b538SAndroid Build Coastguard Worker      # root_build_dir.
226*6777b538SAndroid Build Coastguard Worker      # See README.fuchsia for details.
227*6777b538SAndroid Build Coastguard Worker      if (defined(icu_use_target_output_dir) && icu_use_target_output_dir) {
228*6777b538SAndroid Build Coastguard Worker        output_dir = target_out_dir
229*6777b538SAndroid Build Coastguard Worker      }
230*6777b538SAndroid Build Coastguard Worker
231*6777b538SAndroid Build Coastguard Worker      if (is_fuchsia) {
232*6777b538SAndroid Build Coastguard Worker        base_output_name = target_name
233*6777b538SAndroid Build Coastguard Worker        if (defined(invoker.output_name)) {
234*6777b538SAndroid Build Coastguard Worker          base_output_name = invoker.output_name
235*6777b538SAndroid Build Coastguard Worker        }
236*6777b538SAndroid Build Coastguard Worker
237*6777b538SAndroid Build Coastguard Worker        # Fuchsia puts its own libicu*.so in /system/lib where we need to put our
238*6777b538SAndroid Build Coastguard Worker        # .so when doing component builds, so we need to give this a different name.
239*6777b538SAndroid Build Coastguard Worker        output_name = "${base_output_name}_cr${fuchsia_output_name_postfix}"
240*6777b538SAndroid Build Coastguard Worker      } else {
241*6777b538SAndroid Build Coastguard Worker        assert(fuchsia_output_name_postfix == "")
242*6777b538SAndroid Build Coastguard Worker      }
243*6777b538SAndroid Build Coastguard Worker
244*6777b538SAndroid Build Coastguard Worker      # ICU uses RTTI, replace the default "no rtti" config (if applied).
245*6777b538SAndroid Build Coastguard Worker      configs += [
246*6777b538SAndroid Build Coastguard Worker        "//build/config/compiler:no_rtti",
247*6777b538SAndroid Build Coastguard Worker        "//build/config/compiler:chromium_code",
248*6777b538SAndroid Build Coastguard Worker      ]
249*6777b538SAndroid Build Coastguard Worker      configs -= [
250*6777b538SAndroid Build Coastguard Worker        "//build/config/compiler:no_rtti",
251*6777b538SAndroid Build Coastguard Worker        "//build/config/compiler:chromium_code",
252*6777b538SAndroid Build Coastguard Worker      ]
253*6777b538SAndroid Build Coastguard Worker      configs += [
254*6777b538SAndroid Build Coastguard Worker        "//build/config/compiler:rtti",
255*6777b538SAndroid Build Coastguard Worker        "//build/config/compiler:no_chromium_code",
256*6777b538SAndroid Build Coastguard Worker      ]
257*6777b538SAndroid Build Coastguard Worker
258*6777b538SAndroid Build Coastguard Worker      # These need to be applied after the main configs so the "-Wno-*" options
259*6777b538SAndroid Build Coastguard Worker      # take effect.
260*6777b538SAndroid Build Coastguard Worker      configs += [ ":icu_code" ]
261*6777b538SAndroid Build Coastguard Worker      configs += extra_configs
262*6777b538SAndroid Build Coastguard Worker      # See a similar stanza above for details.
263*6777b538SAndroid Build Coastguard Worker      configs += icu_fuchsia_extra_configs
264*6777b538SAndroid Build Coastguard Worker      configs += icu_fuchsia_remove_configs
265*6777b538SAndroid Build Coastguard Worker      configs -= icu_fuchsia_remove_configs
266*6777b538SAndroid Build Coastguard Worker      public_configs = [ ":icu_config" ]
267*6777b538SAndroid Build Coastguard Worker
268*6777b538SAndroid Build Coastguard Worker      # Make icu into a standalone static library. Currently This is only useful
269*6777b538SAndroid Build Coastguard Worker      # on Chrome OS.
270*6777b538SAndroid Build Coastguard Worker      if (icu_disable_thin_archive) {
271*6777b538SAndroid Build Coastguard Worker        configs -= [ "//build/config/compiler:thin_archive" ]
272*6777b538SAndroid Build Coastguard Worker        complete_static_lib = true
273*6777b538SAndroid Build Coastguard Worker      }
274*6777b538SAndroid Build Coastguard Worker    }
275*6777b538SAndroid Build Coastguard Worker  }
276*6777b538SAndroid Build Coastguard Worker}
277*6777b538SAndroid Build Coastguard Worker
278*6777b538SAndroid Build Coastguard Workertemplate("generate_icui18n") {
279*6777b538SAndroid Build Coastguard Worker  generate_icu_component(target_name) {
280*6777b538SAndroid Build Coastguard Worker    assert(defined(invoker.icuuc_deps), "Need the 'icuuc_deps' parameter.")
281*6777b538SAndroid Build Coastguard Worker    icuuc_deps = invoker.icuuc_deps
282*6777b538SAndroid Build Coastguard Worker
283*6777b538SAndroid Build Coastguard Worker    fuchsia_output_name_postfix = ""
284*6777b538SAndroid Build Coastguard Worker    if (defined(invoker.fuchsia_output_name_postfix)) {
285*6777b538SAndroid Build Coastguard Worker      fuchsia_output_name_postfix = invoker.fuchsia_output_name_postfix
286*6777b538SAndroid Build Coastguard Worker    }
287*6777b538SAndroid Build Coastguard Worker
288*6777b538SAndroid Build Coastguard Worker    forward_variables_from(invoker,
289*6777b538SAndroid Build Coastguard Worker                           "*",
290*6777b538SAndroid Build Coastguard Worker                           [
291*6777b538SAndroid Build Coastguard Worker                             "testonly",
292*6777b538SAndroid Build Coastguard Worker                             "visibility",
293*6777b538SAndroid Build Coastguard Worker                           ])
294*6777b538SAndroid Build Coastguard Worker
295*6777b538SAndroid Build Coastguard Worker    sources = icu18n_sources
296*6777b538SAndroid Build Coastguard Worker    public = icu18n_public
297*6777b538SAndroid Build Coastguard Worker
298*6777b538SAndroid Build Coastguard Worker    defines = [ "U_I18N_IMPLEMENTATION" ]
299*6777b538SAndroid Build Coastguard Worker    deps = icuuc_deps
300*6777b538SAndroid Build Coastguard Worker
301*6777b538SAndroid Build Coastguard Worker    # TODO(fxbug.dev/42180987): workaround for toolchain issues, see bug
302*6777b538SAndroid Build Coastguard Worker    if (icu_is_in_fuchsia && is_fuchsia) {
303*6777b538SAndroid Build Coastguard Worker      deps += [ "//build/config/fuchsia:uses-outline-atomics-fxbug98632" ]
304*6777b538SAndroid Build Coastguard Worker    }
305*6777b538SAndroid Build Coastguard Worker  }
306*6777b538SAndroid Build Coastguard Worker}
307*6777b538SAndroid Build Coastguard Worker
308*6777b538SAndroid Build Coastguard Workergenerate_icui18n("icui18n") {
309*6777b538SAndroid Build Coastguard Worker  extra_configs = []
310*6777b538SAndroid Build Coastguard Worker  if (icu_is_in_fuchsia) {
311*6777b538SAndroid Build Coastguard Worker      # See similar stanza above for details.
312*6777b538SAndroid Build Coastguard Worker      extra_configs += icu_fuchsia_extra_configs
313*6777b538SAndroid Build Coastguard Worker      extra_configs += icu_fuchsia_remove_configs
314*6777b538SAndroid Build Coastguard Worker      extra_configs -= icu_fuchsia_remove_configs
315*6777b538SAndroid Build Coastguard Worker  }
316*6777b538SAndroid Build Coastguard Worker  icuuc_deps = [ ":icuuc_private" ]
317*6777b538SAndroid Build Coastguard Worker}
318*6777b538SAndroid Build Coastguard Worker
319*6777b538SAndroid Build Coastguard Workergenerate_icui18n("icui18n_hidden_visibility") {
320*6777b538SAndroid Build Coastguard Worker  extra_configs = [ ":visibility_hidden" ]
321*6777b538SAndroid Build Coastguard Worker  if (icu_is_in_fuchsia) {
322*6777b538SAndroid Build Coastguard Worker      # See similar stanza above for details.
323*6777b538SAndroid Build Coastguard Worker      extra_configs += icu_fuchsia_extra_configs
324*6777b538SAndroid Build Coastguard Worker      extra_configs += icu_fuchsia_remove_configs
325*6777b538SAndroid Build Coastguard Worker      extra_configs -= icu_fuchsia_remove_configs
326*6777b538SAndroid Build Coastguard Worker  }
327*6777b538SAndroid Build Coastguard Worker  icuuc_deps = [ ":icuuc_private_hidden_visibility" ]
328*6777b538SAndroid Build Coastguard Worker  if (is_fuchsia && !icu_is_in_fuchsia) {
329*6777b538SAndroid Build Coastguard Worker    fuchsia_output_name_postfix = "_hidden_visibility"
330*6777b538SAndroid Build Coastguard Worker  }
331*6777b538SAndroid Build Coastguard Worker}
332*6777b538SAndroid Build Coastguard Worker
333*6777b538SAndroid Build Coastguard Workertemplate("generate_icuuc") {
334*6777b538SAndroid Build Coastguard Worker  generate_icu_component(target_name) {
335*6777b538SAndroid Build Coastguard Worker    fuchsia_output_name_postfix = ""
336*6777b538SAndroid Build Coastguard Worker    if (defined(invoker.fuchsia_output_name_postfix)) {
337*6777b538SAndroid Build Coastguard Worker      fuchsia_output_name_postfix = invoker.fuchsia_output_name_postfix
338*6777b538SAndroid Build Coastguard Worker    }
339*6777b538SAndroid Build Coastguard Worker
340*6777b538SAndroid Build Coastguard Worker    forward_variables_from(invoker,
341*6777b538SAndroid Build Coastguard Worker                           "*",
342*6777b538SAndroid Build Coastguard Worker                           [
343*6777b538SAndroid Build Coastguard Worker                             "testonly",
344*6777b538SAndroid Build Coastguard Worker                             "visibility",
345*6777b538SAndroid Build Coastguard Worker                           ])
346*6777b538SAndroid Build Coastguard Worker
347*6777b538SAndroid Build Coastguard Worker    sources = icuuc_sources
348*6777b538SAndroid Build Coastguard Worker    public_deps = [ ":icuuc_public" ]
349*6777b538SAndroid Build Coastguard Worker
350*6777b538SAndroid Build Coastguard Worker    defines = [ "U_COMMON_IMPLEMENTATION" ]
351*6777b538SAndroid Build Coastguard Worker    deps = [ ":icudata" ]
352*6777b538SAndroid Build Coastguard Worker
353*6777b538SAndroid Build Coastguard Worker    if (is_chromeos) {
354*6777b538SAndroid Build Coastguard Worker      deps += [ ":icudata_hash" ]
355*6777b538SAndroid Build Coastguard Worker    }
356*6777b538SAndroid Build Coastguard Worker
357*6777b538SAndroid Build Coastguard Worker    if (icu_use_data_file && icu_use_stub_data) {
358*6777b538SAndroid Build Coastguard Worker      sources += [ "source/stubdata/stubdata.cpp" ]
359*6777b538SAndroid Build Coastguard Worker    }
360*6777b538SAndroid Build Coastguard Worker
361*6777b538SAndroid Build Coastguard Worker    defines += [ "U_ICUDATAENTRY_IN_COMMON" ]
362*6777b538SAndroid Build Coastguard Worker
363*6777b538SAndroid Build Coastguard Worker    # TODO(fxbug.dev/42180987): workaround for toolchain issues, see bug
364*6777b538SAndroid Build Coastguard Worker    if (icu_is_in_fuchsia && is_fuchsia) {
365*6777b538SAndroid Build Coastguard Worker      deps += [ "//build/config/fuchsia:uses-outline-atomics-fxbug98632" ]
366*6777b538SAndroid Build Coastguard Worker    }
367*6777b538SAndroid Build Coastguard Worker  }
368*6777b538SAndroid Build Coastguard Worker}
369*6777b538SAndroid Build Coastguard Worker
370*6777b538SAndroid Build Coastguard Workergroup("icuuc") {
371*6777b538SAndroid Build Coastguard Worker  public_deps = [ ":icuuc_private" ]
372*6777b538SAndroid Build Coastguard Worker}
373*6777b538SAndroid Build Coastguard Worker
374*6777b538SAndroid Build Coastguard Workergroup("icuuc_hidden_visibility") {
375*6777b538SAndroid Build Coastguard Worker  public_deps = [ ":icuuc_private_hidden_visibility" ]
376*6777b538SAndroid Build Coastguard Worker}
377*6777b538SAndroid Build Coastguard Worker
378*6777b538SAndroid Build Coastguard Workersource_set("icuuc_public") {
379*6777b538SAndroid Build Coastguard Worker  sources = icuuc_public
380*6777b538SAndroid Build Coastguard Worker}
381*6777b538SAndroid Build Coastguard Worker
382*6777b538SAndroid Build Coastguard Workergenerate_icuuc("icuuc_private") {
383*6777b538SAndroid Build Coastguard Worker  extra_configs = []
384*6777b538SAndroid Build Coastguard Worker  if (icu_is_in_fuchsia) {
385*6777b538SAndroid Build Coastguard Worker      # See similar stanza above for details.
386*6777b538SAndroid Build Coastguard Worker      extra_configs += icu_fuchsia_extra_configs
387*6777b538SAndroid Build Coastguard Worker      extra_configs += icu_fuchsia_remove_configs
388*6777b538SAndroid Build Coastguard Worker      extra_configs -= icu_fuchsia_remove_configs
389*6777b538SAndroid Build Coastguard Worker  }
390*6777b538SAndroid Build Coastguard Worker  output_name = "icuuc"
391*6777b538SAndroid Build Coastguard Worker  visibility = [
392*6777b538SAndroid Build Coastguard Worker    ":icui18n",
393*6777b538SAndroid Build Coastguard Worker    ":icuuc",
394*6777b538SAndroid Build Coastguard Worker  ]
395*6777b538SAndroid Build Coastguard Worker}
396*6777b538SAndroid Build Coastguard Worker
397*6777b538SAndroid Build Coastguard Workergenerate_icuuc("icuuc_private_hidden_visibility") {
398*6777b538SAndroid Build Coastguard Worker  extra_configs = [ ":visibility_hidden" ]
399*6777b538SAndroid Build Coastguard Worker  if (icu_is_in_fuchsia) {
400*6777b538SAndroid Build Coastguard Worker      # See similar stanza above for details.
401*6777b538SAndroid Build Coastguard Worker      extra_configs += icu_fuchsia_extra_configs
402*6777b538SAndroid Build Coastguard Worker      extra_configs += icu_fuchsia_remove_configs
403*6777b538SAndroid Build Coastguard Worker      extra_configs -= icu_fuchsia_remove_configs
404*6777b538SAndroid Build Coastguard Worker  }
405*6777b538SAndroid Build Coastguard Worker  output_name = "icuuc_hidden_visibility"
406*6777b538SAndroid Build Coastguard Worker  visibility = [
407*6777b538SAndroid Build Coastguard Worker    ":icui18n_hidden_visibility",
408*6777b538SAndroid Build Coastguard Worker    ":icuuc_hidden_visibility",
409*6777b538SAndroid Build Coastguard Worker  ]
410*6777b538SAndroid Build Coastguard Worker  if (is_fuchsia && !icu_is_in_fuchsia) {
411*6777b538SAndroid Build Coastguard Worker    fuchsia_output_name_postfix = "_hidden_visibility"
412*6777b538SAndroid Build Coastguard Worker  }
413*6777b538SAndroid Build Coastguard Worker}
414*6777b538SAndroid Build Coastguard Worker
415*6777b538SAndroid Build Coastguard Workerif (is_android && enable_java_templates) {
416*6777b538SAndroid Build Coastguard Worker  android_assets("icu_assets") {
417*6777b538SAndroid Build Coastguard Worker    if (icu_use_data_file) {
418*6777b538SAndroid Build Coastguard Worker      sources = [ "$root_out_dir/icudtl.dat" ]
419*6777b538SAndroid Build Coastguard Worker      deps = [ ":icudata" ]
420*6777b538SAndroid Build Coastguard Worker      disable_compression = true
421*6777b538SAndroid Build Coastguard Worker    }
422*6777b538SAndroid Build Coastguard Worker  }
423*6777b538SAndroid Build Coastguard Worker}
424*6777b538SAndroid Build Coastguard Worker
425*6777b538SAndroid Build Coastguard Workerif (is_android) {
426*6777b538SAndroid Build Coastguard Worker  data_dir = "android"
427*6777b538SAndroid Build Coastguard Worker} else if (is_ios && !use_blink) {
428*6777b538SAndroid Build Coastguard Worker  data_dir = "ios"
429*6777b538SAndroid Build Coastguard Worker} else if (is_chromeos) {
430*6777b538SAndroid Build Coastguard Worker  data_dir = "chromeos"
431*6777b538SAndroid Build Coastguard Worker} else if (current_cpu == "wasm") {
432*6777b538SAndroid Build Coastguard Worker  data_dir = "flutter"
433*6777b538SAndroid Build Coastguard Worker} else if (icu_is_in_fuchsia && icu_fuchsia_override_data_dir != "") {
434*6777b538SAndroid Build Coastguard Worker  # See //config.gni for details.
435*6777b538SAndroid Build Coastguard Worker  data_dir = icu_fuchsia_override_data_dir
436*6777b538SAndroid Build Coastguard Worker} else {
437*6777b538SAndroid Build Coastguard Worker  data_dir = "common"
438*6777b538SAndroid Build Coastguard Worker}
439*6777b538SAndroid Build Coastguard Worker
440*6777b538SAndroid Build Coastguard Workerif (current_cpu == "mips" || current_cpu == "mips64" ||
441*6777b538SAndroid Build Coastguard Worker    host_byteorder == "big") {
442*6777b538SAndroid Build Coastguard Worker  data_bundle_prefix = "icudtb"
443*6777b538SAndroid Build Coastguard Worker} else {
444*6777b538SAndroid Build Coastguard Worker  data_bundle_prefix = "icudtl"
445*6777b538SAndroid Build Coastguard Worker}
446*6777b538SAndroid Build Coastguard Workerdata_bundle = "${data_bundle_prefix}.dat"
447*6777b538SAndroid Build Coastguard Worker
448*6777b538SAndroid Build Coastguard Worker# Some code paths end up not using these, marking them to avoid build
449*6777b538SAndroid Build Coastguard Worker# breaks.
450*6777b538SAndroid Build Coastguard Worker# See README.fuchsia for details.
451*6777b538SAndroid Build Coastguard Workernot_needed([
452*6777b538SAndroid Build Coastguard Worker             "data_bundle",
453*6777b538SAndroid Build Coastguard Worker             "data_bundle_prefix",
454*6777b538SAndroid Build Coastguard Worker             "data_dir",
455*6777b538SAndroid Build Coastguard Worker           ])
456*6777b538SAndroid Build Coastguard Worker
457*6777b538SAndroid Build Coastguard Workerif (icu_copy_icudata_to_root_build_dir) {
458*6777b538SAndroid Build Coastguard Worker  copy("copy_icudata") {
459*6777b538SAndroid Build Coastguard Worker    sources = [ "$data_dir/$data_bundle" ]
460*6777b538SAndroid Build Coastguard Worker    outputs = [ "$root_out_dir/$data_bundle" ]
461*6777b538SAndroid Build Coastguard Worker    data = [ "$root_out_dir/$data_bundle" ]
462*6777b538SAndroid Build Coastguard Worker  }
463*6777b538SAndroid Build Coastguard Worker}
464*6777b538SAndroid Build Coastguard Worker
465*6777b538SAndroid Build Coastguard Workerif (icu_use_data_file) {
466*6777b538SAndroid Build Coastguard Worker  if (is_ios) {
467*6777b538SAndroid Build Coastguard Worker    bundle_data("icudata") {
468*6777b538SAndroid Build Coastguard Worker      sources = [ "$data_dir/$data_bundle" ]
469*6777b538SAndroid Build Coastguard Worker      outputs = [ "{{bundle_resources_dir}}/{{source_file_part}}" ]
470*6777b538SAndroid Build Coastguard Worker    }
471*6777b538SAndroid Build Coastguard Worker  } else {
472*6777b538SAndroid Build Coastguard Worker    group("icudata") {
473*6777b538SAndroid Build Coastguard Worker      if (icu_copy_icudata_to_root_build_dir) {
474*6777b538SAndroid Build Coastguard Worker        # Guarded by a flag, to avoid name clashes if other build processes
475*6777b538SAndroid Build Coastguard Worker        # also happen to generate the output file by the same name.
476*6777b538SAndroid Build Coastguard Worker        # See README.fuchsia for details.
477*6777b538SAndroid Build Coastguard Worker        public_deps = [ ":copy_icudata" ]
478*6777b538SAndroid Build Coastguard Worker      }
479*6777b538SAndroid Build Coastguard Worker    }
480*6777b538SAndroid Build Coastguard Worker  }
481*6777b538SAndroid Build Coastguard Worker
482*6777b538SAndroid Build Coastguard Worker  if (is_chromeos) {
483*6777b538SAndroid Build Coastguard Worker    copy("icudata_hash") {
484*6777b538SAndroid Build Coastguard Worker      sources = [ "chromeos/icudtl.dat.hash" ]
485*6777b538SAndroid Build Coastguard Worker      outputs = [ "$root_out_dir/icudtl.dat.hash" ]
486*6777b538SAndroid Build Coastguard Worker      if (icu_copy_icudata_to_root_build_dir) {
487*6777b538SAndroid Build Coastguard Worker        data = [ "$root_out_dir/icudtl.dat.hash" ]
488*6777b538SAndroid Build Coastguard Worker      }
489*6777b538SAndroid Build Coastguard Worker    }
490*6777b538SAndroid Build Coastguard Worker  }
491*6777b538SAndroid Build Coastguard Worker} else {
492*6777b538SAndroid Build Coastguard Worker  if (current_cpu == "wasm") {
493*6777b538SAndroid Build Coastguard Worker    data_assembly = "$target_gen_dir/${data_bundle_prefix}_dat.cpp"
494*6777b538SAndroid Build Coastguard Worker  } else {
495*6777b538SAndroid Build Coastguard Worker    data_assembly = "$target_gen_dir/${data_bundle_prefix}_dat.S"
496*6777b538SAndroid Build Coastguard Worker  }
497*6777b538SAndroid Build Coastguard Worker  inline_data_assembly = "$target_gen_dir/${data_bundle_prefix}_dat.cc"
498*6777b538SAndroid Build Coastguard Worker  action("make_data_assembly") {
499*6777b538SAndroid Build Coastguard Worker    if (current_cpu == "wasm") {
500*6777b538SAndroid Build Coastguard Worker      # See scripts/make_data_cpp.py for details on building ICU for wasm.
501*6777b538SAndroid Build Coastguard Worker      script = "scripts/make_data_cpp.py"
502*6777b538SAndroid Build Coastguard Worker      inputs = [ "$data_dir/$data_bundle" ]
503*6777b538SAndroid Build Coastguard Worker      outputs = [ data_assembly ]
504*6777b538SAndroid Build Coastguard Worker      args = [
505*6777b538SAndroid Build Coastguard Worker        rebase_path(inputs[0], root_build_dir),
506*6777b538SAndroid Build Coastguard Worker        rebase_path(data_assembly, root_build_dir),
507*6777b538SAndroid Build Coastguard Worker      ]
508*6777b538SAndroid Build Coastguard Worker    } else {
509*6777b538SAndroid Build Coastguard Worker      script = "scripts/make_data_assembly.py"
510*6777b538SAndroid Build Coastguard Worker      inputs = [ "$data_dir/$data_bundle" ]
511*6777b538SAndroid Build Coastguard Worker      outputs = [ data_assembly ]
512*6777b538SAndroid Build Coastguard Worker      args = [
513*6777b538SAndroid Build Coastguard Worker        rebase_path(inputs[0], root_build_dir),
514*6777b538SAndroid Build Coastguard Worker        rebase_path(data_assembly, root_build_dir),
515*6777b538SAndroid Build Coastguard Worker      ]
516*6777b538SAndroid Build Coastguard Worker      if (is_mac || is_ios) {
517*6777b538SAndroid Build Coastguard Worker        args += [ "--mac" ]
518*6777b538SAndroid Build Coastguard Worker      } else if (is_win) {
519*6777b538SAndroid Build Coastguard Worker        if (target_cpu == "arm64" || target_cpu == "x64") {
520*6777b538SAndroid Build Coastguard Worker          args += [ "--win64" ]
521*6777b538SAndroid Build Coastguard Worker        } else if (target_cpu == "arm" || target_cpu == "x86") {
522*6777b538SAndroid Build Coastguard Worker          args += [ "--win32" ]
523*6777b538SAndroid Build Coastguard Worker        } else {
524*6777b538SAndroid Build Coastguard Worker          assert(false)
525*6777b538SAndroid Build Coastguard Worker        }
526*6777b538SAndroid Build Coastguard Worker      }
527*6777b538SAndroid Build Coastguard Worker    }
528*6777b538SAndroid Build Coastguard Worker  }
529*6777b538SAndroid Build Coastguard Worker
530*6777b538SAndroid Build Coastguard Worker  if (is_win) {
531*6777b538SAndroid Build Coastguard Worker    action("make_inline_data_assembly") {
532*6777b538SAndroid Build Coastguard Worker      deps = [ ":make_data_assembly" ]
533*6777b538SAndroid Build Coastguard Worker      script = "scripts/asm_to_inline_asm.py"
534*6777b538SAndroid Build Coastguard Worker      inputs = [ data_assembly ]
535*6777b538SAndroid Build Coastguard Worker      outputs = [ inline_data_assembly ]
536*6777b538SAndroid Build Coastguard Worker      args = rebase_path([
537*6777b538SAndroid Build Coastguard Worker                           data_assembly,
538*6777b538SAndroid Build Coastguard Worker                           inline_data_assembly,
539*6777b538SAndroid Build Coastguard Worker                         ],
540*6777b538SAndroid Build Coastguard Worker                         root_build_dir)
541*6777b538SAndroid Build Coastguard Worker    }
542*6777b538SAndroid Build Coastguard Worker  } else {
543*6777b538SAndroid Build Coastguard Worker    not_needed([ "inline_data_assembly" ])
544*6777b538SAndroid Build Coastguard Worker  }
545*6777b538SAndroid Build Coastguard Worker
546*6777b538SAndroid Build Coastguard Worker  source_set("icudata") {
547*6777b538SAndroid Build Coastguard Worker    defines = [ "U_HIDE_DATA_SYMBOL" ]
548*6777b538SAndroid Build Coastguard Worker    if (is_win) {
549*6777b538SAndroid Build Coastguard Worker      sources = [ inline_data_assembly ]
550*6777b538SAndroid Build Coastguard Worker      deps = [ ":make_inline_data_assembly" ]
551*6777b538SAndroid Build Coastguard Worker    } else {
552*6777b538SAndroid Build Coastguard Worker      sources = [ data_assembly ]
553*6777b538SAndroid Build Coastguard Worker      deps = [ ":make_data_assembly" ]
554*6777b538SAndroid Build Coastguard Worker      asmflags = []
555*6777b538SAndroid Build Coastguard Worker      if (current_cpu == "arm64") {
556*6777b538SAndroid Build Coastguard Worker        import("//build/config/arm.gni")
557*6777b538SAndroid Build Coastguard Worker        if (arm_control_flow_integrity == "standard") {
558*6777b538SAndroid Build Coastguard Worker          asmflags += [ "-mmark-bti-property" ]
559*6777b538SAndroid Build Coastguard Worker        }
560*6777b538SAndroid Build Coastguard Worker      }
561*6777b538SAndroid Build Coastguard Worker    }
562*6777b538SAndroid Build Coastguard Worker  }
563*6777b538SAndroid Build Coastguard Worker}
564