1*3f982cf4SFabien Sanglard# Copyright 2018 The Chromium Authors. All rights reserved. 2*3f982cf4SFabien Sanglard# Use of this source code is governed by a BSD-style license that can be 3*3f982cf4SFabien Sanglard# found in the LICENSE file. 4*3f982cf4SFabien Sanglard 5*3f982cf4SFabien Sanglardimport("//build/config/arm.gni") 6*3f982cf4SFabien Sanglardimport("//build/config/sysroot.gni") 7*3f982cf4SFabien Sanglardimport("//build_overrides/build.gni") 8*3f982cf4SFabien Sanglard 9*3f982cf4SFabien Sanglarddeclare_args() { 10*3f982cf4SFabien Sanglard # Enable OSP_DCHECKs to be compiled in, even if it's not a debug build. 11*3f982cf4SFabien Sanglard dcheck_always_on = false 12*3f982cf4SFabien Sanglard 13*3f982cf4SFabien Sanglard # Enable address sanitizer. 14*3f982cf4SFabien Sanglard is_asan = false 15*3f982cf4SFabien Sanglard 16*3f982cf4SFabien Sanglard # Enable thread sanitizer. 17*3f982cf4SFabien Sanglard is_tsan = false 18*3f982cf4SFabien Sanglard 19*3f982cf4SFabien Sanglard # Enables clang's source-based coverage (requires is_clang=true). 20*3f982cf4SFabien Sanglard # NOTE: This will slow down the build and increase binary size 21*3f982cf4SFabien Sanglard # significantly. For more details, see: 22*3f982cf4SFabien Sanglard # https://chromium.googlesource.com/chromium/src/+/refs/heads/master/docs/clang_code_coverage_wrapper.md 23*3f982cf4SFabien Sanglard use_coverage = false 24*3f982cf4SFabien Sanglard} 25*3f982cf4SFabien Sanglard 26*3f982cf4SFabien Sanglardassert(!use_coverage || is_clang) 27*3f982cf4SFabien Sanglard 28*3f982cf4SFabien Sanglardconfig("compiler_defaults") { 29*3f982cf4SFabien Sanglard cflags = [] 30*3f982cf4SFabien Sanglard if (is_posix && !is_mac) { 31*3f982cf4SFabien Sanglard cflags += [ "-fPIC" ] 32*3f982cf4SFabien Sanglard } 33*3f982cf4SFabien Sanglard 34*3f982cf4SFabien Sanglard ldflags = [] 35*3f982cf4SFabien Sanglard if (is_linux) { 36*3f982cf4SFabien Sanglard ldflags += [ "-pthread" ] 37*3f982cf4SFabien Sanglard } 38*3f982cf4SFabien Sanglard if (is_posix && !is_mac) { 39*3f982cf4SFabien Sanglard ldflags += [ "-Wl,--fatal-warnings" ] 40*3f982cf4SFabien Sanglard 41*3f982cf4SFabien Sanglard if (is_clang) { 42*3f982cf4SFabien Sanglard ldflags += [ 43*3f982cf4SFabien Sanglard "-stdlib=libstdc++", 44*3f982cf4SFabien Sanglard "-latomic", 45*3f982cf4SFabien Sanglard ] 46*3f982cf4SFabien Sanglard } 47*3f982cf4SFabien Sanglard } 48*3f982cf4SFabien Sanglard} 49*3f982cf4SFabien Sanglard 50*3f982cf4SFabien Sanglardconfig("compiler_cpu_abi") { 51*3f982cf4SFabien Sanglard cflags = [] 52*3f982cf4SFabien Sanglard ldflags = [] 53*3f982cf4SFabien Sanglard 54*3f982cf4SFabien Sanglard if (current_cpu == "x64") { 55*3f982cf4SFabien Sanglard # These are explicitly specified in case of cross-compiling. 56*3f982cf4SFabien Sanglard cflags += [ "-m64" ] 57*3f982cf4SFabien Sanglard ldflags += [ "-m64" ] 58*3f982cf4SFabien Sanglard } else if (current_cpu == "x86") { 59*3f982cf4SFabien Sanglard cflags += [ "-m32" ] 60*3f982cf4SFabien Sanglard ldflags += [ "-m32" ] 61*3f982cf4SFabien Sanglard } else if (current_cpu == "arm") { 62*3f982cf4SFabien Sanglard cflags += [ 63*3f982cf4SFabien Sanglard "--target=arm-linux-gnueabihf", 64*3f982cf4SFabien Sanglard "-march=$arm_arch", 65*3f982cf4SFabien Sanglard "-mfloat-abi=$arm_float_abi", 66*3f982cf4SFabien Sanglard "-mtune=$arm_tune", 67*3f982cf4SFabien Sanglard ] 68*3f982cf4SFabien Sanglard ldflags += [ "--target=arm-linux-gnueabihf" ] 69*3f982cf4SFabien Sanglard } else if (current_cpu == "arm64") { 70*3f982cf4SFabien Sanglard cflags += [ "--target=aarch64-linux-gnu" ] 71*3f982cf4SFabien Sanglard ldflags += [ "--target=aarch64-linux-gnu" ] 72*3f982cf4SFabien Sanglard } 73*3f982cf4SFabien Sanglard} 74*3f982cf4SFabien Sanglard 75*3f982cf4SFabien Sanglardconfig("no_exceptions") { 76*3f982cf4SFabien Sanglard # -fno-exceptions causes the compiler to choose the implementation of the STL 77*3f982cf4SFabien Sanglard # that uses abort() calls instead of throws, as well as issue compile errors 78*3f982cf4SFabien Sanglard # for throw calls in user ccode. The no*unwind-tables flags disable generation 79*3f982cf4SFabien Sanglard # of static unwind tables that are typically used for exceptions, resulting 80*3f982cf4SFabien Sanglard # in typically smaller object sizes. For some information, see: 81*3f982cf4SFabien Sanglard # https://gcc.gnu.org/onlinedocs/gcc/Code-Gen-Options.html#index-funwind-tables-1203 82*3f982cf4SFabien Sanglard cflags_cc = [ 83*3f982cf4SFabien Sanglard "-fno-exceptions", 84*3f982cf4SFabien Sanglard "-fno-unwind-tables", 85*3f982cf4SFabien Sanglard "-fno-asynchronous-unwind-tables", 86*3f982cf4SFabien Sanglard ] 87*3f982cf4SFabien Sanglard 88*3f982cf4SFabien Sanglard cflags_objcc = [ 89*3f982cf4SFabien Sanglard "-fno-exceptions", 90*3f982cf4SFabien Sanglard "-fno-unwind-tables", 91*3f982cf4SFabien Sanglard "-fno-asynchronous-unwind-tables", 92*3f982cf4SFabien Sanglard ] 93*3f982cf4SFabien Sanglard} 94*3f982cf4SFabien Sanglard 95*3f982cf4SFabien Sanglardconfig("no_rtti") { 96*3f982cf4SFabien Sanglard cflags_cc = [ "-fno-rtti" ] 97*3f982cf4SFabien Sanglard cflags_objcc = [ "-fno-rtti" ] 98*3f982cf4SFabien Sanglard} 99*3f982cf4SFabien Sanglard 100*3f982cf4SFabien Sanglardconfig("openscreen_code") { 101*3f982cf4SFabien Sanglard cflags = [ 102*3f982cf4SFabien Sanglard "-Wall", 103*3f982cf4SFabien Sanglard "-Werror", 104*3f982cf4SFabien Sanglard "-fno-strict-aliasing", # See http://crbug.com/32204 105*3f982cf4SFabien Sanglard ] 106*3f982cf4SFabien Sanglard 107*3f982cf4SFabien Sanglard cflags_cc = [ "-std=c++14" ] 108*3f982cf4SFabien Sanglard cflags_objcc = [ "-std=c++14" ] 109*3f982cf4SFabien Sanglard 110*3f982cf4SFabien Sanglard ldflags = [ "-Werror" ] 111*3f982cf4SFabien Sanglard 112*3f982cf4SFabien Sanglard if (is_gcc) { 113*3f982cf4SFabien Sanglard cflags += [ "-Wno-maybe-uninitialized" ] 114*3f982cf4SFabien Sanglard cflags_cc += [ 115*3f982cf4SFabien Sanglard # GCC 7.2 reports noexcept errors that are not found in GCC 8. 116*3f982cf4SFabien Sanglard # TODO(crbug.com/openscreen/40): Remove this when bots are upgraded to 117*3f982cf4SFabien Sanglard # >= GCC 8.3. 118*3f982cf4SFabien Sanglard "-Wno-noexcept-type", 119*3f982cf4SFabien Sanglard ] 120*3f982cf4SFabien Sanglard } 121*3f982cf4SFabien Sanglard 122*3f982cf4SFabien Sanglard if (is_clang) { 123*3f982cf4SFabien Sanglard cflags += [ 124*3f982cf4SFabien Sanglard "-Wextra", 125*3f982cf4SFabien Sanglard "-fcolor-diagnostics", 126*3f982cf4SFabien Sanglard 127*3f982cf4SFabien Sanglard # Warn on missing break statements at the end of switch cases. 128*3f982cf4SFabien Sanglard "-Wimplicit-fallthrough", 129*3f982cf4SFabien Sanglard 130*3f982cf4SFabien Sanglard # Unused function parameters are okay (e.g., empty virtual method 131*3f982cf4SFabien Sanglard # overrides). 132*3f982cf4SFabien Sanglard "-Wno-unused-parameter", 133*3f982cf4SFabien Sanglard 134*3f982cf4SFabien Sanglard # Permit code like "struct foo f = {0};". 135*3f982cf4SFabien Sanglard "-Wno-missing-field-initializers", 136*3f982cf4SFabien Sanglard 137*3f982cf4SFabien Sanglard # Warn on signed versus unsigned comparisons. 138*3f982cf4SFabien Sanglard "-Wsign-compare", 139*3f982cf4SFabien Sanglard 140*3f982cf4SFabien Sanglard # Warn on extra semi-colons. 141*3f982cf4SFabien Sanglard "-Wextra-semi", 142*3f982cf4SFabien Sanglard 143*3f982cf4SFabien Sanglard # Warn on unused results. 144*3f982cf4SFabien Sanglard "-Wunused-result", 145*3f982cf4SFabien Sanglard ] 146*3f982cf4SFabien Sanglard 147*3f982cf4SFabien Sanglard # Generate warning if code generates exit-time destructors, since such 148*3f982cf4SFabien Sanglard # things are in violation of Chromium C++ Don'ts. 149*3f982cf4SFabien Sanglard cflags_cc += [ "-Wexit-time-destructors" ] 150*3f982cf4SFabien Sanglard cflags_objcc += [ "-Wexit-time-destructors" ] 151*3f982cf4SFabien Sanglard 152*3f982cf4SFabien Sanglard ldflags += [ "-fcolor-diagnostics" ] 153*3f982cf4SFabien Sanglard } 154*3f982cf4SFabien Sanglard 155*3f982cf4SFabien Sanglard defines = [] 156*3f982cf4SFabien Sanglard if (dcheck_always_on) { 157*3f982cf4SFabien Sanglard defines += [ "DCHECK_ALWAYS_ON" ] 158*3f982cf4SFabien Sanglard } else if (!is_debug) { 159*3f982cf4SFabien Sanglard # C-style assertions in the standard library should match the behavior of 160*3f982cf4SFabien Sanglard # OSP_DCHECKs. Thus, turn them off whenever OSP_DCHECKs would be turned off. 161*3f982cf4SFabien Sanglard defines += [ "NDEBUG" ] 162*3f982cf4SFabien Sanglard } 163*3f982cf4SFabien Sanglard} 164*3f982cf4SFabien Sanglard 165*3f982cf4SFabien Sanglardconfig("default_optimization") { 166*3f982cf4SFabien Sanglard cflags = [] 167*3f982cf4SFabien Sanglard defines = [] 168*3f982cf4SFabien Sanglard if (is_debug) { 169*3f982cf4SFabien Sanglard cflags += [ 170*3f982cf4SFabien Sanglard "-O0", 171*3f982cf4SFabien Sanglard "-g3", # Include extra debugging information. 172*3f982cf4SFabien Sanglard "-fstack-protector-strong", 173*3f982cf4SFabien Sanglard ] 174*3f982cf4SFabien Sanglard defines += [ "_DEBUG" ] 175*3f982cf4SFabien Sanglard } else { 176*3f982cf4SFabien Sanglard cflags += [ 177*3f982cf4SFabien Sanglard "-O2", 178*3f982cf4SFabien Sanglard "-g1", # Minimal symbols (enough for stack traces). 179*3f982cf4SFabien Sanglard "-fstack-protector", 180*3f982cf4SFabien Sanglard ] 181*3f982cf4SFabien Sanglard } 182*3f982cf4SFabien Sanglard} 183*3f982cf4SFabien Sanglard 184*3f982cf4SFabien Sanglardconfig("symbol_visibility_hidden") { 185*3f982cf4SFabien Sanglard cflags = [ "-fvisibility=hidden" ] 186*3f982cf4SFabien Sanglard} 187*3f982cf4SFabien Sanglard 188*3f982cf4SFabien Sanglardconfig("symbol_visibility_default") { 189*3f982cf4SFabien Sanglard cflags = [ "-fvisibility=default" ] 190*3f982cf4SFabien Sanglard} 191*3f982cf4SFabien Sanglard 192*3f982cf4SFabien Sanglardconfig("default_sanitizers") { 193*3f982cf4SFabien Sanglard # NOTE: This is not an artificial restriction; clang doesn't allow these to be 194*3f982cf4SFabien Sanglard # used together. 195*3f982cf4SFabien Sanglard assert(!is_asan || !is_tsan) 196*3f982cf4SFabien Sanglard 197*3f982cf4SFabien Sanglard cflags = [] 198*3f982cf4SFabien Sanglard ldflags = [] 199*3f982cf4SFabien Sanglard if (is_asan) { 200*3f982cf4SFabien Sanglard cflags += [ "-fsanitize=address" ] 201*3f982cf4SFabien Sanglard ldflags += [ "-fsanitize=address" ] 202*3f982cf4SFabien Sanglard } else if (is_tsan) { 203*3f982cf4SFabien Sanglard cflags += [ "-fsanitize=thread" ] 204*3f982cf4SFabien Sanglard ldflags += [ "-fsanitize=thread" ] 205*3f982cf4SFabien Sanglard } 206*3f982cf4SFabien Sanglard 207*3f982cf4SFabien Sanglard if (use_libfuzzer) { 208*3f982cf4SFabien Sanglard cflags += [ "-fsanitize=fuzzer-no-link" ] 209*3f982cf4SFabien Sanglard if (!is_asan) { 210*3f982cf4SFabien Sanglard ldflags += [ "-fsanitize=address" ] 211*3f982cf4SFabien Sanglard } 212*3f982cf4SFabien Sanglard } 213*3f982cf4SFabien Sanglard} 214*3f982cf4SFabien Sanglard 215*3f982cf4SFabien Sanglardconfig("default_coverage") { 216*3f982cf4SFabien Sanglard cflags = [] 217*3f982cf4SFabien Sanglard ldflags = [] 218*3f982cf4SFabien Sanglard 219*3f982cf4SFabien Sanglard # TODO(issuetracker.google.com/155348032): Limit the use of these flags 220*3f982cf4SFabien Sanglard if (use_coverage) { 221*3f982cf4SFabien Sanglard cflags += [ 222*3f982cf4SFabien Sanglard "-fprofile-instr-generate", 223*3f982cf4SFabien Sanglard "-fcoverage-mapping", 224*3f982cf4SFabien Sanglard ] 225*3f982cf4SFabien Sanglard ldflags += [ "-fprofile-instr-generate" ] 226*3f982cf4SFabien Sanglard } 227*3f982cf4SFabien Sanglard} 228*3f982cf4SFabien Sanglard 229*3f982cf4SFabien Sanglardconfig("sysroot_runtime_libraries") { 230*3f982cf4SFabien Sanglard if (sysroot != "") { 231*3f982cf4SFabien Sanglard assert(is_clang) 232*3f982cf4SFabien Sanglard sysroot_path = rebase_path(sysroot, root_build_dir) 233*3f982cf4SFabien Sanglard flags = [ "--sysroot=" + sysroot_path ] 234*3f982cf4SFabien Sanglard hash = exec_script("//build/scripts/install-sysroot.py", 235*3f982cf4SFabien Sanglard [ 236*3f982cf4SFabien Sanglard "--print-hash", 237*3f982cf4SFabien Sanglard "$current_cpu", 238*3f982cf4SFabien Sanglard "$sysroot_platform", 239*3f982cf4SFabien Sanglard ], 240*3f982cf4SFabien Sanglard "trim string", 241*3f982cf4SFabien Sanglard [ "//build/scripts/sysroots.json" ]) 242*3f982cf4SFabien Sanglard 243*3f982cf4SFabien Sanglard # GN uses this to know that the sysroot is "dirty" 244*3f982cf4SFabien Sanglard defines = [ "SYSROOT_HASH=$hash" ] 245*3f982cf4SFabien Sanglard ldflags = flags 246*3f982cf4SFabien Sanglard cflags = flags 247*3f982cf4SFabien Sanglard 248*3f982cf4SFabien Sanglard ld_paths = exec_script("//build/scripts/sysroot_ld_path.py", 249*3f982cf4SFabien Sanglard [ sysroot_path ], 250*3f982cf4SFabien Sanglard "list lines") 251*3f982cf4SFabien Sanglard foreach(ld_path, ld_paths) { 252*3f982cf4SFabien Sanglard ld_path = rebase_path(ld_path, root_build_dir) 253*3f982cf4SFabien Sanglard ldflags += [ "-L" + ld_path ] 254*3f982cf4SFabien Sanglard } 255*3f982cf4SFabien Sanglard } 256*3f982cf4SFabien Sanglard} 257*3f982cf4SFabien Sanglard 258*3f982cf4SFabien Sanglardconfig("operating_system_defines") { 259*3f982cf4SFabien Sanglard defines = [] 260*3f982cf4SFabien Sanglard if (is_linux) { 261*3f982cf4SFabien Sanglard defines += [ "OS_LINUX" ] 262*3f982cf4SFabien Sanglard } else if (is_mac) { 263*3f982cf4SFabien Sanglard defines += [ "MAC_OSX" ] 264*3f982cf4SFabien Sanglard } 265*3f982cf4SFabien Sanglard} 266