1e509ee18Sopenharmony_ci# Copyright (c) 2022-2023 Huawei Device Co., Ltd.
2e509ee18Sopenharmony_ci# Licensed under the Apache License, Version 2.0 (the "License");
3e509ee18Sopenharmony_ci# you may not use this file except in compliance with the License.
4e509ee18Sopenharmony_ci# You may obtain a copy of the License at
5e509ee18Sopenharmony_ci#
6e509ee18Sopenharmony_ci# http://www.apache.org/licenses/LICENSE-2.0
7e509ee18Sopenharmony_ci#
8e509ee18Sopenharmony_ci# Unless required by applicable law or agreed to in writing, software
9e509ee18Sopenharmony_ci# distributed under the License is distributed on an "AS IS" BASIS,
10e509ee18Sopenharmony_ci# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11e509ee18Sopenharmony_ci# See the License for the specific language governing permissions and
12e509ee18Sopenharmony_ci# limitations under the License.
13e509ee18Sopenharmony_ci
14e509ee18Sopenharmony_ciimport("$build_root/config/compiler/compiler.gni")
15e509ee18Sopenharmony_ciimport("$build_root/config/sanitizers/sanitizers.gni")
16e509ee18Sopenharmony_ciimport("$build_root/toolchain/toolchain.gni")
17e509ee18Sopenharmony_ciif (current_cpu == "arm" || current_cpu == "arm64") {
18e509ee18Sopenharmony_ci  import("$build_root/config/arm.gni")
19e509ee18Sopenharmony_ci}
20e509ee18Sopenharmony_ci
21e509ee18Sopenharmony_cideclare_args() {
22e509ee18Sopenharmony_ci  treat_warnings_as_errors = true
23e509ee18Sopenharmony_ci}
24e509ee18Sopenharmony_ci
25e509ee18Sopenharmony_ciuse_rtti = use_cfi_diag || is_ubsan_vptr || is_ubsan_security
26e509ee18Sopenharmony_ci
27e509ee18Sopenharmony_ciconfig("rtti") {
28e509ee18Sopenharmony_ci  if (is_win) {
29e509ee18Sopenharmony_ci    cflags_cc = [ "/GR" ]
30e509ee18Sopenharmony_ci  } else {
31e509ee18Sopenharmony_ci    cflags_cc = [ "-frtti" ]
32e509ee18Sopenharmony_ci  }
33e509ee18Sopenharmony_ci}
34e509ee18Sopenharmony_ci
35e509ee18Sopenharmony_ciconfig("no_exceptions") {
36e509ee18Sopenharmony_ci  if (is_linux) {
37e509ee18Sopenharmony_ci    cflags_cc = [ "-fno-exceptions" ]
38e509ee18Sopenharmony_ci    cflags_objcc = cflags_cc
39e509ee18Sopenharmony_ci  }
40e509ee18Sopenharmony_ci}
41e509ee18Sopenharmony_ci
42e509ee18Sopenharmony_ciconfig("optimize_speed") {
43e509ee18Sopenharmony_ci  if (is_linux) {
44e509ee18Sopenharmony_ci    cflags_cc = [ "-O3" ]
45e509ee18Sopenharmony_ci  }
46e509ee18Sopenharmony_ci}
47e509ee18Sopenharmony_ci
48e509ee18Sopenharmony_ciconfig("no_rtti") {
49e509ee18Sopenharmony_ci  # Some sanitizer configs may require RTTI to be left enabled globally
50e509ee18Sopenharmony_ci  if (!use_rtti) {
51e509ee18Sopenharmony_ci    if (is_win) {
52e509ee18Sopenharmony_ci      cflags_cc = [ "/GR-" ]
53e509ee18Sopenharmony_ci    } else {
54e509ee18Sopenharmony_ci      cflags_cc = [ "-fno-rtti" ]
55e509ee18Sopenharmony_ci      cflags_objcc = cflags_cc
56e509ee18Sopenharmony_ci    }
57e509ee18Sopenharmony_ci  }
58e509ee18Sopenharmony_ci}
59e509ee18Sopenharmony_ci
60e509ee18Sopenharmony_ciconfig("exceptions") {
61e509ee18Sopenharmony_ci  cflags_cc = [ "-fexceptions" ]
62e509ee18Sopenharmony_ci}
63e509ee18Sopenharmony_ci
64e509ee18Sopenharmony_cicommon_optimize_on_cflags = []
65e509ee18Sopenharmony_cicommon_optimize_on_ldflags = []
66e509ee18Sopenharmony_ci
67e509ee18Sopenharmony_ciif (is_ohos) {
68e509ee18Sopenharmony_ci  common_optimize_on_ldflags += [
69e509ee18Sopenharmony_ci    "-Wl,--warn-shared-textrel",  # Warn in case of text relocations.
70e509ee18Sopenharmony_ci  ]
71e509ee18Sopenharmony_ci}
72e509ee18Sopenharmony_ci
73e509ee18Sopenharmony_ciif (!(is_mac || is_ios)) {
74e509ee18Sopenharmony_ci  # Non-Mac Posix flags.
75e509ee18Sopenharmony_ci
76e509ee18Sopenharmony_ci  common_optimize_on_ldflags += [
77e509ee18Sopenharmony_ci    # Specifically tell the linker to perform optimizations.
78e509ee18Sopenharmony_ci    # -O2 enables string tail merge optimization in gold and lld.
79e509ee18Sopenharmony_ci    "-Wl,-O2",
80e509ee18Sopenharmony_ci  ]
81e509ee18Sopenharmony_ci  if (!is_mingw) {
82e509ee18Sopenharmony_ci    common_optimize_on_ldflags += [ "-Wl,--gc-sections" ]
83e509ee18Sopenharmony_ci  }
84e509ee18Sopenharmony_ci
85e509ee18Sopenharmony_ci  common_optimize_on_cflags += [
86e509ee18Sopenharmony_ci    # Put data and code in their own sections, so that unused symbols
87e509ee18Sopenharmony_ci    # can be removed at link time with --gc-sections.
88e509ee18Sopenharmony_ci    "-fdata-sections",
89e509ee18Sopenharmony_ci    "-ffunction-sections",
90e509ee18Sopenharmony_ci
91e509ee18Sopenharmony_ci    # Don't emit the GCC version ident directives, they just end up in the
92e509ee18Sopenharmony_ci    # .comment section taking up binary size.
93e509ee18Sopenharmony_ci    "-fno-ident",
94e509ee18Sopenharmony_ci  ]
95e509ee18Sopenharmony_ci}
96e509ee18Sopenharmony_ci
97e509ee18Sopenharmony_ci# Turn off optimizations.
98e509ee18Sopenharmony_ciconfig("no_optimize") {
99e509ee18Sopenharmony_ci  if (is_ohos_or_android) {
100e509ee18Sopenharmony_ci    ldflags = common_optimize_on_ldflags
101e509ee18Sopenharmony_ci    cflags = common_optimize_on_cflags
102e509ee18Sopenharmony_ci
103e509ee18Sopenharmony_ci    # On ohos we kind of optimize some things that don't affect debugging
104e509ee18Sopenharmony_ci    # much even when optimization is disabled to get the binary size down.
105e509ee18Sopenharmony_ci    if (is_clang) {
106e509ee18Sopenharmony_ci      cflags += [ "-Oz" ]
107e509ee18Sopenharmony_ci    } else {
108e509ee18Sopenharmony_ci      cflags += [ "-Os" ]
109e509ee18Sopenharmony_ci    }
110e509ee18Sopenharmony_ci  }
111e509ee18Sopenharmony_ci}
112e509ee18Sopenharmony_ci
113e509ee18Sopenharmony_ci# Default "optimization on" config.
114e509ee18Sopenharmony_ciconfig("optimize") {
115e509ee18Sopenharmony_ci  ldflags = common_optimize_on_ldflags
116e509ee18Sopenharmony_ci  cflags = common_optimize_on_cflags
117e509ee18Sopenharmony_ci  if (optimize_for_size) {
118e509ee18Sopenharmony_ci    # Favor size over speed.
119e509ee18Sopenharmony_ci    if (is_clang) {
120e509ee18Sopenharmony_ci      cflags += [ "-O2" ]
121e509ee18Sopenharmony_ci    } else {
122e509ee18Sopenharmony_ci      cflags += [ "-Os" ]
123e509ee18Sopenharmony_ci    }
124e509ee18Sopenharmony_ci  } else {
125e509ee18Sopenharmony_ci    cflags += [ "-O2" ]
126e509ee18Sopenharmony_ci  }
127e509ee18Sopenharmony_ci}
128e509ee18Sopenharmony_ci
129e509ee18Sopenharmony_ci# The default optimization applied to all targets. This will be equivalent to
130e509ee18Sopenharmony_ci# either "optimize" or "no_optimize", depending on the build flags.
131e509ee18Sopenharmony_ciconfig("default_optimization") {
132e509ee18Sopenharmony_ci  if (is_debug) {
133e509ee18Sopenharmony_ci    configs = [ ":no_optimize" ]
134e509ee18Sopenharmony_ci  } else {
135e509ee18Sopenharmony_ci    configs = [ ":optimize" ]
136e509ee18Sopenharmony_ci  }
137e509ee18Sopenharmony_ci}
138e509ee18Sopenharmony_ci
139e509ee18Sopenharmony_ci# default_warnings ------------------------------------------------------------
140e509ee18Sopenharmony_ci#
141e509ee18Sopenharmony_ci# Collects all warning flags that are used by default.This way these
142e509ee18Sopenharmony_ci# flags are guaranteed to appear on the compile command line after -Wall.
143e509ee18Sopenharmony_ciconfig("default_warnings") {
144e509ee18Sopenharmony_ci  cflags = []
145e509ee18Sopenharmony_ci  cflags_cc = []
146e509ee18Sopenharmony_ci  ldflags = []
147e509ee18Sopenharmony_ci
148e509ee18Sopenharmony_ci  # Suppress warnings about ABI changes on ARM (Clang doesn't give this
149e509ee18Sopenharmony_ci  # warning).
150e509ee18Sopenharmony_ci  if (current_cpu == "arm" && !is_clang) {
151e509ee18Sopenharmony_ci    cflags += [ "-Wno-psabi" ]
152e509ee18Sopenharmony_ci  }
153e509ee18Sopenharmony_ci
154e509ee18Sopenharmony_ci  if (!is_clang) {
155e509ee18Sopenharmony_ci    cflags_cc += [
156e509ee18Sopenharmony_ci      # See comment for -Wno-c++11-narrowing.
157e509ee18Sopenharmony_ci      "-Wno-narrowing",
158e509ee18Sopenharmony_ci    ]
159e509ee18Sopenharmony_ci
160e509ee18Sopenharmony_ci    # -Wunused-local-typedefs is broken in gcc,
161e509ee18Sopenharmony_ci    # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63872
162e509ee18Sopenharmony_ci    cflags += [ "-Wno-unused-local-typedefs" ]
163e509ee18Sopenharmony_ci
164e509ee18Sopenharmony_ci    # Don't warn about "maybe" uninitialized. Clang doesn't include this
165e509ee18Sopenharmony_ci    # in -Wall but gcc does, and it gives false positives.
166e509ee18Sopenharmony_ci    cflags += [ "-Wno-maybe-uninitialized" ]
167e509ee18Sopenharmony_ci    cflags += [ "-Wno-deprecated-declarations" ]
168e509ee18Sopenharmony_ci
169e509ee18Sopenharmony_ci    # -Wcomment gives too many false positives in the case a
170e509ee18Sopenharmony_ci    # backslash ended comment line is followed by a new line of
171e509ee18Sopenharmony_ci    # comments
172e509ee18Sopenharmony_ci    # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61638
173e509ee18Sopenharmony_ci    cflags += [ "-Wno-comments" ]
174e509ee18Sopenharmony_ci  }
175e509ee18Sopenharmony_ci
176e509ee18Sopenharmony_ci  # Common Clang and GCC warning setup.
177e509ee18Sopenharmony_ci  if (!is_win || is_clang) {
178e509ee18Sopenharmony_ci    cflags += [
179e509ee18Sopenharmony_ci      # Disables.
180e509ee18Sopenharmony_ci      "-Wno-missing-field-initializers",  # "struct foo f = {0};"
181e509ee18Sopenharmony_ci      "-Wno-unused-parameter",  # Unused function parameters.
182e509ee18Sopenharmony_ci    ]
183e509ee18Sopenharmony_ci  }
184e509ee18Sopenharmony_ci
185e509ee18Sopenharmony_ci  if (is_mingw) {
186e509ee18Sopenharmony_ci    cflags += [
187e509ee18Sopenharmony_ci      "-Wno-error=c99-designator",
188e509ee18Sopenharmony_ci      "-Wno-error=anon-enum-enum-conversion",
189e509ee18Sopenharmony_ci      "-Wno-error=implicit-fallthrough",
190e509ee18Sopenharmony_ci      "-Wno-error=sizeof-array-div",
191e509ee18Sopenharmony_ci      "-Wno-error=reorder-init-list",
192e509ee18Sopenharmony_ci      "-Wno-error=range-loop-construct",
193e509ee18Sopenharmony_ci      "-Wno-error=deprecated-copy",
194e509ee18Sopenharmony_ci      "-Wno-error=implicit-int-float-conversion",
195e509ee18Sopenharmony_ci      "-Wno-error=inconsistent-dllimport",
196e509ee18Sopenharmony_ci      "-Wno-error=abstract-final-class",
197e509ee18Sopenharmony_ci      "-Wno-error=sign-compare",
198e509ee18Sopenharmony_ci      "-Wno-unknown-warning-option",
199e509ee18Sopenharmony_ci    ]
200e509ee18Sopenharmony_ci  }
201e509ee18Sopenharmony_ci
202e509ee18Sopenharmony_ci  if (target_cpu == "mipsel") {
203e509ee18Sopenharmony_ci    cflags += [
204e509ee18Sopenharmony_ci      "-Wno-extra-semi",
205e509ee18Sopenharmony_ci      "-Wno-error=tautological-constant-out-of-range-compare",
206e509ee18Sopenharmony_ci      "-Wno-shift-count-overflow",
207e509ee18Sopenharmony_ci      "-Wno-constant-conversion",
208e509ee18Sopenharmony_ci    ]
209e509ee18Sopenharmony_ci  }
210e509ee18Sopenharmony_ci
211e509ee18Sopenharmony_ci  if (is_clang) {
212e509ee18Sopenharmony_ci    cflags += [
213e509ee18Sopenharmony_ci      # This warns on using ints as initializers for floats in
214e509ee18Sopenharmony_ci      # initializer lists (e.g. |int a = f(); CGSize s = { a, a };|),
215e509ee18Sopenharmony_ci      "-Wno-c++11-narrowing",
216e509ee18Sopenharmony_ci      "-Wno-unneeded-internal-declaration",
217e509ee18Sopenharmony_ci    ]
218e509ee18Sopenharmony_ci    if (current_os == "android") {
219e509ee18Sopenharmony_ci      # Disable calls to out-of-line helpers, don't implement atomic operations for these calls.
220e509ee18Sopenharmony_ci      # (Keep consistent with the default of clang15 in directory prebuilts.)
221e509ee18Sopenharmony_ci      cflags += [ "-mno-outline-atomics" ]
222e509ee18Sopenharmony_ci    }
223e509ee18Sopenharmony_ci    if (use_musl) {
224e509ee18Sopenharmony_ci      cflags += [
225e509ee18Sopenharmony_ci        "-Wno-error=c99-designator",
226e509ee18Sopenharmony_ci        "-Wno-error=anon-enum-enum-conversion",
227e509ee18Sopenharmony_ci        "-Wno-error=implicit-fallthrough",
228e509ee18Sopenharmony_ci        "-Wno-error=sizeof-array-div",
229e509ee18Sopenharmony_ci        "-Wno-error=reorder-init-list",
230e509ee18Sopenharmony_ci        "-Wno-error=range-loop-construct",
231e509ee18Sopenharmony_ci        "-Wno-error=deprecated-copy",
232e509ee18Sopenharmony_ci        "-Wno-error=implicit-int-float-conversion",
233e509ee18Sopenharmony_ci        "-Wno-error=inconsistent-dllimport",
234e509ee18Sopenharmony_ci        "-Wno-error=unknown-warning-option",
235e509ee18Sopenharmony_ci        "-Wno-error=abstract-final-class",
236e509ee18Sopenharmony_ci        "-Wno-error=sign-compare",
237e509ee18Sopenharmony_ci        "-Wno-error=int-in-bool-context",
238e509ee18Sopenharmony_ci        "-Wno-error=xor-used-as-pow",
239e509ee18Sopenharmony_ci        "-Wno-error=return-stack-address",
240e509ee18Sopenharmony_ci        "-Wno-error=dangling-gsl",
241e509ee18Sopenharmony_ci        "-Wno-unused-but-set-variable",
242e509ee18Sopenharmony_ci        "-Wno-deprecated-declarations",
243e509ee18Sopenharmony_ci        "-Wno-unused-but-set-parameter",
244e509ee18Sopenharmony_ci        "-Wno-null-pointer-subtraction",
245e509ee18Sopenharmony_ci        "-Wno-unqualified-std-cast-call",
246e509ee18Sopenharmony_ci      ]
247e509ee18Sopenharmony_ci    }
248e509ee18Sopenharmony_ci  }
249e509ee18Sopenharmony_ci}
250e509ee18Sopenharmony_ci
251e509ee18Sopenharmony_ciconfig("compiler") {
252e509ee18Sopenharmony_ci  asmflags = []
253e509ee18Sopenharmony_ci  cflags = []
254e509ee18Sopenharmony_ci  cflags_c = []
255e509ee18Sopenharmony_ci  cflags_cc = []
256e509ee18Sopenharmony_ci  cflags_objc = []
257e509ee18Sopenharmony_ci  cflags_objcc = []
258e509ee18Sopenharmony_ci  ldflags = []
259e509ee18Sopenharmony_ci  defines = []
260e509ee18Sopenharmony_ci  configs = []
261e509ee18Sopenharmony_ci  inputs = []
262e509ee18Sopenharmony_ci
263e509ee18Sopenharmony_ci  # System-specific flags. If your compiler flags apply to one of the
264e509ee18Sopenharmony_ci  # categories here, add it to the associated file to keep this shared config
265e509ee18Sopenharmony_ci  # smaller.
266e509ee18Sopenharmony_ci  if (is_android) {
267e509ee18Sopenharmony_ci    configs += [ "$build_root/config/aosp:compiler" ]
268e509ee18Sopenharmony_ci  }
269e509ee18Sopenharmony_ci  if (is_mingw) {
270e509ee18Sopenharmony_ci    configs += [ "$build_root/config/mingw:compiler" ]
271e509ee18Sopenharmony_ci    cflags += [ "-fno-stack-protector" ]
272e509ee18Sopenharmony_ci  } else if (is_ohos) {
273e509ee18Sopenharmony_ci    configs += [ "$build_root/config/ohos:compiler" ]
274e509ee18Sopenharmony_ci  } else if (is_mac) {
275e509ee18Sopenharmony_ci    configs += [ "$build_root/config/mac:compiler" ]
276e509ee18Sopenharmony_ci  }
277e509ee18Sopenharmony_ci  if (is_linux || is_ohos || is_android) {
278e509ee18Sopenharmony_ci    cflags += [ "-fPIC" ]
279e509ee18Sopenharmony_ci    ldflags += [ "-fPIC" ]
280e509ee18Sopenharmony_ci    if (!is_clang) {
281e509ee18Sopenharmony_ci      # Use pipes for communicating between sub-processes. Faster.
282e509ee18Sopenharmony_ci      # (This flag doesn't do anything with Clang.)
283e509ee18Sopenharmony_ci      cflags += [ "-pipe" ]
284e509ee18Sopenharmony_ci    }
285e509ee18Sopenharmony_ci
286e509ee18Sopenharmony_ci    ldflags += [
287e509ee18Sopenharmony_ci      "-Wl,-z,noexecstack",
288e509ee18Sopenharmony_ci      "-Wl,-z,now",
289e509ee18Sopenharmony_ci      "-Wl,-z,relro",
290e509ee18Sopenharmony_ci    ]
291e509ee18Sopenharmony_ci
292e509ee18Sopenharmony_ci    # Compiler instrumentation can introduce dependencies in DSOs to symbols in
293e509ee18Sopenharmony_ci    # the executable they are loaded into, so they are unresolved at link-time.
294e509ee18Sopenharmony_ci    if (is_ohos || (!using_sanitizer && !is_safestack)) {
295e509ee18Sopenharmony_ci      ldflags += [
296e509ee18Sopenharmony_ci        "-Wl,-z,defs",
297e509ee18Sopenharmony_ci        "-Wl,--as-needed",
298e509ee18Sopenharmony_ci      ]
299e509ee18Sopenharmony_ci    }
300e509ee18Sopenharmony_ci
301e509ee18Sopenharmony_ci    # # Change default thread stack size to 2MB for asan.
302e509ee18Sopenharmony_ci    if (is_ohos && using_sanitizer) {
303e509ee18Sopenharmony_ci      ldflags += [ "-Wl,-z,stack-size=2097152" ]
304e509ee18Sopenharmony_ci    }
305e509ee18Sopenharmony_ci  }
306e509ee18Sopenharmony_ci
307e509ee18Sopenharmony_ci  if (is_posix && use_lld) {
308e509ee18Sopenharmony_ci    # Explicitly select LLD, or else some link actions would fail and print
309e509ee18Sopenharmony_ci    # "/usr/bin/ld ... {SharedLibrayName}.so ... not found".
310e509ee18Sopenharmony_ci    ldflags += [ "-fuse-ld=lld" ]
311e509ee18Sopenharmony_ci    if (current_cpu == "arm64") {
312e509ee18Sopenharmony_ci      # Reduce the page size from 65536 in order to reduce binary size slightly
313e509ee18Sopenharmony_ci      # by shrinking the alignment gap between segments. This also causes all
314e509ee18Sopenharmony_ci      # segments to be mapped adjacently, which breakpad relies on.
315e509ee18Sopenharmony_ci      ldflags += [ "-Wl,-z,max-page-size=4096" ]
316e509ee18Sopenharmony_ci    }
317e509ee18Sopenharmony_ci  }
318e509ee18Sopenharmony_ci
319e509ee18Sopenharmony_ci  configs += [
320e509ee18Sopenharmony_ci    # See the definitions below.
321e509ee18Sopenharmony_ci    ":compiler_cpu_abi",
322e509ee18Sopenharmony_ci    ":compiler_codegen",
323e509ee18Sopenharmony_ci  ]
324e509ee18Sopenharmony_ci
325e509ee18Sopenharmony_ci  if (is_ohos && is_clang && (target_cpu == "arm" || target_cpu == "arm64")) {
326e509ee18Sopenharmony_ci    ldflags += [ "-Wl,--pack-dyn-relocs=android+relr" ]
327e509ee18Sopenharmony_ci  }
328e509ee18Sopenharmony_ci
329e509ee18Sopenharmony_ci  if (is_linux) {
330e509ee18Sopenharmony_ci    cflags += [ "-pthread" ]
331e509ee18Sopenharmony_ci    # Do not use the -pthread ldflag here since it becomes a no-op
332e509ee18Sopenharmony_ci    # when using -nodefaultlibs, which would cause an unused argument
333e509ee18Sopenharmony_ci    # error.  "-lpthread" is added in $build_root/config:default_libs.
334e509ee18Sopenharmony_ci  }
335e509ee18Sopenharmony_ci  if (is_clang) {
336e509ee18Sopenharmony_ci    cflags += [ "-fcolor-diagnostics" ]
337e509ee18Sopenharmony_ci    cflags += [ "-fmerge-all-constants" ]
338e509ee18Sopenharmony_ci  }
339e509ee18Sopenharmony_ci
340e509ee18Sopenharmony_ci  use_xcode_clang = false
341e509ee18Sopenharmony_ci  if (is_clang && !use_xcode_clang) {
342e509ee18Sopenharmony_ci    cflags += [
343e509ee18Sopenharmony_ci      "-Xclang",
344e509ee18Sopenharmony_ci      "-mllvm",
345e509ee18Sopenharmony_ci      "-Xclang",
346e509ee18Sopenharmony_ci      "-instcombine-lower-dbg-declare=0",
347e509ee18Sopenharmony_ci    ]
348e509ee18Sopenharmony_ci  }
349e509ee18Sopenharmony_ci
350e509ee18Sopenharmony_ci  if (is_clang) {
351e509ee18Sopenharmony_ci    cflags += [ "-no-canonical-prefixes" ]
352e509ee18Sopenharmony_ci  }
353e509ee18Sopenharmony_ci
354e509ee18Sopenharmony_ci  # specify language standard version.
355e509ee18Sopenharmony_ci  if (is_linux || is_ohos || is_android || current_os == "aix") {
356e509ee18Sopenharmony_ci    if (is_clang) {
357e509ee18Sopenharmony_ci      cflags_cc += [ "-std=c++17" ]
358e509ee18Sopenharmony_ci    } else {
359e509ee18Sopenharmony_ci      # In standards-conforming mode, some features like macro "##__VA_ARGS__"
360e509ee18Sopenharmony_ci      # are not supported by gcc. Add flags to support these features.
361e509ee18Sopenharmony_ci      cflags_cc += [ "-std=gnu++17" ]
362e509ee18Sopenharmony_ci    }
363e509ee18Sopenharmony_ci  } else if (!is_win && !is_mingw) {
364e509ee18Sopenharmony_ci    cflags_cc += [ "-std=c++17" ]
365e509ee18Sopenharmony_ci  }
366e509ee18Sopenharmony_ci}
367e509ee18Sopenharmony_ci
368e509ee18Sopenharmony_ci# This provides the basic options to select the target CPU and ABI.
369e509ee18Sopenharmony_ci# It is factored out of "compiler" so that special cases can use this
370e509ee18Sopenharmony_ci# without using everything that "compiler" brings in.  Options that
371e509ee18Sopenharmony_ci# tweak code generation for a particular CPU do not belong here!
372e509ee18Sopenharmony_ci# See "compiler_codegen", below.
373e509ee18Sopenharmony_ciconfig("compiler_cpu_abi") {
374e509ee18Sopenharmony_ci  cflags = []
375e509ee18Sopenharmony_ci  ldflags = []
376e509ee18Sopenharmony_ci  defines = []
377e509ee18Sopenharmony_ci
378e509ee18Sopenharmony_ci  if (is_posix && !is_mac) {
379e509ee18Sopenharmony_ci    # CPU architecture. We may or may not be doing a cross compile now, so for
380e509ee18Sopenharmony_ci    # simplicity we always explicitly set the architecture.
381e509ee18Sopenharmony_ci    if (current_cpu == "x64") {
382e509ee18Sopenharmony_ci      cflags += [
383e509ee18Sopenharmony_ci        "-m64",
384e509ee18Sopenharmony_ci        "-march=x86-64",
385e509ee18Sopenharmony_ci      ]
386e509ee18Sopenharmony_ci      ldflags += [ "-m64" ]
387e509ee18Sopenharmony_ci    } else if (current_cpu == "x86") {
388e509ee18Sopenharmony_ci      cflags += [
389e509ee18Sopenharmony_ci        "-m32",
390e509ee18Sopenharmony_ci        "-msse2",
391e509ee18Sopenharmony_ci        "-mfpmath=sse",
392e509ee18Sopenharmony_ci        "-mmmx",
393e509ee18Sopenharmony_ci      ]
394e509ee18Sopenharmony_ci      ldflags += [ "-m32" ]
395e509ee18Sopenharmony_ci    } else if (current_cpu == "arm") {
396e509ee18Sopenharmony_ci      if (is_clang && !is_ohos) {
397e509ee18Sopenharmony_ci        cflags += [ "--target=arm-linux-gnueabihf" ]
398e509ee18Sopenharmony_ci        ldflags += [ "--target=arm-linux-gnueabihf" ]
399e509ee18Sopenharmony_ci      }
400e509ee18Sopenharmony_ci      cflags += [
401e509ee18Sopenharmony_ci        "-march=$arm_arch",
402e509ee18Sopenharmony_ci        "-mfloat-abi=$arm_float_abi",
403e509ee18Sopenharmony_ci      ]
404e509ee18Sopenharmony_ci      if (arm_tune != "") {
405e509ee18Sopenharmony_ci        cflags += [ "-mtune=$arm_tune" ]
406e509ee18Sopenharmony_ci      }
407e509ee18Sopenharmony_ci    } else if (current_cpu == "arm64") {
408e509ee18Sopenharmony_ci      if (is_clang && !is_ohos && !is_android) {
409e509ee18Sopenharmony_ci        cflags += [ "--target=aarch64-linux-gnu" ]
410e509ee18Sopenharmony_ci        ldflags += [ "--target=aarch64-linux-gnu" ]
411e509ee18Sopenharmony_ci      }
412e509ee18Sopenharmony_ci      if (is_clang && (is_ohos || is_android)) {
413e509ee18Sopenharmony_ci        ldflags += [ "-Wl,--hash-style=gnu" ]
414e509ee18Sopenharmony_ci      }
415e509ee18Sopenharmony_ci      if (!is_android) {
416e509ee18Sopenharmony_ci        cflags += [
417e509ee18Sopenharmony_ci          "-march=$arm_arch",
418e509ee18Sopenharmony_ci          "-mfloat-abi=$arm_float_abi",
419e509ee18Sopenharmony_ci          "-mfpu=$arm_fpu",
420e509ee18Sopenharmony_ci        ]
421e509ee18Sopenharmony_ci      } else {
422e509ee18Sopenharmony_ci        cflags += [ "-march=$arm_arch" ]
423e509ee18Sopenharmony_ci      }
424e509ee18Sopenharmony_ci      ldflags += [ "-march=$arm_arch" ]
425e509ee18Sopenharmony_ci    }
426e509ee18Sopenharmony_ci  }
427e509ee18Sopenharmony_ci
428e509ee18Sopenharmony_ci  asmflags = cflags
429e509ee18Sopenharmony_ci  if (current_cpu == "arm64") {
430e509ee18Sopenharmony_ci    asmflags += [ "-march=armv8.2-a+dotprod+fp16" ]
431e509ee18Sopenharmony_ci  }
432e509ee18Sopenharmony_ci}
433e509ee18Sopenharmony_ci
434e509ee18Sopenharmony_ciconfig("compiler_codegen") {
435e509ee18Sopenharmony_ci  configs = []
436e509ee18Sopenharmony_ci  cflags = []
437e509ee18Sopenharmony_ci
438e509ee18Sopenharmony_ci  if (is_posix && !is_mac) {
439e509ee18Sopenharmony_ci    if (current_cpu == "x86") {
440e509ee18Sopenharmony_ci      if (is_clang) {
441e509ee18Sopenharmony_ci        cflags += [ "-momit-leaf-frame-pointer" ]
442e509ee18Sopenharmony_ci      }
443e509ee18Sopenharmony_ci    } else if (current_cpu == "arm") {
444e509ee18Sopenharmony_ci      if (is_ohos && !is_clang) {
445e509ee18Sopenharmony_ci        # Clang doesn't support these flags.
446e509ee18Sopenharmony_ci        cflags += [
447e509ee18Sopenharmony_ci          "-fno-tree-sra",
448e509ee18Sopenharmony_ci          "-fno-caller-saves",
449e509ee18Sopenharmony_ci        ]
450e509ee18Sopenharmony_ci      }
451e509ee18Sopenharmony_ci    }
452e509ee18Sopenharmony_ci  }
453e509ee18Sopenharmony_ci
454e509ee18Sopenharmony_ci  asmflags = cflags
455e509ee18Sopenharmony_ci}
456e509ee18Sopenharmony_ci
457e509ee18Sopenharmony_ciconfig("default_include_dirs") {
458e509ee18Sopenharmony_ci  include_dirs = [
459e509ee18Sopenharmony_ci    "//",
460e509ee18Sopenharmony_ci    root_gen_dir,
461e509ee18Sopenharmony_ci  ]
462e509ee18Sopenharmony_ci}
463e509ee18Sopenharmony_ci
464e509ee18Sopenharmony_ciconfig("runtime_config") {
465e509ee18Sopenharmony_ci  configs = []
466e509ee18Sopenharmony_ci  if (is_posix) {
467e509ee18Sopenharmony_ci    configs += [ "$build_root/config/posix:runtime_config" ]
468e509ee18Sopenharmony_ci  }
469e509ee18Sopenharmony_ci
470e509ee18Sopenharmony_ci  # System-specific flags. If your compiler flags apply to one of the
471e509ee18Sopenharmony_ci  # categories here, add it to the associated file to keep this shared config
472e509ee18Sopenharmony_ci  # smaller.
473e509ee18Sopenharmony_ci  if (is_ohos) {
474e509ee18Sopenharmony_ci    configs += [ "$build_root/config/ohos:runtime_config" ]
475e509ee18Sopenharmony_ci  }
476e509ee18Sopenharmony_ci
477e509ee18Sopenharmony_ci  if (is_android) {
478e509ee18Sopenharmony_ci    configs += [ "$build_root/config/aosp:runtime_config" ]
479e509ee18Sopenharmony_ci  }
480e509ee18Sopenharmony_ci
481e509ee18Sopenharmony_ci  if (is_mac) {
482e509ee18Sopenharmony_ci    configs += [ "$build_root/config/mac:runtime_config" ]
483e509ee18Sopenharmony_ci  }
484e509ee18Sopenharmony_ci}
485e509ee18Sopenharmony_ci
486e509ee18Sopenharmony_ciconfig("ark_code") {
487e509ee18Sopenharmony_ci  cflags = [ "-Wall" ]
488e509ee18Sopenharmony_ci  if (treat_warnings_as_errors) {
489e509ee18Sopenharmony_ci    cflags += [ "-Werror" ]
490e509ee18Sopenharmony_ci    ldflags = [ "-Werror" ]
491e509ee18Sopenharmony_ci  }
492e509ee18Sopenharmony_ci  if (is_clang) {
493e509ee18Sopenharmony_ci    # Enable extra warnings for ark_code when we control the compiler.
494e509ee18Sopenharmony_ci    cflags += [ "-Wextra" ]
495e509ee18Sopenharmony_ci  }
496e509ee18Sopenharmony_ci
497e509ee18Sopenharmony_ci  if (is_clang) {
498e509ee18Sopenharmony_ci    cflags += [
499e509ee18Sopenharmony_ci      "-Wimplicit-fallthrough",
500e509ee18Sopenharmony_ci      "-Wthread-safety",
501e509ee18Sopenharmony_ci    ]
502e509ee18Sopenharmony_ci  }
503e509ee18Sopenharmony_ci
504e509ee18Sopenharmony_ci  configs = [ ":default_warnings" ]
505e509ee18Sopenharmony_ci}
506