| # Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| # Base compiler configuration. |
| config("compiler") { |
| include_dirs = [ "//", root_gen_dir ] |
| if (is_win) { |
| cflags = [ |
| "/Gy", # Enable function-level linking. |
| "/GS", # Enable buffer security checking. |
| "/EHsc", # Assume C functions can't throw exceptions and don't catch |
| # structured exceptions (only C++ ones). |
| ] |
| } else { |
| # Common GCC compiler flags setup. |
| # -------------------------------- |
| cflags = [ |
| "-fno-strict-aliasing", # See http://crbug.com/32204 |
| "-fvisibility=hidden", |
| ] |
| cflags_c = [ |
| ] |
| cflags_cc = [ |
| "-fno-exceptions", |
| "-fno-threadsafe-statics", |
| "-fvisibility-inlines-hidden", |
| ] |
| ldflags = [ |
| ] |
| |
| # Stack protection. |
| # TODO(brettw) why do we have different values for all of these cases? |
| if (is_mac) { |
| cflags += "-fstack-protector-all" |
| } else if (is_chromeos) { |
| cflags += "-fstack-protector-strong" |
| } else if (is_linux) { |
| cflags += [ "-fstack-protector", "--param=ssp-buffer-size=4" ] |
| } |
| |
| if (is_mac) { |
| # Mac-specific compiler flags setup. |
| # ---------------------------------- |
| |
| # These flags are shared between the C compiler and linker. |
| common_mac_flags = [ |
| # Set which SDK to use. |
| # TODO(brettw) this needs to be configurable somehow. |
| "-isysroot", "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.7.sdk", |
| |
| "-mmacosx-version-min=10.6", |
| ] |
| |
| # CPU architecture. |
| if (cpu_arch == "x64") { |
| common_mac_flags += "-arch x86_64" |
| } else if (cpu_arch == "x32") { |
| common_mac_flags += "-arch i386" |
| } |
| |
| cflags += common_mac_flags + [ |
| # Without this, the constructors and destructors of a C++ object inside |
| # an Objective C struct won't be called, which is very bad. |
| "-fobjc-call-cxx-cdtors", |
| ] |
| |
| cflags_c += [ "-std=c99" ] |
| cflags_cc += [ "-std=gnu++11" ] |
| |
| ldflags += common_mac_flags + [ |
| "-L.", |
| |
| # TODO(brettW) I don't understand these options. |
| "-Wl,-rpath,@loader_path/.", |
| "-Wl,-rpath,@loader_path/../../..", |
| ] |
| } else { |
| # Non-Mac Posix compiler flags setup. |
| # ----------------------------------- |
| |
| # CPU architecture. We may or may not be doing a cross compile now, so for |
| # simplicity we always explicitly set the architecture. |
| if (cpu_arch == "x64") { |
| cflags += "-m64" |
| ldflags += "-m64" |
| } else if (cpu_arch == "x32") { |
| cflags += "-m32" |
| ldflags += "-m32" |
| } |
| } |
| |
| # Linux-specific compiler flags setup. |
| # ------------------------------------ |
| if (is_linux) { |
| cflags += [ |
| "-fPIC", |
| "-pthread", |
| "-pipe", # Use pipes for communicating between sub-processes. Faster. |
| ] |
| |
| # Use gold for linking on 64-bit Linux only (on 32-bit it runs out of |
| # address space, and it doesn't support cross-compiling). |
| if (cpu_arch == "x64") { |
| gold_path = rebase_path("//third_party/gold", ".", root_build_dir) |
| ldflags += [ |
| "-B$gold_path", |
| |
| # There seems to be a conflict of --icf and -pie in gold which can |
| # generate crashy binaries. As a security measure, -pie takes |
| # precendence for now. |
| # TODO(brettw) common.gypi has this only for target toolset. |
| #"-Wl,--icf=safe", |
| "-Wl,--icf=none", |
| |
| # Experimentation found that using four linking threads |
| # saved ~20% of link time. |
| # https://groups.google.com/a/chromium.org/group/chromium-dev/browse_thread/thread/281527606915bb36 |
| # Only apply this to the target linker, since the host |
| # linker might not be gold, but isn't used much anyway. |
| "-Wl,--threads", |
| "-Wl,--thread-count=4", |
| ] |
| } |
| |
| ldflags += [ |
| "-fPIC", |
| "-pthread", |
| "-Wl,-z,noexecstack", |
| "-Wl,-z,now", |
| "-Wl,-z,relro", |
| ] |
| } |
| |
| # Clang-specific compiler flags setup. |
| # ------------------------------------ |
| if (is_clang) { |
| cflags += [ |
| "-fcolor-diagnostics", |
| ] |
| } |
| } |
| } |
| |
| # runtime_library ------------------------------------------------------------- |
| # |
| # Sets the runtime library and associated options. |
| # |
| # We don't bother making multiple versions that are toggle-able since there |
| # is more than one axis of control (which makes it complicated) and there's |
| # no practical reason for anybody to change this since the CRT must agree. |
| |
| config("runtime_library") { |
| if (is_component_build) { |
| # Component mode: dynamic CRT. |
| defines = [ "COMPONENT_BUILD" ] |
| if (is_win) { |
| # Since the library is shared, it requires exceptions or will give errors |
| # about things not matching, so keep exceptions on. |
| if (is_debug) { |
| cflags = [ "/MDd" ] |
| } else { |
| cflags = [ "/MD" ] |
| } |
| } |
| } else { |
| # Static CRT. |
| if (is_win) { |
| # We don't use exceptions, and when we link statically we can just get |
| # rid of them entirely. |
| defines = [ "_HAS_EXCEPTIONS=0" ] |
| if (is_debug) { |
| cflags = [ "/MTd" ] |
| } else { |
| cflags = [ "/MT" ] |
| } |
| } |
| } |
| |
| if (is_win) { |
| defines += [ |
| "__STD_C", |
| "__STDC_CONSTANT_MACROS", |
| "__STDC_FORMAT_MACROS", |
| "_CRT_RAND_S", |
| "_CRT_SECURE_NO_DEPRECATE", |
| "_SCL_SECURE_NO_DEPRECATE", |
| "_UNICODE", |
| "UNICODE", |
| ] |
| } |
| } |
| |
| # chromium_code --------------------------------------------------------------- |
| # |
| # Toggles between higher and lower warnings for code that is (or isn't) |
| # part of Chromium. |
| |
| config("chromium_code") { |
| if (is_win) { |
| cflags = [ |
| "/W4", # Warning level 4. |
| "/WX", # Treat warnings as errors. |
| ] |
| } else { |
| cflags = [ |
| "-Wall", |
| "-Werror", |
| |
| # GCC turns on -Wsign-compare for C++ under -Wall, but clang doesn't, |
| # so we specify it explicitly. |
| # TODO(fischman): remove this if http://llvm.org/PR10448 obsoletes it. |
| # http://code.google.com/p/chromium/issues/detail?id=90453 |
| "-Wsign-compare", |
| ] |
| |
| # In Chromium code, we define __STDC_foo_MACROS in order to get the |
| # C99 macros on Mac and Linux. |
| defines = [ |
| "__STDC_CONSTANT_MACROS", |
| "__STDC_FORMAT_MACROS", |
| ] |
| |
| # TODO(brettw) this should also be enabled on Linux but some files |
| # currently fail. |
| if (is_mac) { |
| cflags += "-Wextra" |
| } |
| } |
| } |
| config("no_chromium_code") { |
| if (is_win) { |
| cflags = [ |
| "/W3", # Warning level 3. |
| "/wd4800", # Disable warning when forcing value to bool. |
| ] |
| defines = [ |
| "_CRT_NONSTDC_NO_WARNINGS", |
| "_CRT_NONSTDC_NO_DEPRECATE", |
| ] |
| } |
| } |
| |
| # rtti ------------------------------------------------------------------------ |
| # |
| # Allows turning Run-Time Type Identification on or off. |
| |
| config("rtti") { |
| if (is_win) { |
| cflags_cc = [ "/GR" ] |
| } |
| } |
| config("no_rtti") { |
| if (is_win) { |
| cflags_cc = [ "/GR-" ] |
| } else { |
| cflags_cc = [ "-fno-rtti" ] |
| } |
| } |
| |
| # Warnings --------------------------------------------------------------------- |
| |
| config("default_warnings") { |
| if (is_win) { |
| # Please keep ordered and add names if you add more. |
| cflags = [ |
| "/wd4018", # Comparing signed and unsigned values. |
| "/wd4100", # Unreferenced formal function parameter. |
| "/wd4121", # Alignment of a member was sensitive to packing. |
| "/wd4125", # Decimal digit terminates octal escape sequence. |
| "/wd4127", # Conditional expression is constant. |
| "/wd4130", # Logical operation on address of string constant. |
| # TODO(brettw) is this necessary? If so, it should probably be on whoever |
| # is silly enough to be doing this rather than globally. |
| #"/wd4131", # Function uses old-style declarator. |
| "/wd4189", # A variable was declared and initialized but never used. |
| "/wd4201", # Nonstandard extension used: nameless struct/union. |
| "/wd4238", # Nonstandard extension used: class rvalue used as lvalue. |
| "/wd4244", # Conversion: possible loss of data. |
| "/wd4245", # Conversion: signed/unsigned mismatch, |
| "/wd4251", # Class needs to have dll-interface. |
| "/wd4310", # Cast truncates constant value. |
| "/wd4351", # Elements of array will be default initialized. |
| "/wd4355", # 'this' used in base member initializer list. |
| "/wd4396", # Inline friend template thing. |
| "/wd4428", # Universal character name encountered in source. |
| "/wd4481", # Nonstandard extension: override specifier. |
| "/wd4503", # Decorated name length exceeded, name was truncated. |
| "/wd4505", # Unreferenced local function has been removed. |
| "/wd4510", # Default constructor could not be generated. |
| "/wd4512", # Assignment operator could not be generated. |
| "/wd4530", # Exception handler used, but unwind semantics not enabled. |
| "/wd4610", # Class can never be instantiated, constructor required. |
| "/wd4611", # C++ object destruction and 'catch'. |
| "/wd4701", # Potentially uninitialized local variable name used. |
| "/wd4702", # Unreachable code. |
| "/wd4706", # Assignment within conditional expression. |
| "/wd4819", # Character not in the current code page. |
| ] |
| } else { |
| # Common GCC warning setup. |
| cflags = [ |
| # Enables. |
| "-Wendif-labels", # Weird old-style text after an #endif. |
| |
| # Disables. |
| "-Wno-missing-field-initializers", # "struct foo f = {0};" |
| "-Wno-unused-parameter", # Unused function parameters. |
| "-Wno-write-strings", |
| ] |
| |
| if (is_mac) { |
| cflags += [ |
| "-Wnewline-eof", |
| ] |
| } |
| |
| # TODO(brettw) Ones below here should be clang-only when we have a flag |
| # for it. |
| if (is_clang) { |
| cflags += [ |
| "-Wheader-hygiene", |
| |
| # This warns on using ints as initializers for floats in |
| # initializer lists (e.g. |int a = f(); CGSize s = { a, a };|), |
| # which happens in several places in chrome code. Not sure if |
| # this is worth fixing. |
| "-Wno-c++11-narrowing", |
| |
| # Don't die on dtoa code that uses a char as an array index. |
| # This is required solely for base/third_party/dmg_fp/dtoa.cc. |
| # TODO(brettw) move this to that project then! |
| "-Wno-char-subscripts", |
| |
| # Warns on switches on enums that cover all enum values but |
| # also contain a default: branch. Chrome is full of that. |
| "-Wno-covered-switch-default", |
| |
| # Clang considers the `register` keyword as deprecated, but e.g. |
| # code generated by flex (used in angle) contains that keyword. |
| # http://crbug.com/255186 |
| "-Wno-deprecated-register", |
| |
| # Clang spots more unused functions. |
| "-Wno-unused-function", |
| |
| # Warns when a const char[] is converted to bool. |
| "-Wstring-conversion", |
| ] |
| } |
| } |
| } |
| |
| # Optimization ----------------------------------------------------------------- |
| |
| config("optimize") { |
| if (is_win) { |
| cflags = [ |
| "/O2", |
| "/Ob2", # Both explicit and auto inlining. |
| "/Oy-", # Disable omitting frame pointers, must be after /O2. |
| ] |
| } else { |
| if (is_ios) { |
| cflags = [ "-Os" ] |
| } else { |
| cflags = [ "-O2" ] |
| } |
| } |
| } |
| |
| config("no_optimize") { |
| if (is_win) { |
| cflags = [ |
| "/Od", # Disable optimization. |
| "/Ob0", # Disable all inlining (on by default). |
| "/RTC1", # Runtime checks for stack frame and uninitialized variables. |
| ] |
| } else { |
| cflags = [ "-O0" ] |
| } |
| } |
| |
| # Symbols ---------------------------------------------------------------------- |
| |
| # TODO(brettw) Since this sets ldflags on Windows which is inherited across |
| # static library boundaries, if you want to remove the default symbol config |
| # and set a different one on a target, you also have to do it for all static |
| # libraries that go into that target, which is messed up. Either we need a |
| # more flexible system for defining linker flags, or we need to separate this |
| # out into a "symbols_linker" config that is only applied to DLLs and EXEs. |
| config("symbols") { |
| if (is_win) { |
| cflags = [ "/Zi" ] # Produce PDB file, no edit and continue. |
| ldflags = [ "/DEBUG" ] |
| } else { |
| cflags = [ "-g2" ] |
| } |
| } |
| |
| config("minimal_symbols") { |
| if (is_win) { |
| # Linker symbols for backtraces only. |
| ldflags = [ "/DEBUG" ] |
| } else { |
| cflags = [ "-g1" ] |
| } |
| } |
| |
| config("no_symbols") { |
| if (!is_win) { |
| cflags = [ "-g0" ] |
| } |
| } |