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