1# Copyright (c) 2013 The Chromium Authors. All rights reserved. 2# Use of this source code is governed by a BSD-style license that can be 3# found in the LICENSE file. 4 5import("//build/config/android/config.gni") 6if (cpu_arch == "arm") { 7 import("//build/config/arm.gni") 8} 9if (is_posix) { 10 import("//build/config/gcc/gcc_version.gni") 11} 12 13declare_args() { 14 # Normally, Android builds are lightly optimized, even for debug builds, to 15 # keep binary size down. Setting this flag to true disables such optimization 16 android_full_debug = false 17 18 # Whether to use the binary binutils checked into third_party/binutils. 19 # These are not multi-arch so cannot be used except on x86 and x86-64 (the 20 # only two architectures that are currently checked in). Turn this off when 21 # you are using a custom toolchain and need to control -B in cflags. 22 linux_use_bundled_binutils = is_linux && cpu_arch == "x64" 23} 24 25use_gold = is_linux && cpu_arch == "x64" 26 27if (!is_win) { 28 # linux_use_debug_fission: whether to use split DWARF debug info 29 # files. This can reduce link time significantly, but is incompatible 30 # with some utilities such as icecc and ccache. Requires gold and 31 # gcc >= 4.8 or clang. 32 # http://gcc.gnu.org/wiki/DebugFission 33 use_debug_fission = use_gold && linux_use_bundled_binutils 34} 35 36# default_include_dirs --------------------------------------------------------- 37# 38# This is a separate config so that third_party code (which would not use the 39# source root and might have conflicting versions of some headers) can remove 40# this and specify their own include paths. 41config("default_include_dirs") { 42 include_dirs = [ 43 "//", 44 root_gen_dir, 45 ] 46} 47 48# compiler --------------------------------------------------------------------- 49# 50# Base compiler configuration. 51# 52# See also "runtime_library" below for related stuff and a discusison about 53# where stuff should go. Put warning related stuff in the "warnings" config. 54 55config("compiler") { 56 cflags = [] 57 cflags_c = [] 58 cflags_cc = [] 59 ldflags = [] 60 defines = [] 61 62 # In general, Windows is totally different, but all the other builds share 63 # some common GCC configuration. This section sets up Windows and the common 64 # GCC flags, and then we handle the other non-Windows platforms specifically 65 # below. 66 if (is_win) { 67 # Windows compiler flags setup. 68 # ----------------------------- 69 cflags += [ 70 "/Gy", # Enable function-level linking. 71 "/GS", # Enable buffer security checking. 72 "/FS", # Preserve previous PDB behavior. 73 ] 74 if (is_component_build) { 75 cflags += [ 76 "/EHsc", # Assume C functions can't throw exceptions and don't catch 77 # structured exceptions (only C++ ones). 78 ] 79 } 80 } else { 81 # Common GCC compiler flags setup. 82 # -------------------------------- 83 cflags += [ 84 "-fno-strict-aliasing", # See http://crbug.com/32204 85 ] 86 cflags_cc += [ 87 "-fno-threadsafe-statics", 88 # Not exporting C++ inline functions can generally be applied anywhere 89 # so we do so here. Normal function visibility is controlled by 90 # //build/config/gcc:symbol_visibility_hidden. 91 "-fvisibility-inlines-hidden", 92 ] 93 94 # Stack protection. 95 if (is_mac) { 96 cflags += [ "-fstack-protector-all" ] 97 } else if (is_linux) { 98 cflags += [ "-fstack-protector", "--param=ssp-buffer-size=4" ] 99 } 100 101 # Linker warnings. 102 if (!(is_chromeos && cpu_arch == "arm") && !is_mac) { 103 # TODO(jochen): Enable this on chromeos on arm. http://crbug.com/356580 104 ldflags += [ "-Wl,--fatal-warnings" ] 105 } 106 } 107 108 if (is_clang && is_debug) { 109 # Allow comparing the address of references and 'this' against 0 110 # in debug builds. Technically, these can never be null in 111 # well-defined C/C++ and Clang can optimize such checks away in 112 # release builds, but they may be used in asserts in debug builds. 113 cflags_cc += [ 114 "-Wno-undefined-bool-conversion", 115 "-Wno-tautological-undefined-compare", 116 ] 117 } 118 119 if (is_clang && !is_win) { 120 # This is here so that all files get recompiled after a clang roll and 121 # when turning clang on or off. (defines are passed via the command line, 122 # and build system rebuild things when their commandline changes). Nothing 123 # should ever read this define. 124 defines += [ 125 "CR_CLANG_REVISION=" + 126 exec_script( 127 "//tools/clang/scripts/posix-print-revision.py", [], "value") 128 ] 129 } 130 131 # Mac-specific compiler flags setup. 132 # ---------------------------------- 133 if (is_mac || is_ios) { 134 # These flags are shared between the C compiler and linker. 135 common_mac_flags = [] 136 137 # CPU architecture. 138 if (cpu_arch == "x64") { 139 common_mac_flags += [ "-arch", "x86_64" ] 140 } else if (cpu_arch == "x86") { 141 common_mac_flags += [ "-arch", "i386" ] 142 } 143 144 cflags += common_mac_flags 145 146 # Without this, the constructors and destructors of a C++ object inside 147 # an Objective C struct won't be called, which is very bad. 148 cflags_objcc = [ "-fobjc-call-cxx-cdtors", ] 149 150 cflags_c += [ "-std=c99" ] 151 cflags_cc += [ "-std=gnu++11" ] 152 153 ldflags += common_mac_flags 154 } else if (is_posix) { 155 # Non-Mac Posix compiler flags setup. 156 # ----------------------------------- 157 if (gcc_version >= 48) { 158 cflags_cc += [ 159 "-std=gnu++11", 160 ] 161 } 162 163 # CPU architecture. We may or may not be doing a cross compile now, so for 164 # simplicity we always explicitly set the architecture. 165 if (cpu_arch == "x64") { 166 cflags += [ "-m64", "-march=x86-64", ] 167 ldflags += [ "-m64" ] 168 } else if (cpu_arch == "x86") { 169 cflags += [ "-m32" ] 170 ldflags += [ "-m32" ] 171 } else if (cpu_arch == "arm") { 172 # Don't set the compiler flags for the WebView build. These will come 173 # from the Android build system. 174 if (!is_android_webview_build) { 175 cflags += [ 176 "-march=$arm_arch", 177 "-mfloat-abi=$arm_float_abi", 178 ] 179 if (arm_tune != "") { 180 cflags += [ "-mtune=$arm_tune" ] 181 } 182 if (arm_use_thumb) { 183 cflags += [ "-mthumb" ] 184 if (is_android && !is_clang) { # Clang doesn't support this option. 185 cflags += [ "-mthumb-interwork" ] 186 } 187 } 188 if (!is_clang) { 189 # Clang doesn't support these flags. 190 cflags += [ 191 # The tree-sra optimization (scalar replacement for 192 # aggregates enabling subsequent optimizations) leads to 193 # invalid code generation when using the Android NDK's 194 # compiler (r5-r7). This can be verified using 195 # webkit_unit_tests' WTF.Checked_int8_t test. 196 "-fno-tree-sra", 197 # The following option is disabled to improve binary 198 # size and performance in gcc 4.9. 199 "-fno-caller-saves", 200 ] 201 } 202 } 203 } 204 205 defines += [ "_FILE_OFFSET_BITS=64" ] 206 207 # Omit unwind support in official builds to save space. We can use breakpad 208 # for these builds. 209 if (is_chrome_branded && is_official_build) { 210 cflags += [ 211 "-fno-unwind-tables", 212 "-fno-asynchronous-unwind-tables", 213 ] 214 } else { 215 cflags += [ "-funwind-tables" ] 216 } 217 } 218 219 # Linux/Android common flags setup. 220 # --------------------------------- 221 if (is_linux || is_android) { 222 cflags += [ 223 "-fPIC", 224 "-pipe", # Use pipes for communicating between sub-processes. Faster. 225 ] 226 227 ldflags += [ 228 "-fPIC", 229 "-Wl,-z,noexecstack", 230 "-Wl,-z,now", 231 "-Wl,-z,relro", 232 ] 233 } 234 235 # Linux-specific compiler flags setup. 236 # ------------------------------------ 237 if (is_linux) { 238 cflags += [ "-pthread" ] 239 ldflags += [ 240 "-pthread", 241 ] 242 } 243 if (use_gold) { 244 # Use gold for linking on 64-bit Linux only (on 32-bit it runs out of 245 # address space, and it doesn't support cross-compiling). 246 gold_path = rebase_path("//third_party/binutils/Linux_x64/Release/bin", 247 root_build_dir) 248 ldflags += [ 249 "-B$gold_path", 250 251 # Newer gccs and clangs support -fuse-ld, use the flag to force gold 252 # selection. 253 # gcc -- http://gcc.gnu.org/onlinedocs/gcc-4.8.0/gcc/Optimize-Options.html 254 "-fuse-ld=gold", 255 256 # There seems to be a conflict of --icf and -pie in gold which can 257 # generate crashy binaries. As a security measure, -pie takes 258 # precedence for now. 259 # TODO(brettw) common.gypi has this only for target toolset. 260 #"-Wl,--icf=safe", 261 "-Wl,--icf=none", 262 263 # Experimentation found that using four linking threads 264 # saved ~20% of link time. 265 # https://groups.google.com/a/chromium.org/group/chromium-dev/browse_thread/thread/281527606915bb36 266 # Only apply this to the target linker, since the host 267 # linker might not be gold, but isn't used much anyway. 268 # TODO(raymes): Disable threading because gold is frequently 269 # crashing on the bots: crbug.com/161942. 270 #"-Wl,--threads", 271 #"-Wl,--thread-count=4", 272 ] 273 } 274 275 if (linux_use_bundled_binutils) { 276 binutils_path = rebase_path("//third_party/binutils/Linux_x64/Release/bin", 277 root_build_dir) 278 cflags += [ "-B$binutils_path" ] 279 } 280 281 # Clang-specific compiler flags setup. 282 # ------------------------------------ 283 if (is_clang) { 284 cflags += [ 285 "-fcolor-diagnostics", 286 ] 287 cflags_cc += [ 288 "-std=gnu++11", 289 ] 290 } 291 292 # Android-specific flags setup. 293 # ----------------------------- 294 if (is_android) { 295 cflags += [ 296 "-ffunction-sections", 297 "-funwind-tables", 298 "-fno-short-enums", 299 ] 300 if (!is_clang) { 301 # Clang doesn't support these flags. 302 cflags += [ 303 "-finline-limit=64", 304 ] 305 } 306 if (is_android_webview_build) { 307 # Android predefines this as 1; undefine it here so Chromium can redefine 308 # it later to be 2 for chromium code and unset for third party code. This 309 # works because cflags are added before defines. 310 # TODO(brettw) the above comment seems incorrect. We specify defines 311 # before cflags on our compiler command lines. 312 cflags += [ "-U_FORTIFY_SOURCE" ] 313 } 314 315 if (is_asan) { 316 # Android build relies on -Wl,--gc-sections removing unreachable code. 317 # ASan instrumentation for globals inhibits this and results in a library 318 # with unresolvable relocations. 319 # TODO(eugenis): find a way to reenable this. 320 cflags += [ "-mllvm -asan-globals=0" ] 321 } 322 323 defines += [ "ANDROID" ] 324 if (!is_android_webview_build) { 325 # The NDK has these things, but doesn't define the constants 326 # to say that it does. Define them here instead. 327 defines += [ "HAVE_SYS_UIO_H" ] 328 } 329 330 # Use gold for Android for most CPU architectures. 331 if (cpu_arch == "x86" || cpu_arch == "x64" || cpu_arch == "arm") { 332 ldflags += [ "-fuse-ld=gold" ] 333 if (is_clang) { 334 # Let clang find the ld.gold in the NDK. 335 ldflags += [ "--gcc-toolchain=" + rebase_path(android_toolchain_root, 336 root_build_dir) ] 337 } 338 } 339 340 ldflags += [ 341 "-Wl,--no-undefined", 342 # Don't export symbols from statically linked libraries. 343 "-Wl,--exclude-libs=ALL", 344 ] 345 if (cpu_arch == "arm") { 346 ldflags += [ 347 # Enable identical code folding to reduce size. 348 "-Wl,--icf=safe", 349 ] 350 } 351 352 if (is_clang) { 353 if (cpu_arch == "arm") { 354 cflags += [ 355 "-target arm-linux-androideabi", 356 ] 357 ldflags += [ "-target arm-linux-androideabi" ] 358 } else if (cpu_arch == "x86") { 359 cflags += [ "-target x86-linux-androideabi" ] 360 ldflags += [ "-target x86-linux-androideabi" ] 361 } 362 } 363 } 364} 365 366config("compiler_arm_fpu") { 367 if (cpu_arch == "arm" && !is_android_webview_build) { 368 cflags = [ 369 "-mfpu=$arm_fpu", 370 ] 371 } 372} 373 374# runtime_library ------------------------------------------------------------- 375# 376# Sets the runtime library and associated options. 377# 378# How do you determine what should go in here vs. "compiler" above? Consider if 379# a target might choose to use a different runtime library (ignore for a moment 380# if this is possible or reasonable on your system). If such a target would want 381# to change or remove your option, put it in the runtime_library config. If a 382# target wants the option regardless, put it in the compiler config. 383 384config("runtime_library") { 385 cflags = [] 386 defines = [] 387 ldflags = [] 388 lib_dirs = [] 389 libs = [] 390 391 if (is_component_build) { 392 # Component mode: dynamic CRT. 393 defines += [ "COMPONENT_BUILD" ] 394 if (is_win) { 395 # Since the library is shared, it requires exceptions or will give errors 396 # about things not matching, so keep exceptions on. 397 if (is_debug) { 398 cflags += [ "/MDd" ] 399 } else { 400 cflags += [ "/MD" ] 401 } 402 } 403 } else { 404 # Static CRT. 405 if (is_win) { 406 # We don't use exceptions, and when we link statically we can just get 407 # rid of them entirely. 408 defines += [ "_HAS_EXCEPTIONS=0" ] 409 if (is_debug) { 410 cflags += [ "/MTd" ] 411 } else { 412 cflags += [ "/MT" ] 413 } 414 } 415 } 416 417 if (is_win) { 418 defines += [ 419 "__STD_C", 420 "__STDC_CONSTANT_MACROS", 421 "__STDC_FORMAT_MACROS", 422 "_CRT_RAND_S", 423 "_CRT_SECURE_NO_DEPRECATE", 424 "_SCL_SECURE_NO_DEPRECATE", 425 ] 426 } 427 428 # Stlport setup. Android uses a different (smaller) version of the STL. 429 if (is_android) { 430 if (is_clang) { 431 # Work around incompatibilities between bionic and clang headers. 432 defines += [ 433 "__compiler_offsetof=__builtin_offsetof", 434 "nan=__builtin_nan", 435 ] 436 } 437 438 defines += [ 439 "USE_STLPORT=1", 440 "_STLP_USE_PTR_SPECIALIZATIONS=1", 441 "__GNU_SOURCE=1", # Necessary for clone(). 442 ] 443 444 ldflags += [ 445 "-Wl,--warn-shared-textrel", 446 "-nostdlib", 447 ] 448 449 # NOTE: The stlport header include paths below are specified in cflags 450 # rather than include_dirs because they need to come after include_dirs. 451 # Think of them like system headers, but don't use '-isystem' because the 452 # arm-linux-androideabi-4.4.3 toolchain (circa Gingerbread) will exhibit 453 # strange errors. The include ordering here is important; change with 454 # caution. 455 if (use_system_stlport) { 456 cflags += [ 457 # For libstdc++/include, which is used by stlport. 458 "-I" + rebase_path("$android_src/bionic", root_build_dir), 459 "-I" + rebase_path("$android_src/external/stlport/stlport", 460 root_build_dir), 461 ] 462 libs += [ 463 "stlport", 464 ] 465 } else { 466 android_stlport_root = "$android_ndk_root/sources/cxx-stl/stlport" 467 468 cflags += [ 469 "-isystem" + rebase_path("$android_stlport_root/stlport", 470 root_build_dir) 471 ] 472 lib_dirs += [ "$android_stlport_root/libs/$android_app_abi" ] 473 474 if (component_mode == "shared_library") { 475 libs += [ "stlport_shared" ] 476 } else { 477 libs += [ "stlport_static" ] 478 } 479 } 480 481 if (cpu_arch == "mipsel") { 482 libs += [ 483 # ld linker is used for mips Android, and ld does not accept library 484 # absolute path prefixed by "-l"; Since libgcc does not exist in mips 485 # sysroot the proper library will be linked. 486 # TODO(gordanac): Remove once gold linker is used for mips Android. 487 "gcc", 488 ] 489 } else { 490 libs += [ 491 # Manually link the libgcc.a that the cross compiler uses. This is 492 # absolute because the linker will look inside the sysroot if it's not. 493 rebase_path(android_libgcc_file), 494 ] 495 } 496 497 libs += [ 498 "c", 499 "dl", 500 "m", 501 ] 502 503 } 504} 505 506# chromium_code --------------------------------------------------------------- 507# 508# Toggles between higher and lower warnings for code that is (or isn't) 509# part of Chromium. 510 511config("chromium_code") { 512 if (is_win) { 513 cflags = [ 514 "/W4", # Warning level 4. 515 ] 516 } else { 517 cflags = [ 518 "-Wall", 519 "-Wextra", 520 521 # GCC turns on -Wsign-compare for C++ under -Wall, but clang doesn't, 522 # so we specify it explicitly. 523 # TODO(fischman): remove this if http://llvm.org/PR10448 obsoletes it. 524 # http://code.google.com/p/chromium/issues/detail?id=90453 525 "-Wsign-compare", 526 ] 527 528 # In Chromium code, we define __STDC_foo_MACROS in order to get the 529 # C99 macros on Mac and Linux. 530 defines = [ 531 "__STDC_CONSTANT_MACROS", 532 "__STDC_FORMAT_MACROS", 533 ] 534 } 535} 536config("no_chromium_code") { 537 cflags = [] 538 cflags_cc = [] 539 defines = [] 540 541 if (is_win) { 542 cflags += [ 543 "/W3", # Warning level 3. 544 "/wd4800", # Disable warning when forcing value to bool. 545 ] 546 defines += [ 547 "_CRT_NONSTDC_NO_WARNINGS", 548 "_CRT_NONSTDC_NO_DEPRECATE", 549 ] 550 } 551 552 if (is_linux) { 553 # Don't warn about ignoring the return value from e.g. close(). This is 554 # off by default in some gccs but on by default in others. BSD systems do 555 # not support this option, since they are usually using gcc 4.2.1, which 556 # does not have this flag yet. 557 cflags += [ "-Wno-unused-result" ] 558 } 559 560 if (is_linux || is_android) { 561 cflags += [ 562 # Don't warn about printf format problems. This is off by default in gcc 563 # but on in Ubuntu's gcc(!). 564 "-Wno-format", 565 ] 566 cflags_cc += [ 567 # Don't warn about hash_map in third-party code. 568 "-Wno-deprecated", 569 ] 570 } 571 572 if (is_android_webview_build) { 573 # There is a class of warning which: 574 # 1) Android always enables and also treats as errors 575 # 2) Chromium ignores in third party code 576 # So we re-enable those warnings when building Android. 577 cflags += [ 578 "-Wno-address", 579 "-Wno-format-security", 580 "-Wno-return-type", 581 "-Wno-sequence-point", 582 ] 583 cflags_cc += [ "-Wno-non-virtual-dtor" ] 584 } 585} 586 587# rtti ------------------------------------------------------------------------ 588# 589# Allows turning Run-Time Type Identification on or off. 590 591config("rtti") { 592 if (is_win) { 593 cflags_cc = [ "/GR" ] 594 } 595} 596config("no_rtti") { 597 if (is_win) { 598 cflags_cc = [ "/GR-" ] 599 } else { 600 cflags_cc = [ "-fno-rtti" ] 601 } 602} 603 604# Warnings --------------------------------------------------------------------- 605# 606# This is where we disable various warnings that we've decided aren't 607# worthwhile, and enable special warnings. 608 609config("default_warnings") { 610 if (is_win) { 611 cflags = [ 612 "/WX", # Treat warnings as errors. 613 614 # Warnings permanently disabled: 615 616 # TODO(GYP) The GYP build doesn't have this globally enabled but disabled 617 # for a bunch of individual targets. Re-enable this globally when those 618 # targets are fixed. 619 "/wd4018", # Comparing signed and unsigned values. 620 621 # C4127: conditional expression is constant 622 # This warning can in theory catch dead code and other problems, but 623 # triggers in far too many desirable cases where the conditional 624 # expression is either set by macros or corresponds some legitimate 625 # compile-time constant expression (due to constant template args, 626 # conditionals comparing the sizes of different types, etc.). Some of 627 # these can be worked around, but it's not worth it. 628 "/wd4127", 629 630 # C4251: 'identifier' : class 'type' needs to have dll-interface to be 631 # used by clients of class 'type2' 632 # This is necessary for the shared library build. 633 "/wd4251", 634 635 # C4351: new behavior: elements of array 'array' will be default 636 # initialized 637 # This is a silly "warning" that basically just alerts you that the 638 # compiler is going to actually follow the language spec like it's 639 # supposed to, instead of not following it like old buggy versions did. 640 # There's absolutely no reason to turn this on. 641 "/wd4351", 642 643 # C4355: 'this': used in base member initializer list 644 # It's commonly useful to pass |this| to objects in a class' initializer 645 # list. While this warning can catch real bugs, most of the time the 646 # constructors in question don't attempt to call methods on the passed-in 647 # pointer (until later), and annotating every legit usage of this is 648 # simply more hassle than the warning is worth. 649 "/wd4355", 650 651 # C4503: 'identifier': decorated name length exceeded, name was 652 # truncated 653 # This only means that some long error messages might have truncated 654 # identifiers in the presence of lots of templates. It has no effect on 655 # program correctness and there's no real reason to waste time trying to 656 # prevent it. 657 "/wd4503", 658 659 # C4611: interaction between 'function' and C++ object destruction is 660 # non-portable 661 # This warning is unavoidable when using e.g. setjmp/longjmp. MSDN 662 # suggests using exceptions instead of setjmp/longjmp for C++, but 663 # Chromium code compiles without exception support. We therefore have to 664 # use setjmp/longjmp for e.g. JPEG decode error handling, which means we 665 # have to turn off this warning (and be careful about how object 666 # destruction happens in such cases). 667 "/wd4611", 668 669 670 # Warnings to evaluate and possibly fix/reenable later: 671 672 "/wd4100", # Unreferenced formal function parameter. 673 "/wd4189", # A variable was declared and initialized but never used. 674 "/wd4244", # Conversion: possible loss of data. 675 "/wd4481", # Nonstandard extension: override specifier. 676 "/wd4505", # Unreferenced local function has been removed. 677 "/wd4510", # Default constructor could not be generated. 678 "/wd4512", # Assignment operator could not be generated. 679 "/wd4610", # Class can never be instantiated, constructor required. 680 ] 681 } else { 682 # Common GCC warning setup. 683 cflags = [ 684 # Enables. 685 "-Wendif-labels", # Weird old-style text after an #endif. 686 "-Werror", # Warnings as errors. 687 688 # Disables. 689 "-Wno-missing-field-initializers", # "struct foo f = {0};" 690 "-Wno-unused-parameter", # Unused function parameters. 691 ] 692 cflags_cc = [] 693 694 if (is_mac) { 695 cflags += [ 696 "-Wnewline-eof", 697 ] 698 } 699 700 if (is_clang) { 701 cflags += [ 702 # This warns on using ints as initializers for floats in 703 # initializer lists (e.g. |int a = f(); CGSize s = { a, a };|), 704 # which happens in several places in chrome code. Not sure if 705 # this is worth fixing. 706 "-Wno-c++11-narrowing", 707 708 # Don't die on dtoa code that uses a char as an array index. 709 # This is required solely for base/third_party/dmg_fp/dtoa.cc. 710 # TODO(brettw) move this to that project then! 711 "-Wno-char-subscripts", 712 713 # Warns on switches on enums that cover all enum values but 714 # also contain a default: branch. Chrome is full of that. 715 "-Wno-covered-switch-default", 716 717 # Clang considers the `register` keyword as deprecated, but e.g. 718 # code generated by flex (used in angle) contains that keyword. 719 # http://crbug.com/255186 720 "-Wno-deprecated-register", 721 722 # TODO(thakis): This used to be implied by -Wno-unused-function, 723 # which we no longer use. Check if it makes sense to remove 724 # this as well. http://crbug.com/316352 725 "-Wno-unneeded-internal-declaration", 726 727 # TODO(thakis): Remove, http://crbug.com/263960 728 "-Wno-reserved-user-defined-literal", 729 730 # TODO(hans): Clean this up. Or disable with finer granularity. 731 "-Wno-unused-local-typedef", 732 ] 733 } 734 if (gcc_version >= 48) { 735 cflags_cc += [ 736 # See comment for -Wno-c++11-narrowing. 737 "-Wno-narrowing", 738 # TODO(thakis): Remove, http://crbug.com/263960 739 "-Wno-literal-suffix", 740 ] 741 } 742 743 # Suppress warnings about ABI changes on ARM (Clang doesn't give this 744 # warning). 745 if (cpu_arch == "arm" && !is_clang) { 746 cflags += [ "-Wno-psabi" ] 747 } 748 749 if (is_android) { 750 # Disable any additional warnings enabled by the Android build system but 751 # which chromium does not build cleanly with (when treating warning as 752 # errors). 753 cflags += [ 754 "-Wno-extra", 755 "-Wno-ignored-qualifiers", 756 "-Wno-type-limits", 757 ] 758 cflags_cc += [ 759 # Disabling c++0x-compat should be handled in WebKit, but 760 # this currently doesn't work because gcc_version is not set 761 # correctly when building with the Android build system. 762 # TODO(torne): Fix this in WebKit. 763 "-Wno-error=c++0x-compat", 764 # Other things unrelated to -Wextra: 765 "-Wno-non-virtual-dtor", 766 "-Wno-sign-promo", 767 ] 768 } 769 770 if (gcc_version >= 48) { 771 # Don't warn about the "typedef 'foo' locally defined but not used" 772 # for gcc 4.8. 773 # TODO: remove this flag once all builds work. See crbug.com/227506 774 cflags += [ 775 "-Wno-unused-local-typedefs", 776 ] 777 } 778 } 779} 780 781# This will generate warnings when using Clang if code generates exit-time 782# destructors, which will slow down closing the program. 783# TODO(thakis): Make this a blacklist instead, http://crbug.com/101600 784config("wexit_time_destructors") { 785 if (is_clang) { 786 cflags = [ "-Wexit-time-destructors" ] 787 } 788} 789 790# Optimization ----------------------------------------------------------------- 791# 792# Note that BUILDCONFIG.gn sets up a variable "default_optimization_config" 793# which it will assign to the config it implicitly applies to every target. If 794# you want to override the optimization level for your target, remove this 795# config (which will expand differently for debug or release builds), and then 796# add back the one you want to override it with: 797# 798# configs -= default_optimization_config 799# configs += [ "//build/config/compiler/optimize_max" ] 800 801# Shared settings for both "optimize" and "optimize_max" configs. 802if (is_win) { 803 common_optimize_on_cflags = [ 804 "/O2", 805 "/Ob2", # both explicit and auto inlining. 806 "/Oy-", # disable omitting frame pointers, must be after /o2. 807 "/Os", # favor size over speed. 808 ] 809 common_optimize_on_ldflags = [] 810} else { 811 common_optimize_on_cflags = [ 812 # Don't emit the GCC version ident directives, they just end up in the 813 # .comment section taking up binary size. 814 "-fno-ident", 815 # Put data and code in their own sections, so that unused symbols 816 # can be removed at link time with --gc-sections. 817 "-fdata-sections", 818 "-ffunction-sections", 819 ] 820 common_optimize_on_ldflags = [] 821 822 if (is_android) { 823 common_optimize_on_cflags += [ 824 "-fomit-frame-pointer", 825 ] 826 common_optimize_on_ldflags += [ 827 # Warn in case of text relocations. 828 "-Wl,--warn-shared-textrel", 829 ] 830 } 831 832 if (is_mac) { 833 if (symbol_level == 2) { 834 # Mac dead code stripping requires symbols. 835 common_optimize_on_ldflags += [ 836 "-Wl,-dead_strip", 837 ] 838 } 839 } else { 840 # Non-Mac Posix linker flags. 841 common_optimize_on_ldflags += [ 842 # Specifically tell the linker to perform optimizations. 843 # See http://lwn.net/Articles/192624/ . 844 "-Wl,-O1", 845 "-Wl,--as-needed", 846 "-Wl,--gc-sections", 847 ] 848 } 849} 850 851# Default "optimization on" config. On Windows, this favors size over speed. 852config("optimize") { 853 cflags = common_optimize_on_cflags 854 ldflags = common_optimize_on_ldflags 855 if (is_win) { 856 cflags += [ 857 "/Os", # favor size over speed. 858 ] 859 } else if (is_android || is_ios) { 860 cflags += [ 861 "-Os", # Favor size over speed. 862 ] 863 } else { 864 cflags += [ 865 "-O2", 866 ] 867 } 868} 869 870# Turn off optimizations. 871config("no_optimize") { 872 if (is_win) { 873 cflags = [ 874 "/Od", # Disable optimization. 875 "/Ob0", # Disable all inlining (on by default). 876 "/RTC1", # Runtime checks for stack frame and uninitialized variables. 877 ] 878 } else if (is_android && !android_full_debug) { 879 # On Android we kind of optimize some things that don't affect debugging 880 # much even when optimization is disabled to get the binary size down. 881 cflags = [ 882 "-Os", 883 "-fomit-frame-pointer", 884 "-fdata-sections", 885 "-ffunction-sections", 886 ] 887 ldflags = common_optimize_on_ldflags 888 } else { 889 cflags = [ "-O0" ] 890 } 891} 892 893# Turns up the optimization level. On Windows, this implies whole program 894# optimization and link-time code generation which is very expensive and should 895# be used sparingly. 896config("optimize_max") { 897 cflags = common_optimize_on_cflags 898 ldflags = common_optimize_on_ldflags 899 if (is_win) { 900 cflags += [ 901 "/Ot", # Favor speed over size. 902 "/GL", # Whole program optimization. 903 # Disable Warning 4702 ("Unreachable code") for the WPO/PGO builds. 904 # Probably anything that this would catch that wouldn't be caught in a 905 # normal build isn't going to actually be a bug, so the incremental value 906 # of C4702 for PGO builds is likely very small. 907 "/wd4702", 908 ] 909 } else { 910 cflags += [ 911 "-O2", 912 ] 913 } 914} 915 916# Symbols ---------------------------------------------------------------------- 917 918config("symbols") { 919 if (is_win) { 920 cflags = [ "/Zi" ] # Produce PDB file, no edit and continue. 921 ldflags = [ "/DEBUG" ] 922 } else { 923 cflags = [ "-g2" ] 924 if (use_debug_fission) { 925 cflags += [ "-gsplit-dwarf" ] 926 } 927 } 928} 929 930config("minimal_symbols") { 931 if (is_win) { 932 # Linker symbols for backtraces only. 933 ldflags = [ "/DEBUG" ] 934 } else { 935 cflags = [ "-g1" ] 936 if (use_debug_fission) { 937 cflags += [ "-gsplit-dwarf" ] 938 } 939 } 940} 941 942config("no_symbols") { 943 if (!is_win) { 944 cflags = [ "-g0" ] 945 } 946} 947