Updating trunk VERSION from 2139.0 to 2140.0
[chromium-blink-merge.git] / build / config / BUILDCONFIG.gn
blob42745e77696633dcd16cb5afd6f36216a50bea54
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.
5 # =============================================================================
6 # BUILD FLAGS
7 # =============================================================================
9 # This block lists input arguments to the build, along with their default
10 # values. GN requires listing them explicitly so it can validate input and have
11 # a central place to manage the build flags.
13 # If a value is specified on the command line, it will overwrite the defaults
14 # given here, otherwise the default will be injected into the root scope.
16 # KEEP IN ALPHABETICAL ORDER and write a good description for everything.
17 # Use "is_*" names for intrinsic platform descriptions and build modes, and
18 # "use_*" names for optional features libraries, and configurations.
19 declare_args() {
20   # How many symbols to include in the build. This affects the performance of
21   # the build since the symbols are large and dealing with them is slow.
22   #   2 means regular build with symbols.
23   #   1 means minimal symbols, usually enough for backtraces only.
24   #   0 means no symbols.
25   symbol_level = 2
27   # Component build.
28   is_component_build = false
29   # Debug build.
30   is_debug = true
32   # Set to true when compiling with the Clang compiler. Typically this is used
33   # to configure warnings.
34   is_clang = (os == "mac" || os == "ios" || os == "linux")
36   # Forces a 64-bit build on Windows. Does nothing on other platforms. Normally
37   # we build 32-bit on Windows regardless of the current host OS bit depth.
38   # Setting this flag will override this logic and generate 64-bit toolchains.
39   #
40   # Normally this would get set automatically when you specify a target using
41   # the 64-bit toolchain. You can also set this on the command line to convert
42   # the default toolchain to 64-bit.
43   force_win64 = false
45   # Selects the desired build flavor. Official builds get additional
46   # processing to prepare for release. Normally you will want to develop and
47   # test with this flag off.
48   is_official_build = false
50   # Select the desired branding flavor. False means normal Chromium branding,
51   # true means official Google Chrome branding (requires extra Google-internal
52   # resources).
53   is_chrome_branded = false
55   # Compile for Address Sanitizer to find memory bugs.
56   is_asan = false
58   # Compile for Leak Sanitizer to find leaks.
59   is_lsan = false
61   # Compile for Memory Sanitizer to find uninitialized reads.
62   is_msan = false
64   # Compile for Thread Sanitizer to find threading bugs.
65   is_tsan = false
68 # =============================================================================
69 # OS DEFINITIONS
70 # =============================================================================
72 # We set these various is_FOO booleans for convenience in writing OS-based
73 # conditions.
75 # - is_android, is_chromeos, is_ios, and is_win should be obvious.
76 # - is_mac is set only for desktop Mac. It is not set on iOS.
77 # - is_posix is true for mac and any Unix-like system (basically everything
78 #   except Windows).
79 # - is_linux is true for desktop Linux and ChromeOS, but not Android (which is
80 #   generally too different despite being based on the Linux kernel).
82 # Do not add more is_* variants here for random lesser-used Unix systems like
83 # aix or one of the BSDs. If you need to check these, just check the os value
84 # directly.
86 if (os == "win") {
87   is_android = false
88   is_chromeos = false
89   is_ios = false
90   is_linux = false
91   is_mac = false
92   is_nacl = false
93   is_posix = false
94   is_win = true
95 } else if (os == "mac") {
96   is_android = false
97   is_chromeos = false
98   is_ios = false
99   is_linux = false
100   is_mac = true
101   is_nacl = false
102   is_posix = true
103   is_win = false
104 } else if (os == "android") {
105   is_android = true
106   is_chromeos = false
107   is_ios = false
108   is_linux = false
109   is_mac = false
110   is_nacl = false
111   is_posix = true
112   is_win = false
113 } else if (os == "chromeos") {
114   is_android = false
115   is_chromeos = true
116   is_ios = false
117   is_linux = true
118   is_mac = false
119   is_nacl = false
120   is_posix = true
121   is_win = false
122 } else if (os == "nacl") {
123   # os == "nacl" will be passed by the nacl toolchain definition. It is not
124   # set by default or on the command line. We treat is as a Posix variant.
125   is_android = false
126   is_chromeos = false
127   is_ios = false
128   is_linux = false
129   is_mac = false
130   is_nacl = true
131   is_posix = true
132   is_win = false
133 } else if (os == "ios") {
134   is_android = false
135   is_chromeos = false
136   is_ios = true
137   is_linux = false
138   is_mac = false
139   is_nacl = false
140   is_posix = true
141   is_win = false
142 } else if (os == "linux") {
143   is_android = false
144   is_chromeos = false
145   is_ios = false
146   is_linux = true
147   is_mac = false
148   is_nacl = false
149   is_posix = true
150   is_win = false
153 is_desktop_linux = is_linux && !is_chromeos
155 # =============================================================================
156 # CPU ARCHITECTURE
157 # =============================================================================
159 if (is_win) {
160   # Always use 32-bit on Windows, even when compiling on a 64-bit host OS,
161   # unless the override flag is specified.
162   if (force_win64) {
163     cpu_arch = "x64"
164   } else {
165     cpu_arch = "x86"
166   }
169 # =============================================================================
170 # SOURCES FILTERS
171 # =============================================================================
173 # These patterns filter out platform-specific files when assigning to the
174 # sources variable. The magic variable |sources_assignment_filter| is applied
175 # to each assignment or appending to the sources variable and matches are
176 # automatcally removed.
178 # Note that the patterns are NOT regular expressions. Only "*" and "\b" (path
179 # boundary = end of string or slash) are supported, and the entire string
180 # muct match the pattern (so you need "*.cc" to match all .cc files, for
181 # example).
183 # DO NOT ADD MORE PATTERNS TO THIS LIST, see set_sources_assignment_filter call
184 # below.
185 sources_assignment_filter = []
186 if (!is_posix) {
187   sources_assignment_filter += [
188     "*_posix.h",
189     "*_posix.cc",
190     "*_posix_unittest.h",
191     "*_posix_unittest.cc",
192     "*\bposix/*",
193   ]
195 if (!is_win) {
196   sources_assignment_filter += [
197     "*_win.cc",
198     "*_win.h",
199     "*_win_unittest.cc",
200     "*\bwin/*",
201     "*.rc",
202   ]
204 if (!is_mac) {
205   sources_assignment_filter += [
206     "*_mac.h",
207     "*_mac.cc",
208     "*_mac.mm",
209     "*_mac_unittest.h",
210     "*_mac_unittest.cc",
211     "*_mac_unittest.mm",
212     "*\bmac/*",
213     "*_cocoa.h",
214     "*_cocoa.cc",
215     "*_cocoa.mm",
216     "*_cocoa_unittest.h",
217     "*_cocoa_unittest.cc",
218     "*_cocoa_unittest.mm",
219     "*\bcocoa/*",
220   ]
222 if (!is_ios) {
223   sources_assignment_filter += [
224     "*_ios.h",
225     "*_ios.cc",
226     "*_ios.mm",
227     "*_ios_unittest.h",
228     "*_ios_unittest.cc",
229     "*_ios_unittest.mm",
230     "*\bios/*",
231   ]
233 if (!is_mac && !is_ios) {
234   sources_assignment_filter += [
235     "*.mm",
236   ]
238 if (!is_linux) {
239   sources_assignment_filter += [
240     "*_linux.h",
241     "*_linux.cc",
242     "*_linux_unittest.h",
243     "*_linux_unittest.cc",
244     "*\blinux/*",
245   ]
247 if (!is_android) {
248   sources_assignment_filter += [
249     "*_android.h",
250     "*_android.cc",
251     "*_android_unittest.h",
252     "*_android_unittest.cc",
253     "*\bandroid/*",
254   ]
256 if (!is_chromeos) {
257   sources_assignment_filter += [
258     "*_chromeos.h",
259     "*_chromeos.cc",
260     "*_chromeos_unittest.h",
261     "*_chromeos_unittest.cc",
262     "*\bchromeos/*",
263   ]
265 # DO NOT ADD MORE PATTERNS TO THIS LIST, see set_sources_assignment_filter call
266 # below.
268 # Actually save this list.
270 # These patterns are executed for every file in the source tree of every run.
271 # Therefore, adding more patterns slows down the build for everybody. We should
272 # only add automatic patterns for configurations affecting hundreds of files
273 # across many projects in the tree.
275 # Therefore, we only add rules to this list corresponding to platforms on the
276 # Chromium waterfall.  This is not for non-officially-supported platforms
277 # (FreeBSD, etc.) toolkits, (X11, GTK, etc.), or features. For these cases,
278 # write a conditional in the target to remove the file(s) from the list when
279 # your platform/toolkit/feature doesn't apply.
280 set_sources_assignment_filter(sources_assignment_filter)
282 # =============================================================================
283 # BUILD OPTIONS
284 # =============================================================================
286 if (is_component_build) {
287   component_mode = "shared_library"
288 } else {
289   component_mode = "source_set"
292 # These Sanitizers all imply using the Clang compiler. On Windows they either
293 # don't work or work differently.
294 if (!is_clang && (is_asan || is_lsan || is_tsan || is_msan)) {
295   is_clang = true
298 # =============================================================================
299 # TARGET DEFAULTS
300 # =============================================================================
302 # Set up the default configuration for every build target of the given type.
303 # The values configured here will be automatically set on the scope of the
304 # corresponding target. Target definitions can add or remove to the settings
305 # here as needed.
307 # Holds all configs used for making native executables and libraries, to avoid
308 # duplication in each target below.
309 _native_compiler_configs = [
310   "//build/config:feature_flags",
312   "//build/config/compiler:compiler",
313   "//build/config/compiler:compiler_arm_fpu",
314   "//build/config/compiler:chromium_code",
315   "//build/config/compiler:default_include_dirs",
316   "//build/config/compiler:default_warnings",
317   "//build/config/compiler:no_rtti",
318   "//build/config/compiler:runtime_library",
320 if (is_win) {
321   _native_compiler_configs += [
322     "//build/config/win:lean_and_mean",
323     "//build/config/win:nominmax",
324     "//build/config/win:sdk",
325     "//build/config/win:unicode",
326   ]
328 if (is_posix) {
329   _native_compiler_configs += [
330     "//build/config/gcc:no_exceptions",
331     "//build/config/gcc:symbol_visibility_hidden",
332   ]
335 if (is_linux) {
336   _native_compiler_configs += [ "//build/config/linux:sdk", ]
337 } else if (is_mac) {
338   _native_compiler_configs += [ "//build/config/mac:sdk", ]
339 } else if (is_ios) {
340   _native_compiler_configs += [ "//build/config/ios:sdk", ]
341 } else if (is_android) {
342   _native_compiler_configs += [ "//build/config/android:sdk", ]
345 if (is_clang) {
346   _native_compiler_configs += [
347     "//build/config/clang:find_bad_constructs",
348     "//build/config/clang:extra_warnings",
349   ]
352 # Optimizations and debug checking.
353 if (is_debug) {
354   _native_compiler_configs += [ "//build/config:debug" ]
355   _default_optimization_config = "//build/config/compiler:no_optimize"
356 } else {
357   _native_compiler_configs += [ "//build/config:release" ]
358   _default_optimization_config = "//build/config/compiler:optimize"
360 _native_compiler_configs += [ _default_optimization_config ]
362 # Symbol setup.
363 if (symbol_level == 2) {
364   _default_symbols_config = "//build/config/compiler:symbols"
365 } else if (symbol_level == 1) {
366   _default_symbols_config = "//build/config/compiler:minimal_symbols"
367 } else if (symbol_level == 0) {
368   _default_symbols_config = "//build/config/compiler:no_symbols"
369 } else {
370   assert(false, "Bad value for symbol_level.")
372 _native_compiler_configs += [ _default_symbols_config ]
374 # Windows linker setup for EXEs and DLLs.
375 if (is_win) {
376   if (is_debug) {
377     _default_incremental_linking_config =
378       "//build/config/win:incremental_linking"
379   } else {
380     _default_incremental_linking_config =
381       "//build/config/win:no_incremental_linking"
382   }
383   _windows_linker_configs = [
384     _default_incremental_linking_config,
385     "//build/config/win:sdk_link",
386     "//build/config/win:common_linker_setup",
387     # Default to console-mode apps. Most of our targets are tests and such
388     # that shouldn't use the windows subsystem.
389     "//build/config/win:console",
390   ]
393 set_defaults("executable") {
394   configs = _native_compiler_configs + [
395     "//build/config:default_libs",
396   ]
397   if (is_win) {
398     configs += _windows_linker_configs
399   } else if (is_mac) {
400     configs += [
401       "//build/config/mac:mac_dynamic_flags",
402       "//build/config/mac:mac_executable_flags" ]
403   } else if (is_linux || is_android) {
404     configs += [ "//build/config/gcc:executable_ldconfig" ]
405   }
408 set_defaults("static_library") {
409   configs = _native_compiler_configs
412 set_defaults("shared_library") {
413   configs = _native_compiler_configs + [
414     "//build/config:default_libs",
415   ]
416   if (is_win) {
417     configs += _windows_linker_configs
418   } else if (is_mac) {
419     configs += [ "//build/config/mac:mac_dynamic_flags" ]
420   }
423 set_defaults("source_set") {
424   configs = _native_compiler_configs
427 # ==============================================================================
428 # TOOLCHAIN SETUP
429 # ==============================================================================
431 # Here we set the default toolchain, as well as the variable host_toolchain
432 # which will identify the toolchain corresponding to the local system when
433 # doing cross-compiles. When not cross-compiling, this will be the same as the
434 # default toolchain.
436 if (is_win) {
437   # TODO(brettw) name the toolchains the same as cpu_arch as with Linux below
438   # to eliminate these conditionals.
439   if (build_cpu_arch == "x64") {
440     host_toolchain = "//build/toolchain/win:64"
441   } else if (build_cpu_arch == "x86") {
442     host_toolchain = "//build/toolchain/win:32"
443   }
445   if (cpu_arch == "x64") {
446     set_default_toolchain("//build/toolchain/win:64")
447   } else if (cpu_arch == "x86") {
448     set_default_toolchain("//build/toolchain/win:32")
449   }
450 } else if (is_android) {
451   # Use clang for the x86/64 Linux host builds.
452   if (build_cpu_arch == "x86" || build_cpu_arch == "x64") {
453     host_toolchain = "//build/toolchain/linux:clang_$build_cpu_arch"
454   } else {
455     host_toolchain = "//build/toolchain/linux:$build_cpu_arch"
456   }
457   set_default_toolchain("//build/toolchain/android:$cpu_arch")
458 } else if (is_linux) {
459   if (is_clang) {
460     host_toolchain = "//build/toolchain/linux:clang_$build_cpu_arch"
461     set_default_toolchain("//build/toolchain/linux:clang_$cpu_arch")
462   } else {
463     host_toolchain = "//build/toolchain/linux:$build_cpu_arch"
464     set_default_toolchain("//build/toolchain/linux:$cpu_arch")
465   }
466 } else if (is_mac) {
467   host_toolchain = "//build/toolchain/mac:clang"
468   set_default_toolchain(host_toolchain)
469 } else if (is_ios) {
470   host_toolchain = "//build/toolchain/mac:host_clang"
471   set_default_toolchain("//build/toolchain/mac:clang")