• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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/linux/sysroot.gni")
6
7# Base compiler configuration.
8config("compiler") {
9  include_dirs = [ "//", root_gen_dir ]
10  if (is_win) {
11    cflags = [
12      "/Gy",  # Enable function-level linking.
13      "/GS",  # Enable buffer security checking.
14      "/EHsc",  # Assume C functions can't throw exceptions and don't catch
15                # structured exceptions (only C++ ones).
16    ]
17  } else {
18    # Common GCC compiler flags setup.
19    # --------------------------------
20    cflags = [
21      "-fno-strict-aliasing",  # See http://crbug.com/32204
22      "-fvisibility=hidden",
23    ]
24    cflags_c = [
25    ]
26    cflags_cc = [
27      "-fno-exceptions",
28      "-fno-threadsafe-statics",
29      "-fvisibility-inlines-hidden",
30    ]
31    ldflags = [
32    ]
33
34    # Stack protection.
35    # TODO(brettw) why do we have different values for all of these cases?
36    if (is_mac) {
37      cflags += "-fstack-protector-all"
38    } else if (is_chromeos) {
39      cflags += "-fstack-protector-strong"
40    } else if (is_linux) {
41      cflags += [ "-fstack-protector", "--param=ssp-buffer-size=4" ]
42    }
43
44    if (is_mac) {
45      # Mac-specific compiler flags setup.
46      # ----------------------------------
47
48      # These flags are shared between the C compiler and linker.
49      common_mac_flags = [
50        "-isysroot", sysroot,
51        "-mmacosx-version-min=10.6",
52      ]
53
54      # CPU architecture.
55      if (cpu_arch == "x64") {
56        common_mac_flags += "-arch x86_64"
57      } else if (cpu_arch == "x32") {
58        common_mac_flags += "-arch i386"
59      }
60
61      cflags += common_mac_flags + [
62        # Without this, the constructors and destructors of a C++ object inside
63        # an Objective C struct won't be called, which is very bad.
64        "-fobjc-call-cxx-cdtors",
65      ]
66
67      cflags_c += [ "-std=c99" ]
68      cflags_cc += [ "-std=gnu++11" ]
69
70      ldflags += common_mac_flags + [
71        "-L.",
72
73        # TODO(brettW) I don't understand these options.
74        "-Wl,-rpath,@loader_path/.",
75        "-Wl,-rpath,@loader_path/../../..",
76      ]
77    } else {
78      # Non-Mac Posix compiler flags setup.
79      # -----------------------------------
80
81      # CPU architecture. We may or may not be doing a cross compile now, so for
82      # simplicity we always explicitly set the architecture.
83      if (cpu_arch == "x64") {
84        cflags += "-m64"
85        ldflags += "-m64"
86      } else if (cpu_arch == "x32") {
87        cflags += "-m32"
88        ldflags += "-m32"
89      }
90    }
91
92    # Linux-specific compiler flags setup.
93    # ------------------------------------
94    if (is_linux) {
95      cflags += [
96        "-fPIC",
97        "-pthread",
98        "-pipe",  # Use pipes for communicating between sub-processes. Faster.
99      ]
100
101      # Use gold for linking on 64-bit Linux only (on 32-bit it runs out of
102      # address space, and it doesn't support cross-compiling).
103      if (cpu_arch == "x64") {
104        gold_path = rebase_path("//third_party/gold", ".", root_build_dir)
105        ldflags += [
106          "-B$gold_path",
107
108          # There seems to be a conflict of --icf and -pie in gold which can
109          # generate crashy binaries. As a security measure, -pie takes
110          # precendence for now.
111          # TODO(brettw) common.gypi has this only for target toolset.
112          #"-Wl,--icf=safe",
113          "-Wl,--icf=none",
114
115          # Experimentation found that using four linking threads
116          # saved ~20% of link time.
117          # https://groups.google.com/a/chromium.org/group/chromium-dev/browse_thread/thread/281527606915bb36
118          # Only apply this to the target linker, since the host
119          # linker might not be gold, but isn't used much anyway.
120          "-Wl,--threads",
121          "-Wl,--thread-count=4",
122        ]
123      }
124
125      if (sysroot != "") {
126        cflags += "--sysroot=" + sysroot
127        ldflags += "--sysroot=" + sysroot
128      }
129
130      ldflags += [
131        "-fPIC",
132        "-pthread",
133        "-Wl,-z,noexecstack",
134        "-Wl,-z,now",
135        "-Wl,-z,relro",
136      ]
137    }
138
139    # Clang-specific compiler flags setup.
140    # ------------------------------------
141    if (is_clang) {
142      cflags += [
143        "-fcolor-diagnostics",
144      ]
145    }
146  }
147}
148
149# runtime_library -------------------------------------------------------------
150#
151# Sets the runtime library and associated options.
152#
153# We don't bother making multiple versions that are toggle-able since there
154# is more than one axis of control (which makes it complicated) and there's
155# no practical reason for anybody to change this since the CRT must agree.
156
157config("runtime_library") {
158  if (is_component_build) {
159    # Component mode: dynamic CRT.
160    defines = [ "COMPONENT_BUILD" ]
161    if (is_win) {
162      # Since the library is shared, it requires exceptions or will give errors
163      # about things not matching, so keep exceptions on.
164      if (is_debug) {
165        cflags = [ "/MDd" ]
166      } else {
167        cflags = [ "/MD" ]
168      }
169    }
170  } else {
171    # Static CRT.
172    if (is_win) {
173      # We don't use exceptions, and when we link statically we can just get
174      # rid of them entirely.
175      defines = [ "_HAS_EXCEPTIONS=0" ]
176      if (is_debug) {
177        cflags = [ "/MTd" ]
178      } else {
179        cflags = [ "/MT" ]
180      }
181    }
182  }
183
184  if (is_win) {
185    defines += [
186      "__STD_C",
187      "__STDC_CONSTANT_MACROS",
188      "__STDC_FORMAT_MACROS",
189      "_CRT_RAND_S",
190      "_CRT_SECURE_NO_DEPRECATE",
191      "_SCL_SECURE_NO_DEPRECATE",
192      "_UNICODE",
193      "UNICODE",
194    ]
195  }
196}
197
198# chromium_code ---------------------------------------------------------------
199#
200# Toggles between higher and lower warnings for code that is (or isn't)
201# part of Chromium.
202
203config("chromium_code") {
204  if (is_win) {
205    cflags = [
206      "/W4",  # Warning level 4.
207      "/WX",  # Treat warnings as errors.
208    ]
209  } else {
210    cflags = [
211      "-Wall",
212      "-Werror",
213
214      # GCC turns on -Wsign-compare for C++ under -Wall, but clang doesn't,
215      # so we specify it explicitly.
216      # TODO(fischman): remove this if http://llvm.org/PR10448 obsoletes it.
217      # http://code.google.com/p/chromium/issues/detail?id=90453
218      "-Wsign-compare",
219    ]
220
221    # In Chromium code, we define __STDC_foo_MACROS in order to get the
222    # C99 macros on Mac and Linux.
223    defines = [
224      "__STDC_CONSTANT_MACROS",
225      "__STDC_FORMAT_MACROS",
226    ]
227
228    # TODO(brettw) this should also be enabled on Linux but some files
229    # currently fail.
230    if (is_mac) {
231      cflags += "-Wextra"
232    }
233  }
234}
235config("no_chromium_code") {
236  if (is_win) {
237    cflags = [
238      "/W3",  # Warning level 3.
239      "/wd4800",  # Disable warning when forcing value to bool.
240    ]
241    defines = [
242      "_CRT_NONSTDC_NO_WARNINGS",
243      "_CRT_NONSTDC_NO_DEPRECATE",
244    ]
245  }
246}
247
248# rtti ------------------------------------------------------------------------
249#
250# Allows turning Run-Time Type Identification on or off.
251
252config("rtti") {
253  if (is_win) {
254    cflags_cc = [ "/GR" ]
255  }
256}
257config("no_rtti") {
258  if (is_win) {
259    cflags_cc = [ "/GR-" ]
260  } else {
261    cflags_cc = [ "-fno-rtti" ]
262  }
263}
264
265# Warnings ---------------------------------------------------------------------
266
267config("default_warnings") {
268  if (is_win) {
269    # Please keep ordered and add names if you add more.
270    cflags = [
271      "/wd4018",  # Comparing signed and unsigned values.
272      "/wd4100",  # Unreferenced formal function parameter.
273      "/wd4121",  # Alignment of a member was sensitive to packing.
274      "/wd4125",  # Decimal digit terminates octal escape sequence.
275      "/wd4127",  # Conditional expression is constant.
276      "/wd4130",  # Logical operation on address of string constant.
277      # TODO(brettw) is this necessary? If so, it should probably be on whoever
278      # is silly enough to be doing this rather than globally.
279      #"/wd4131",  # Function uses old-style declarator.
280      "/wd4189",  # A variable was declared and initialized but never used.
281      "/wd4201",  # Nonstandard extension used: nameless struct/union.
282      "/wd4238",  # Nonstandard extension used: class rvalue used as lvalue.
283      "/wd4244",  # Conversion: possible loss of data.
284      "/wd4245",  # Conversion: signed/unsigned mismatch,
285      "/wd4251",  # Class needs to have dll-interface.
286      "/wd4310",  # Cast truncates constant value.
287      "/wd4351",  # Elements of array will be default initialized.
288      "/wd4355",  # 'this' used in base member initializer list.
289      "/wd4396",  # Inline friend template thing.
290      "/wd4428",  # Universal character name encountered in source.
291      "/wd4481",  # Nonstandard extension: override specifier.
292      "/wd4503",  # Decorated name length exceeded, name was truncated.
293      "/wd4505",  # Unreferenced local function has been removed.
294      "/wd4510",  # Default constructor could not be generated.
295      "/wd4512",  # Assignment operator could not be generated.
296      "/wd4530",  # Exception handler used, but unwind semantics not enabled.
297      "/wd4610",  # Class can never be instantiated, constructor required.
298      "/wd4611",  # C++ object destruction and 'catch'.
299      "/wd4701",  # Potentially uninitialized local variable name used.
300      "/wd4702",  # Unreachable code.
301      "/wd4706",  # Assignment within conditional expression.
302      "/wd4819",  # Character not in the current code page.
303    ]
304  } else {
305    # Common GCC warning setup.
306    cflags = [
307      # Enables.
308      "-Wendif-labels",  # Weird old-style text after an #endif.
309
310      # Disables.
311      "-Wno-missing-field-initializers",  # "struct foo f = {0};"
312      "-Wno-unused-parameter",  # Unused function parameters.
313      "-Wno-write-strings",
314    ]
315
316    if (is_mac) {
317      cflags += [
318        "-Wnewline-eof",
319      ]
320    }
321
322    # TODO(brettw) Ones below here should be clang-only when we have a flag
323    # for it.
324    if (is_clang) {
325      cflags += [
326        "-Wheader-hygiene",
327
328        # This warns on using ints as initializers for floats in
329        # initializer lists (e.g. |int a = f(); CGSize s = { a, a };|),
330        # which happens in several places in chrome code. Not sure if
331        # this is worth fixing.
332        "-Wno-c++11-narrowing",
333
334        # Don't die on dtoa code that uses a char as an array index.
335        # This is required solely for base/third_party/dmg_fp/dtoa.cc.
336        # TODO(brettw) move this to that project then!
337        "-Wno-char-subscripts",
338
339        # Warns on switches on enums that cover all enum values but
340        # also contain a default: branch. Chrome is full of that.
341        "-Wno-covered-switch-default",
342
343        # Clang considers the `register` keyword as deprecated, but e.g.
344        # code generated by flex (used in angle) contains that keyword.
345        # http://crbug.com/255186
346        "-Wno-deprecated-register",
347
348        # Clang spots more unused functions.
349        "-Wno-unused-function",
350
351        # Warns when a const char[] is converted to bool.
352        "-Wstring-conversion",
353      ]
354    }
355  }
356}
357
358# Optimization -----------------------------------------------------------------
359
360config("optimize") {
361  if (is_win) {
362    cflags = [
363      "/O2",
364      "/Ob2",  # Both explicit and auto inlining.
365      "/Oy-",  # Disable omitting frame pointers, must be after /O2.
366    ]
367  } else {
368    if (is_ios) {
369      cflags = [ "-Os" ]
370    } else {
371      cflags = [ "-O2" ]
372    }
373  }
374}
375
376config("no_optimize") {
377  if (is_win) {
378    cflags = [
379      "/Od",  # Disable optimization.
380      "/Ob0",  # Disable all inlining (on by default).
381      "/RTC1",  # Runtime checks for stack frame and uninitialized variables.
382    ]
383  } else {
384    cflags = [ "-O0" ]
385  }
386}
387
388# Symbols ----------------------------------------------------------------------
389
390# TODO(brettw) Since this sets ldflags on Windows which is inherited across
391# static library boundaries, if you want to remove the default symbol config
392# and set a different one on a target, you also have to do it for all static
393# libraries that go into that target, which is messed up. Either we need a
394# more flexible system for defining linker flags, or we need to separate this
395# out into a "symbols_linker" config that is only applied to DLLs and EXEs.
396config("symbols") {
397  if (is_win) {
398    cflags = [ "/Zi" ]  # Produce PDB file, no edit and continue.
399    ldflags = [ "/DEBUG" ]
400  } else {
401    cflags = [ "-g2" ]
402  }
403}
404
405config("minimal_symbols") {
406  if (is_win) {
407    # Linker symbols for backtraces only.
408    ldflags = [ "/DEBUG" ]
409  } else {
410    cflags = [ "-g1" ]
411  }
412}
413
414config("no_symbols") {
415  if (!is_win) {
416    cflags = [ "-g0" ]
417  }
418}
419