# 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. import("//build/config/linux/sysroot.gni") # 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 = [ "-isysroot", sysroot, "-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", ] } if (sysroot != "") { cflags += "--sysroot=" + sysroot ldflags += "--sysroot=" + sysroot } 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" ] } }