1# Copyright 2012 the V8 project authors. All rights reserved.
2# Redistribution and use in source and binary forms, with or without
3# modification, are permitted provided that the following conditions are
4# met:
5#
6#     * Redistributions of source code must retain the above copyright
7#       notice, this list of conditions and the following disclaimer.
8#     * Redistributions in binary form must reproduce the above
9#       copyright notice, this list of conditions and the following
10#       disclaimer in the documentation and/or other materials provided
11#       with the distribution.
12#     * Neither the name of Google Inc. nor the names of its
13#       contributors may be used to endorse or promote products derived
14#       from this software without specific prior written permission.
15#
16# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
28# Definitions to be used when building stand-alone V8 binaries.
29
30{
31  # We need to include toolchain.gypi here for third-party sources that don't
32  # directly include it themselves.
33  'includes': ['toolchain.gypi'],
34  'variables': {
35    'component%': 'static_library',
36    'clang_xcode%': 0,
37    # Track where uninitialized memory originates from. From fastest to
38    # slowest: 0 - no tracking, 1 - track only the initial allocation site, 2
39    # - track the chain of stores leading from allocation site to use site.
40    'msan_track_origins%': 2,
41    'visibility%': 'hidden',
42    'v8_enable_backtrace%': 0,
43    'v8_enable_i18n_support%': 1,
44    'v8_deprecation_warnings': 1,
45    'v8_imminent_deprecation_warnings': 1,
46    'msvs_multi_core_compile%': '1',
47    'mac_deployment_target%': '10.7',
48    'release_extra_cflags%': '',
49    'v8_enable_inspector%': 0,
50    'variables': {
51      'variables': {
52        'variables': {
53          'variables': {
54            'conditions': [
55              ['OS=="linux" or OS=="freebsd" or OS=="openbsd" or \
56                 OS=="netbsd" or OS=="mac" or OS=="qnx" or OS=="aix"', {
57                # This handles the Unix platforms we generally deal with.
58                # Anything else gets passed through, which probably won't work
59                # very well; such hosts should pass an explicit target_arch
60                # to gyp.
61                'host_arch%': '<!pymod_do_main(detect_v8_host_arch)',
62              }, {
63                # OS!="linux" and OS!="freebsd" and OS!="openbsd" and
64                # OS!="netbsd" and OS!="mac" and OS!="aix"
65                'host_arch%': 'ia32',
66              }],
67            ],
68          },
69          'host_arch%': '<(host_arch)',
70          'target_arch%': '<(host_arch)',
71
72          # By default we build against a stable sysroot image to avoid
73          # depending on the packages installed on the local machine. Set this
74          # to 0 to build against locally installed headers and libraries (e.g.
75          # if packaging for a linux distro)
76          'use_sysroot%': 1,
77        },
78        'host_arch%': '<(host_arch)',
79        'target_arch%': '<(target_arch)',
80        'use_sysroot%': '<(use_sysroot)',
81        'base_dir%': '<!(cd <(DEPTH) && python -c "import os; print os.getcwd()")',
82
83        # Instrument for code coverage and use coverage wrapper to exclude some
84        # files. Uses gcov if clang=0 is set explicitly. Otherwise,
85        # sanitizer_coverage must be set too.
86        'coverage%': 0,
87
88        # Default sysroot if no sysroot can be provided.
89        'sysroot%': '',
90
91        'conditions': [
92          # The system root for linux builds.
93          ['OS=="linux" and use_sysroot==1', {
94            'conditions': [
95              ['target_arch=="arm"', {
96                'sysroot%': '<!(cd <(DEPTH) && pwd -P)/build/linux/debian_wheezy_arm-sysroot',
97              }],
98              ['target_arch=="x64"', {
99                'sysroot%': '<!(cd <(DEPTH) && pwd -P)/build/linux/debian_wheezy_amd64-sysroot',
100              }],
101              ['target_arch=="ia32"', {
102                'sysroot%': '<!(cd <(DEPTH) && pwd -P)/build/linux/debian_wheezy_i386-sysroot',
103              }],
104              ['target_arch=="mipsel"', {
105                'sysroot%': '<!(cd <(DEPTH) && pwd -P)/build/linux/debian_wheezy_mips-sysroot',
106              }],
107            ],
108          }], # OS=="linux" and use_sysroot==1
109        ],
110      },
111      'base_dir%': '<(base_dir)',
112      'host_arch%': '<(host_arch)',
113      'target_arch%': '<(target_arch)',
114      'v8_target_arch%': '<(target_arch)',
115      'coverage%': '<(coverage)',
116      'sysroot%': '<(sysroot)',
117      'asan%': 0,
118      'lsan%': 0,
119      'msan%': 0,
120      'tsan%': 0,
121      # Enable coverage gathering instrumentation in sanitizer tools. This flag
122      # also controls coverage granularity (1 for function-level, 2 for
123      # block-level, 3 for edge-level).
124      'sanitizer_coverage%': 0,
125
126      # Use dynamic libraries instrumented by one of the sanitizers
127      # instead of the standard system libraries. Set this flag to download
128      # prebuilt binaries from GCS.
129      'use_prebuilt_instrumented_libraries%': 0,
130
131      # Use libc++ (buildtools/third_party/libc++ and
132      # buildtools/third_party/libc++abi) instead of stdlibc++ as standard
133      # library. This is intended to be used for instrumented builds.
134      'use_custom_libcxx%': 0,
135
136      'clang_dir%': '<(base_dir)/third_party/llvm-build/Release+Asserts',
137      'make_clang_dir%': '<(base_dir)/third_party/llvm-build/Release+Asserts',
138
139      'use_lto%': 0,
140
141      # Control Flow Integrity for virtual calls and casts.
142      # See http://clang.llvm.org/docs/ControlFlowIntegrity.html
143      'cfi_vptr%': 0,
144      'cfi_diag%': 0,
145
146      'cfi_blacklist%': '<(base_dir)/tools/cfi/blacklist.txt',
147
148      # Set to 1 to enable fast builds.
149      # TODO(machenbach): Only configured for windows.
150      'fastbuild%': 0,
151
152      # goma settings.
153      # 1 to use goma.
154      # If no gomadir is set, it uses the default gomadir.
155      'use_goma%': 0,
156      'gomadir%': '',
157
158      'test_isolation_mode%': 'noop',
159
160      # By default, use ICU data file (icudtl.dat).
161      'icu_use_data_file_flag%': 1,
162
163      'conditions': [
164        # Set default gomadir.
165        ['OS=="win"', {
166          'gomadir': 'c:\\goma\\goma-win',
167        }, {
168          'gomadir': '<!(/bin/echo -n ${HOME}/goma)',
169        }],
170        ['host_arch!="ppc" and host_arch!="ppc64" and host_arch!="ppc64le" and host_arch!="s390" and host_arch!="s390x"', {
171          'host_clang%': 1,
172        }, {
173          'host_clang%': 0,
174        }],
175        # linux_use_bundled_gold: whether to use the gold linker binary checked
176        # into third_party/binutils.  Force this off via GYP_DEFINES when you
177        # are using a custom toolchain and need to control -B in ldflags.
178        # Do not use 32-bit gold on 32-bit hosts as it runs out address space
179        # for component=static_library builds.
180        ['((OS=="linux" or OS=="android") and (target_arch=="x64" or target_arch=="arm" or (target_arch=="ia32" and host_arch=="x64"))) or (OS=="linux" and target_arch=="mipsel")', {
181          'linux_use_bundled_gold%': 1,
182        }, {
183          'linux_use_bundled_gold%': 0,
184        }],
185      ],
186    },
187    'base_dir%': '<(base_dir)',
188    'clang_dir%': '<(clang_dir)',
189    'make_clang_dir%': '<(make_clang_dir)',
190    'host_arch%': '<(host_arch)',
191    'host_clang%': '<(host_clang)',
192    'target_arch%': '<(target_arch)',
193    'v8_target_arch%': '<(v8_target_arch)',
194    'werror%': '-Werror',
195    'use_goma%': '<(use_goma)',
196    'gomadir%': '<(gomadir)',
197    'asan%': '<(asan)',
198    'lsan%': '<(lsan)',
199    'msan%': '<(msan)',
200    'tsan%': '<(tsan)',
201    'sanitizer_coverage%': '<(sanitizer_coverage)',
202    'use_prebuilt_instrumented_libraries%': '<(use_prebuilt_instrumented_libraries)',
203    'use_custom_libcxx%': '<(use_custom_libcxx)',
204    'linux_use_bundled_gold%': '<(linux_use_bundled_gold)',
205    'use_lto%': '<(use_lto)',
206    'cfi_vptr%': '<(cfi_vptr)',
207    'cfi_diag%': '<(cfi_diag)',
208    'cfi_blacklist%': '<(cfi_blacklist)',
209    'test_isolation_mode%': '<(test_isolation_mode)',
210    'fastbuild%': '<(fastbuild)',
211    'coverage%': '<(coverage)',
212    'sysroot%': '<(sysroot)',
213    'icu_use_data_file_flag%': '<(icu_use_data_file_flag)',
214
215    # Add a simple extras solely for the purpose of the cctests
216    'v8_extra_library_files': ['../test/cctest/test-extra.js'],
217    'v8_experimental_extra_library_files': ['../test/cctest/test-experimental-extra.js'],
218
219    # .gyp files or targets should set v8_code to 1 if they build V8 specific
220    # code, as opposed to external code.  This variable is used to control such
221    # things as the set of warnings to enable, and whether warnings are treated
222    # as errors.
223    'v8_code%': 0,
224
225    # Speeds up Debug builds:
226    # 0 - Compiler optimizations off (debuggable) (default). This may
227    #     be 5x slower than Release (or worse).
228    # 1 - Turn on optimizations and disable slow DCHECKs, but leave
229    #     V8_ENABLE_CHECKS and most other assertions enabled.  This may cause
230    #     some v8 tests to fail in the Debug configuration.  This roughly
231    #     matches the performance of a Release build and can be used by
232    #     embedders that need to build their own code as debug but don't want
233    #     or need a debug version of V8. This should produce near-release
234    #     speeds.
235    'v8_optimized_debug%': 0,
236
237    # Use external files for startup data blobs:
238    # the JS builtins sources and the start snapshot.
239    # Embedders that don't use standalone.gypi will need to add
240    # their own default value.
241    'v8_use_external_startup_data%': 1,
242
243    # Relative path to icu.gyp from this file.
244    'icu_gyp_path': '../third_party/icu/icu.gyp',
245
246    # Relative path to inspector.gyp from this file.
247    'inspector_gyp_path': '../src/v8-inspector/inspector.gyp',
248
249    'conditions': [
250      ['(v8_target_arch=="arm" and host_arch!="arm") or \
251        (v8_target_arch=="arm64" and host_arch!="arm64") or \
252        (v8_target_arch=="mipsel" and host_arch!="mipsel") or \
253        (v8_target_arch=="mips64el" and host_arch!="mips64el") or \
254        (v8_target_arch=="x64" and host_arch!="x64") or \
255        (OS=="android" or OS=="qnx")', {
256        'want_separate_host_toolset': 1,
257      }, {
258        'want_separate_host_toolset': 0,
259      }],
260      ['(v8_target_arch=="arm" and host_arch!="arm") or \
261        (v8_target_arch=="arm64" and host_arch!="arm64") or \
262        (v8_target_arch=="mipsel" and host_arch!="mipsel") or \
263        (v8_target_arch=="mips64el" and host_arch!="mips64el") or \
264        (v8_target_arch=="mips" and host_arch!="mips") or \
265        (v8_target_arch=="mips64" and host_arch!="mips64") or \
266        (v8_target_arch=="x64" and host_arch!="x64") or \
267        (OS=="android" or OS=="qnx")', {
268        'want_separate_host_toolset_mkpeephole': 1,
269      }, {
270        'want_separate_host_toolset_mkpeephole': 0,
271      }],
272      ['OS == "win"', {
273        'os_posix%': 0,
274      }, {
275        'os_posix%': 1,
276      }],
277      ['OS=="win" and use_goma==1', {
278        # goma doesn't support pch yet.
279        'chromium_win_pch': 0,
280        # goma doesn't support PDB yet.
281        'fastbuild%': 1,
282      }],
283      ['((v8_target_arch=="ia32" or v8_target_arch=="x64" or v8_target_arch=="x87") and \
284        (OS=="linux" or OS=="mac")) or (v8_target_arch=="ppc64" and OS=="linux")', {
285        'v8_enable_gdbjit%': 1,
286      }, {
287        'v8_enable_gdbjit%': 0,
288      }],
289      ['(OS=="linux" or OS=="mac") and (target_arch=="ia32" or target_arch=="x64") and \
290        (v8_target_arch!="x87" and v8_target_arch!="x32")', {
291        'clang%': 1,
292      }, {
293        'clang%': 0,
294      }],
295      ['asan==1 or lsan==1 or msan==1 or tsan==1', {
296        'clang%': 1,
297        'use_allocator%': 'none',
298      }],
299      ['asan==1 and OS=="linux"', {
300        'use_custom_libcxx%': 1,
301      }],
302      ['tsan==1', {
303        'use_custom_libcxx%': 1,
304      }],
305      ['msan==1', {
306        # Use a just-built, MSan-instrumented libc++ instead of the system-wide
307        # libstdc++. This is required to avoid false positive reports whenever
308        # the C++ standard library is used.
309        'use_custom_libcxx%': 1,
310      }],
311      ['cfi_vptr==1', {
312        'use_lto%': 1,
313      }],
314      ['OS=="android"', {
315        # Location of Android NDK.
316        'variables': {
317          'variables': {
318            # The Android toolchain needs to use the absolute path to the NDK
319            # because it is used at different levels in the GYP files.
320            'android_ndk_root%': '<(base_dir)/third_party/android_tools/ndk/',
321            'android_host_arch%': "<!(uname -m | sed -e 's/i[3456]86/x86/')",
322            # Version of the NDK. Used to ensure full rebuilds on NDK rolls.
323            'android_ndk_version%': 'r12b',
324            'host_os%': "<!(uname -s | sed -e 's/Linux/linux/;s/Darwin/mac/')",
325            'os_folder_name%': "<!(uname -s | sed -e 's/Linux/linux/;s/Darwin/darwin/')",
326          },
327
328          # Copy conditionally-set variables out one scope.
329          'android_ndk_root%': '<(android_ndk_root)',
330          'android_ndk_version%': '<(android_ndk_version)',
331          'host_os%': '<(host_os)',
332          'os_folder_name%': '<(os_folder_name)',
333
334          'conditions': [
335            ['target_arch == "ia32"', {
336              'android_toolchain%': '<(android_ndk_root)/toolchains/x86-4.9/prebuilt/<(os_folder_name)-<(android_host_arch)/bin',
337              'android_target_arch%': 'x86',
338              'android_target_platform%': '16',
339              'arm_version%': 'default',
340            }],
341            ['target_arch == "x64"', {
342              'android_toolchain%': '<(android_ndk_root)/toolchains/x86_64-4.9/prebuilt/<(os_folder_name)-<(android_host_arch)/bin',
343              'android_target_arch%': 'x86_64',
344              'android_target_platform%': '21',
345              'arm_version%': 'default',
346            }],
347            ['target_arch=="arm"', {
348              'android_toolchain%': '<(android_ndk_root)/toolchains/arm-linux-androideabi-4.9/prebuilt/<(os_folder_name)-<(android_host_arch)/bin',
349              'android_target_arch%': 'arm',
350              'android_target_platform%': '16',
351              'arm_version%': 7,
352            }],
353            ['target_arch == "arm64"', {
354              'android_toolchain%': '<(android_ndk_root)/toolchains/aarch64-linux-android-4.9/prebuilt/<(os_folder_name)-<(android_host_arch)/bin',
355              'android_target_arch%': 'arm64',
356              'android_target_platform%': '21',
357              'arm_version%': 'default',
358            }],
359            ['target_arch == "mipsel"', {
360              'android_toolchain%': '<(android_ndk_root)/toolchains/mipsel-linux-android-4.9/prebuilt/<(os_folder_name)-<(android_host_arch)/bin',
361              'android_target_arch%': 'mips',
362              'android_target_platform%': '16',
363              'arm_version%': 'default',
364            }],
365            ['target_arch == "mips64el"', {
366              'android_toolchain%': '<(android_ndk_root)/toolchains/mips64el-linux-android-4.9/prebuilt/<(os_folder_name)-<(android_host_arch)/bin',
367              'android_target_arch%': 'mips64',
368              'android_target_platform%': '21',
369              'arm_version%': 'default',
370            }],
371          ],
372        },
373
374        # Copy conditionally-set variables out one scope.
375        'android_ndk_version%': '<(android_ndk_version)',
376        'android_target_arch%': '<(android_target_arch)',
377        'android_target_platform%': '<(android_target_platform)',
378        'android_toolchain%': '<(android_toolchain)',
379        'arm_version%': '<(arm_version)',
380        'host_os%': '<(host_os)',
381
382        # Print to stdout on Android.
383        'v8_android_log_stdout%': 1,
384
385        'conditions': [
386          ['android_ndk_root==""', {
387            'variables': {
388              'android_sysroot': '<(android_toolchain)/sysroot/',
389              'android_stl': '<(android_toolchain)/sources/cxx-stl/',
390            },
391            'conditions': [
392              ['target_arch=="x64"', {
393                'android_lib': '<(android_sysroot)/usr/lib64',
394              }, {
395                'android_lib': '<(android_sysroot)/usr/lib',
396              }],
397            ],
398            'android_libcpp_include': '<(android_stl)/llvm-libc++/libcxx/include',
399            'android_libcpp_abi_include': '<(android_stl)/llvm-libc++abi/libcxxabi/include',
400            'android_libcpp_libs': '<(android_stl)/llvm-libc++/libs',
401            'android_support_include': '<(android_toolchain)/sources/android/support/include',
402            'android_sysroot': '<(android_sysroot)',
403          }, {
404            'variables': {
405              'android_sysroot': '<(android_ndk_root)/platforms/android-<(android_target_platform)/arch-<(android_target_arch)',
406              'android_stl': '<(android_ndk_root)/sources/cxx-stl/',
407            },
408            'conditions': [
409              ['target_arch=="x64"', {
410                'android_lib': '<(android_sysroot)/usr/lib64',
411              }, {
412                'android_lib': '<(android_sysroot)/usr/lib',
413              }],
414            ],
415            'android_libcpp_include': '<(android_stl)/llvm-libc++/libcxx/include',
416            'android_libcpp_abi_include': '<(android_stl)/llvm-libc++abi/libcxxabi/include',
417            'android_libcpp_libs': '<(android_stl)/llvm-libc++/libs',
418            'android_support_include': '<(android_ndk_root)/sources/android/support/include',
419            'android_sysroot': '<(android_sysroot)',
420          }],
421        ],
422        'android_libcpp_library': 'c++_static',
423      }],  # OS=="android"
424      ['host_clang==1', {
425        'conditions':[
426          ['OS=="android"', {
427            'host_ld': '<!(which ld)',
428            'host_ranlib': '<!(which ranlib)',
429          }],
430        ],
431        'host_cc': '<(clang_dir)/bin/clang',
432        'host_cxx': '<(clang_dir)/bin/clang++',
433      }, {
434        'host_cc': '<!(which gcc)',
435        'host_cxx': '<!(which g++)',
436      }],
437    ],
438    # Default ARM variable settings.
439    'arm_version%': 'default',
440    'arm_fpu%': 'vfpv3',
441    'arm_float_abi%': 'default',
442    'arm_thumb': 'default',
443
444    # Default MIPS variable settings.
445    'mips_arch_variant%': 'r2',
446    # Possible values fp32, fp64, fpxx.
447    # fp32 - 32 32-bit FPU registers are available, doubles are placed in
448    #        register pairs.
449    # fp64 - 32 64-bit FPU registers are available.
450    # fpxx - compatibility mode, it chooses fp32 or fp64 depending on runtime
451    #        detection
452    'mips_fpu_mode%': 'fp32',
453  },
454  'target_defaults': {
455    'variables': {
456      'v8_code%': '<(v8_code)',
457      'clang_warning_flags': [
458        '-Wsign-compare',
459        # TODO(thakis): https://crbug.com/604888
460        '-Wno-undefined-var-template',
461        # TODO(yangguo): issue 5258
462        '-Wno-nonportable-include-path',
463      ],
464      'conditions':[
465        ['OS=="android"', {
466          'host_os%': '<(host_os)',
467        }],
468      ],
469    },
470    'includes': [ 'set_clang_warning_flags.gypi', ],
471    'default_configuration': 'Debug',
472    'configurations': {
473      'DebugBaseCommon': {
474        'conditions': [
475          ['OS=="aix"', {
476            'cflags': [ '-g', '-Og', '-gxcoff' ],
477          }, {
478            'cflags': [ '-g', '-O0' ],
479          }],
480        ],
481      },
482      'Optdebug': {
483        'inherit_from': [ 'DebugBaseCommon', 'DebugBase1' ],
484      },
485      'Debug': {
486        # Xcode insists on this empty entry.
487      },
488      'Release': {
489        'cflags+': ['<@(release_extra_cflags)'],
490      },
491      'conditions': [
492        ['OS=="win"', {
493          'Optdebug_x64': {
494            'inherit_from': ['Optdebug'],
495          },
496          'Debug_x64': {
497            'inherit_from': ['Debug'],
498          },
499          'Release_x64': {
500            'inherit_from': ['Release'],
501          },
502        }],
503      ],
504    },
505    'conditions':[
506      ['clang==0', {
507        'cflags+': [
508          '-Wno-uninitialized',
509        ],
510      }],
511      ['clang==1 or host_clang==1', {
512        # This is here so that all files get recompiled after a clang roll and
513        # when turning clang on or off.
514        # (defines are passed via the command line, and build systems rebuild
515        # things when their commandline changes). Nothing should ever read this
516        # define.
517        'defines': ['CR_CLANG_REVISION=<!(python <(DEPTH)/tools/clang/scripts/update.py --print-revision)'],
518      }],
519      ['clang==1 and target_arch=="ia32"', {
520        'cflags': ['-mstack-alignment=16', '-mstackrealign'],
521      }],
522      ['fastbuild!=0', {
523        'conditions': [
524          ['OS=="win" and fastbuild==1', {
525            'msvs_settings': {
526              'VCLinkerTool': {
527                # This tells the linker to generate .pdbs, so that
528                # we can get meaningful stack traces.
529                'GenerateDebugInformation': 'true',
530              },
531              'VCCLCompilerTool': {
532                # No debug info to be generated by compiler.
533                'DebugInformationFormat': '0',
534              },
535            },
536          }],
537        ],
538      }],  # fastbuild!=0
539    ],
540    'target_conditions': [
541      ['v8_code == 0', {
542        'defines!': [
543          'DEBUG',
544        ],
545        'conditions': [
546          ['os_posix == 1 and OS != "mac"', {
547            # We don't want to get warnings from third-party code,
548            # so remove any existing warning-enabling flags like -Wall.
549            'cflags!': [
550              '-pedantic',
551              '-Wall',
552              '-Werror',
553              '-Wextra',
554              '-Wshorten-64-to-32',
555            ],
556            'cflags+': [
557              # Clang considers the `register` keyword as deprecated, but
558              # ICU uses it all over the place.
559              '-Wno-deprecated-register',
560              # ICU uses its own deprecated functions.
561              '-Wno-deprecated-declarations',
562              # ICU prefers `a && b || c` over `(a && b) || c`.
563              '-Wno-logical-op-parentheses',
564              # ICU has some `unsigned < 0` checks.
565              '-Wno-tautological-compare',
566              # uresdata.c has switch(RES_GET_TYPE(x)) code. The
567              # RES_GET_TYPE macro returns an UResType enum, but some switch
568              # statement contains case values that aren't part of that
569              # enum (e.g. URES_TABLE32 which is in UResInternalType). This
570              # is on purpose.
571              '-Wno-switch',
572            ],
573            'cflags_cc!': [
574              '-Wnon-virtual-dtor',
575            ],
576          }],
577          ['OS == "mac"', {
578            'xcode_settings': {
579              'GCC_TREAT_WARNINGS_AS_ERRORS': 'NO',    # -Werror
580            },
581          }],
582          ['OS == "win"', {
583            'msvs_settings': {
584              'VCCLCompilerTool': {
585                'WarnAsError': 'false',
586              },
587            },
588          }],
589        ],
590      }],
591    ],
592  },
593  'conditions': [
594    ['os_posix==1 and OS!="mac"', {
595      'target_defaults': {
596        'conditions': [
597          # Common options for AddressSanitizer, LeakSanitizer,
598          # ThreadSanitizer, MemorySanitizer and CFI builds.
599          ['asan==1 or lsan==1 or tsan==1 or msan==1 or cfi_vptr==1', {
600            'target_conditions': [
601              ['_toolset=="target"', {
602                'cflags': [
603                  '-fno-omit-frame-pointer',
604                  '-gline-tables-only',
605                ],
606                'cflags!': [
607                  '-fomit-frame-pointer',
608                ],
609              }],
610            ],
611          }],
612          ['asan==1', {
613            'target_conditions': [
614              ['_toolset=="target"', {
615                'cflags': [
616                  '-fsanitize=address',
617                ],
618                'ldflags': [
619                  '-fsanitize=address',
620                ],
621                'defines': [
622                  'ADDRESS_SANITIZER',
623                ],
624              }],
625            ],
626          }],
627          ['lsan==1', {
628            'target_conditions': [
629              ['_toolset=="target"', {
630                'cflags': [
631                  '-fsanitize=leak',
632                ],
633                'ldflags': [
634                  '-fsanitize=leak',
635                ],
636                'defines': [
637                  'LEAK_SANITIZER',
638                ],
639              }],
640            ],
641          }],
642          ['tsan==1', {
643            'target_conditions': [
644              ['_toolset=="target"', {
645                'cflags': [
646                  '-fsanitize=thread',
647                ],
648                'ldflags': [
649                  '-fsanitize=thread',
650                ],
651                'defines': [
652                  'THREAD_SANITIZER',
653                ],
654              }],
655            ],
656          }],
657          ['msan==1', {
658            'target_conditions': [
659              ['_toolset=="target"', {
660                'cflags': [
661                  '-fsanitize=memory',
662                  '-fsanitize-memory-track-origins=<(msan_track_origins)',
663                  '-fPIC',
664                ],
665                'ldflags': [
666                  '-fsanitize=memory',
667                  '-pie',
668                ],
669                'defines': [
670                  'MEMORY_SANITIZER',
671                ],
672              }],
673            ],
674          }],
675          ['use_prebuilt_instrumented_libraries==1', {
676            'dependencies': [
677              '<(DEPTH)/third_party/instrumented_libraries/instrumented_libraries.gyp:prebuilt_instrumented_libraries',
678            ],
679          }],
680          ['use_custom_libcxx==1', {
681            'dependencies': [
682              '<(DEPTH)/buildtools/third_party/libc++/libc++.gyp:libcxx_proxy',
683            ],
684          }],
685          ['sanitizer_coverage!=0', {
686            'target_conditions': [
687              ['_toolset=="target"', {
688                'cflags': [
689                  '-fsanitize-coverage=<(sanitizer_coverage)',
690                ],
691                'defines': [
692                  'SANITIZER_COVERAGE',
693                ],
694              }],
695            ],
696          }],
697          ['linux_use_bundled_gold==1 and not (clang==0 and use_lto==1)', {
698            # Put our binutils, which contains gold in the search path. We pass
699            # the path to gold to the compiler. gyp leaves unspecified what the
700            # cwd is when running the compiler, so the normal gyp path-munging
701            # fails us. This hack gets the right path.
702            #
703            # Disabled when using GCC LTO because GCC also uses the -B search
704            # path at link time to find "as", and our bundled "as" can only
705            # target x86.
706            'ldflags': [
707              # Note, Chromium allows ia32 host arch as well, we limit this to
708              # x64 in v8.
709              '-B<(base_dir)/third_party/binutils/Linux_x64/Release/bin',
710            ],
711          }],
712          ['sysroot!="" and clang==1', {
713            'target_conditions': [
714              ['_toolset=="target"', {
715                'cflags': [
716                  '--sysroot=<(sysroot)',
717                ],
718                'ldflags': [
719                  '--sysroot=<(sysroot)',
720                  '<!(<(DEPTH)/build/linux/sysroot_ld_path.sh <(sysroot))',
721                ],
722              }]]
723          }],
724        ],
725      },
726    }],
727    ['OS=="mac"', {
728      'target_defaults': {
729       'conditions': [
730          ['asan==1', {
731            'xcode_settings': {
732              # FIXME(machenbach): This is outdated compared to common.gypi.
733              'OTHER_CFLAGS+': [
734                '-fno-omit-frame-pointer',
735                '-gline-tables-only',
736                '-fsanitize=address',
737                '-w',  # http://crbug.com/162783
738              ],
739              'OTHER_CFLAGS!': [
740                '-fomit-frame-pointer',
741              ],
742              'defines': [
743                'ADDRESS_SANITIZER',
744              ],
745            },
746            'dependencies': [
747              '<(DEPTH)/gypfiles/mac/asan.gyp:asan_dynamic_runtime',
748            ],
749            'target_conditions': [
750              ['_type!="static_library"', {
751                'xcode_settings': {'OTHER_LDFLAGS': ['-fsanitize=address']},
752              }],
753            ],
754          }],
755          ['sanitizer_coverage!=0', {
756            'target_conditions': [
757              ['_toolset=="target"', {
758                'cflags': [
759                  '-fsanitize-coverage=<(sanitizer_coverage)',
760                ],
761                'defines': [
762                  'SANITIZER_COVERAGE',
763                ],
764              }],
765            ],
766          }],
767        ],
768      },  # target_defaults
769    }],  # OS=="mac"
770    ['OS=="linux" or OS=="freebsd" or OS=="openbsd" or OS=="solaris" \
771       or OS=="netbsd" or OS=="aix"', {
772      'target_defaults': {
773        'cflags': [
774          '-Wall',
775          '<(werror)',
776          '-Wno-unused-parameter',
777          '-pthread',
778          '-pedantic',
779          '-Wmissing-field-initializers',
780          '-Wno-gnu-zero-variadic-macro-arguments',
781        ],
782        'cflags_cc': [
783          '-Wnon-virtual-dtor',
784          '-fno-exceptions',
785          '-fno-rtti',
786          '-std=gnu++11',
787        ],
788        'ldflags': [ '-pthread', ],
789        'conditions': [
790          # Don't warn about TRACE_EVENT_* macros with zero arguments passed to
791          # ##__VA_ARGS__. C99 strict mode prohibits having zero variadic macro
792          # arguments in gcc.
793          [ 'clang==0', {
794            'cflags!' : [
795              '-pedantic' ,
796              # Don't warn about unrecognized command line option.
797              '-Wno-gnu-zero-variadic-macro-arguments',
798            ],
799          }],
800          [ 'clang==1 and (v8_target_arch=="x64" or v8_target_arch=="arm64" \
801            or v8_target_arch=="mips64el")', {
802            'cflags': [ '-Wshorten-64-to-32' ],
803          }],
804          [ 'host_arch=="ppc64" and OS!="aix"', {
805            'cflags': [ '-mminimal-toc' ],
806          }],
807          [ 'visibility=="hidden" and v8_enable_backtrace==0', {
808            'cflags': [ '-fvisibility=hidden' ],
809          }],
810          [ 'component=="shared_library"', {
811            'cflags': [ '-fPIC', ],
812          }],
813          [ 'clang==0 and coverage==1', {
814            'cflags': [ '-fprofile-arcs', '-ftest-coverage'],
815            'ldflags': [ '-fprofile-arcs'],
816          }],
817        ],
818      },
819    }],
820    # 'OS=="linux" or OS=="freebsd" or OS=="openbsd" or OS=="solaris"
821    #  or OS=="netbsd"'
822    ['OS=="qnx"', {
823      'target_defaults': {
824        'cflags': [
825          '-Wall',
826          '<(werror)',
827          '-Wno-unused-parameter',
828          # Don't warn about the "struct foo f = {0};" initialization pattern.
829          '-Wno-missing-field-initializers',
830          '-Wno-gnu-zero-variadic-macro-arguments',
831        ],
832        'cflags_cc': [
833          '-Wnon-virtual-dtor',
834          '-fno-exceptions',
835          '-fno-rtti',
836          '-std=gnu++11',
837        ],
838        'conditions': [
839          [ 'visibility=="hidden"', {
840            'cflags': [ '-fvisibility=hidden' ],
841          }],
842          [ 'component=="shared_library"', {
843            'cflags': [ '-fPIC' ],
844          }],
845        ],
846        'target_conditions': [
847          [ '_toolset=="host" and host_os=="linux"', {
848            'cflags': [ '-pthread' ],
849            'ldflags': [ '-pthread' ],
850            'libraries': [ '-lrt' ],
851          }],
852          [ '_toolset=="target"', {
853            'cflags': [ '-Wno-psabi' ],
854            'libraries': [ '-lbacktrace', '-lsocket', '-lm' ],
855          }],
856        ],
857      },
858    }],  # OS=="qnx"
859    ['OS=="win"', {
860      'target_defaults': {
861        'defines': [
862          '_CRT_SECURE_NO_DEPRECATE',
863          '_CRT_NONSTDC_NO_DEPRECATE',
864          '_USING_V110_SDK71_',
865        ],
866        'conditions': [
867          ['component=="static_library"', {
868            'defines': [
869              '_HAS_EXCEPTIONS=0',
870            ],
871          }],
872        ],
873        'msvs_cygwin_dirs': ['<(DEPTH)/third_party/cygwin'],
874        'msvs_disabled_warnings': [
875          # C4091: 'typedef ': ignored on left of 'X' when no variable is
876          #                    declared.
877          # This happens in a number of Windows headers. Dumb.
878          4091,
879
880          # C4127: conditional expression is constant
881          # This warning can in theory catch dead code and other problems, but
882          # triggers in far too many desirable cases where the conditional
883          # expression is either set by macros or corresponds some legitimate
884          # compile-time constant expression (due to constant template args,
885          # conditionals comparing the sizes of different types, etc.).  Some of
886          # these can be worked around, but it's not worth it.
887          4127,
888
889          # C4351: new behavior: elements of array 'array' will be default
890          #        initialized
891          # This is a silly "warning" that basically just alerts you that the
892          # compiler is going to actually follow the language spec like it's
893          # supposed to, instead of not following it like old buggy versions
894          # did.  There's absolutely no reason to turn this on.
895          4351,
896
897          # C4355: 'this': used in base member initializer list
898          # It's commonly useful to pass |this| to objects in a class'
899          # initializer list.  While this warning can catch real bugs, most of
900          # the time the constructors in question don't attempt to call methods
901          # on the passed-in pointer (until later), and annotating every legit
902          # usage of this is simply more hassle than the warning is worth.
903          4355,
904
905          # C4503: 'identifier': decorated name length exceeded, name was
906          #        truncated
907          # This only means that some long error messages might have truncated
908          # identifiers in the presence of lots of templates.  It has no effect
909          # on program correctness and there's no real reason to waste time
910          # trying to prevent it.
911          4503,
912
913          # Warning C4589 says: "Constructor of abstract class ignores
914          # initializer for virtual base class." Disable this warning because it
915          # is flaky in VS 2015 RTM. It triggers on compiler generated
916          # copy-constructors in some cases.
917          4589,
918
919          # C4611: interaction between 'function' and C++ object destruction is
920          #        non-portable
921          # This warning is unavoidable when using e.g. setjmp/longjmp.  MSDN
922          # suggests using exceptions instead of setjmp/longjmp for C++, but
923          # Chromium code compiles without exception support.  We therefore have
924          # to use setjmp/longjmp for e.g. JPEG decode error handling, which
925          # means we have to turn off this warning (and be careful about how
926          # object destruction happens in such cases).
927          4611,
928
929          # TODO(jochen): These warnings are level 4. They will be slowly
930          # removed as code is fixed.
931          4100, # Unreferenced formal parameter
932          4121, # Alignment of a member was sensitive to packing
933          4244, # Conversion from 'type1' to 'type2', possible loss of data
934          4302, # Truncation from 'type 1' to 'type 2'
935          4309, # Truncation of constant value
936          4311, # Pointer truncation from 'type' to 'type'
937          4312, # Conversion from 'type1' to 'type2' of greater size
938          4505, # Unreferenced local function has been removed
939          4510, # Default constructor could not be generated
940          4512, # Assignment operator could not be generated
941          4610, # Object can never be instantiated
942          4800, # Forcing value to bool.
943          4838, # Narrowing conversion. Doesn't seem to be very useful.
944          4995, # 'X': name was marked as #pragma deprecated
945          4996, # 'X': was declared deprecated (for GetVersionEx).
946
947          # These are variable shadowing warnings that are new in VS2015. We
948          # should work through these at some point -- they may be removed from
949          # the RTM release in the /W4 set.
950          4456, 4457, 4458, 4459,
951        ],
952        'msvs_settings': {
953          'VCCLCompilerTool': {
954            'MinimalRebuild': 'false',
955            'BufferSecurityCheck': 'true',
956            'EnableFunctionLevelLinking': 'true',
957            'RuntimeTypeInfo': 'false',
958            'WarningLevel': '3',
959            'WarnAsError': 'true',
960            'DebugInformationFormat': '3',
961            'Detect64BitPortabilityProblems': 'false',
962            'conditions': [
963              [ 'msvs_multi_core_compile', {
964                'AdditionalOptions': ['/MP'],
965              }],
966              ['component=="shared_library"', {
967                'ExceptionHandling': '1',  # /EHsc
968              }, {
969                'ExceptionHandling': '0',
970              }],
971            ],
972          },
973          'VCLibrarianTool': {
974            'AdditionalOptions': ['/ignore:4221'],
975            'conditions': [
976              ['v8_target_arch=="x64"', {
977                'TargetMachine': '17',  # x64
978              }, {
979                'TargetMachine': '1',  # ia32
980              }],
981            ],
982          },
983          'VCLinkerTool': {
984            'AdditionalDependencies': [
985              'ws2_32.lib',
986            ],
987            'GenerateDebugInformation': 'true',
988            'MapFileName': '$(OutDir)\\$(TargetName).map',
989            'ImportLibrary': '$(OutDir)\\lib\\$(TargetName).lib',
990            'FixedBaseAddress': '1',
991            # LinkIncremental values:
992            #   0 == default
993            #   1 == /INCREMENTAL:NO
994            #   2 == /INCREMENTAL
995            'LinkIncremental': '1',
996            # SubSystem values:
997            #   0 == not set
998            #   1 == /SUBSYSTEM:CONSOLE
999            #   2 == /SUBSYSTEM:WINDOWS
1000            'SubSystem': '1',
1001
1002            'conditions': [
1003              ['v8_enable_i18n_support==1', {
1004                'AdditionalDependencies': [
1005                  'advapi32.lib',
1006                ],
1007              }],
1008              ['v8_target_arch=="x64"', {
1009                'MinimumRequiredVersion': '5.02',  # Server 2003.
1010                'TargetMachine': '17',  # x64
1011              }, {
1012                'MinimumRequiredVersion': '5.01',  # XP.
1013                'TargetMachine': '1',  # ia32
1014              }],
1015            ],
1016          },
1017          'conditions': [
1018            ['clang==1', {
1019              'VCCLCompilerTool': {
1020                'AdditionalOptions': [
1021                  # Don't warn about unused function parameters.
1022                  # (This is also used on other platforms.)
1023                  '-Wno-unused-parameter',
1024                  # Don't warn about the "struct foo f = {0};" initialization
1025                  # pattern.
1026                  '-Wno-missing-field-initializers',
1027
1028                  # TODO(hans): Make this list shorter eventually, http://crbug.com/504657
1029                  '-Qunused-arguments',  # http://crbug.com/504658
1030                  '-Wno-microsoft-enum-value',  # http://crbug.com/505296
1031                  '-Wno-unknown-pragmas',  # http://crbug.com/505314
1032                  '-Wno-microsoft-cast',  # http://crbug.com/550065
1033                ],
1034              },
1035            }],
1036            ['clang==1 and MSVS_VERSION == "2013"', {
1037              'VCCLCompilerTool': {
1038                'AdditionalOptions': [
1039                  '-fmsc-version=1800',
1040                ],
1041              },
1042            }],
1043            ['clang==1 and MSVS_VERSION == "2015"', {
1044              'VCCLCompilerTool': {
1045                'AdditionalOptions': [
1046                  '-fmsc-version=1900',
1047                ],
1048              },
1049            }],
1050          ],
1051        },
1052      },
1053    }],  # OS=="win"
1054    ['OS=="mac"', {
1055      'xcode_settings': {
1056        'SDKROOT': 'macosx',
1057        'SYMROOT': '<(DEPTH)/xcodebuild',
1058      },
1059      'target_defaults': {
1060        'xcode_settings': {
1061          'ALWAYS_SEARCH_USER_PATHS': 'NO',
1062          'GCC_C_LANGUAGE_STANDARD': 'c99',         # -std=c99
1063          'GCC_CW_ASM_SYNTAX': 'NO',                # No -fasm-blocks
1064          'GCC_DYNAMIC_NO_PIC': 'NO',               # No -mdynamic-no-pic
1065                                                    # (Equivalent to -fPIC)
1066          'GCC_ENABLE_CPP_EXCEPTIONS': 'NO',        # -fno-exceptions
1067          'GCC_ENABLE_CPP_RTTI': 'NO',              # -fno-rtti
1068          'GCC_ENABLE_PASCAL_STRINGS': 'NO',        # No -mpascal-strings
1069          # GCC_INLINES_ARE_PRIVATE_EXTERN maps to -fvisibility-inlines-hidden
1070          'GCC_INLINES_ARE_PRIVATE_EXTERN': 'YES',
1071          'GCC_SYMBOLS_PRIVATE_EXTERN': 'YES',      # -fvisibility=hidden
1072          'GCC_THREADSAFE_STATICS': 'NO',           # -fno-threadsafe-statics
1073          'GCC_WARN_NON_VIRTUAL_DESTRUCTOR': 'YES', # -Wnon-virtual-dtor
1074          # MACOSX_DEPLOYMENT_TARGET maps to -mmacosx-version-min
1075          'MACOSX_DEPLOYMENT_TARGET': '<(mac_deployment_target)',
1076          'PREBINDING': 'NO',                       # No -Wl,-prebind
1077          'SYMROOT': '<(DEPTH)/xcodebuild',
1078          'USE_HEADERMAP': 'NO',
1079          'OTHER_CFLAGS': [
1080            '-fno-strict-aliasing',
1081          ],
1082          'WARNING_CFLAGS': [
1083            '-Wall',
1084            '-Wendif-labels',
1085            '-Wno-unused-parameter',
1086            # Don't warn about the "struct foo f = {0};" initialization pattern.
1087            '-Wno-missing-field-initializers',
1088            '-Wno-gnu-zero-variadic-macro-arguments',
1089          ],
1090        },
1091        'conditions': [
1092          ['werror==""', {
1093            'xcode_settings': {'GCC_TREAT_WARNINGS_AS_ERRORS': 'NO'},
1094          }, {
1095            'xcode_settings': {'GCC_TREAT_WARNINGS_AS_ERRORS': 'YES'},
1096          }],
1097          ['clang==1', {
1098            'xcode_settings': {
1099              'GCC_VERSION': 'com.apple.compilers.llvm.clang.1_0',
1100              'CLANG_CXX_LANGUAGE_STANDARD': 'c++11',  # -std=c++11
1101            },
1102            'conditions': [
1103              ['clang_xcode==0', {
1104                'xcode_settings': {
1105                  'CC': '<(clang_dir)/bin/clang',
1106                  'LDPLUSPLUS': '<(clang_dir)/bin/clang++',
1107                  'CLANG_CXX_LIBRARY': 'libc++'
1108                },
1109              }],
1110              ['v8_target_arch=="x64" or v8_target_arch=="arm64" \
1111                or v8_target_arch=="mips64el"', {
1112                'xcode_settings': {'WARNING_CFLAGS': ['-Wshorten-64-to-32']},
1113              }],
1114            ],
1115          }],
1116        ],
1117        'target_conditions': [
1118          ['_type!="static_library"', {
1119            'xcode_settings': {'OTHER_LDFLAGS': ['-Wl,-search_paths_first']},
1120          }],
1121        ],  # target_conditions
1122      },  # target_defaults
1123    }],  # OS=="mac"
1124    ['OS=="android"', {
1125      'target_defaults': {
1126        'defines': [
1127          'ANDROID',
1128        ],
1129        'configurations': {
1130          'Release': {
1131            'cflags': [
1132              '-fomit-frame-pointer',
1133            ],
1134          },  # Release
1135        },  # configurations
1136        'cflags': [ '-Wno-abi', '-Wall', '-W', '-Wno-unused-parameter'],
1137        'cflags_cc': [ '-Wnon-virtual-dtor', '-fno-rtti', '-fno-exceptions',
1138                       '-std=gnu++11' ],
1139        'target_conditions': [
1140          ['_toolset=="target"', {
1141            'cflags!': [
1142              '-pthread',  # Not supported by Android toolchain.
1143            ],
1144            'cflags': [
1145              '-ffunction-sections',
1146              '-funwind-tables',
1147              '-fstack-protector',
1148              '-fno-short-enums',
1149              '-finline-limit=64',
1150              '-Wa,--noexecstack',
1151              '--sysroot=<(android_sysroot)',
1152            ],
1153            'cflags_cc': [
1154              '-isystem<(android_libcpp_include)',
1155              '-isystem<(android_libcpp_abi_include)',
1156              '-isystem<(android_support_include)',
1157            ],
1158            'defines': [
1159              'ANDROID',
1160              #'__GNU_SOURCE=1',  # Necessary for clone()
1161              'HAVE_OFF64_T',
1162              'HAVE_SYS_UIO_H',
1163              'ANDROID_BINSIZE_HACK', # Enable temporary hacks to reduce binsize.
1164              'ANDROID_NDK_VERSION=<(android_ndk_version)',
1165            ],
1166            'ldflags!': [
1167              '-pthread',  # Not supported by Android toolchain.
1168            ],
1169            'ldflags': [
1170              '-Wl,--no-undefined',
1171              '--sysroot=<(android_sysroot)',
1172              '-nostdlib',
1173            ],
1174            'libraries!': [
1175                '-lrt',  # librt is built into Bionic.
1176                # Not supported by Android toolchain.
1177                # Where do these come from?  Can't find references in
1178                # any Chromium gyp or gypi file.  Maybe they come from
1179                # gyp itself?
1180                '-lpthread', '-lnss3', '-lnssutil3', '-lsmime3', '-lplds4', '-lplc4', '-lnspr4',
1181              ],
1182              'libraries': [
1183                '-l<(android_libcpp_library)',
1184                '-latomic',
1185                # Manually link the libgcc.a that the cross compiler uses.
1186                '<!(<(android_toolchain)/*-gcc -print-libgcc-file-name)',
1187                '-lc',
1188                '-ldl',
1189                '-lm',
1190            ],
1191            'conditions': [
1192              ['target_arch == "arm"', {
1193                'ldflags': [
1194                  # Enable identical code folding to reduce size.
1195                  '-Wl,--icf=safe',
1196                ],
1197              }],
1198              ['target_arch=="arm" and arm_version==7', {
1199                'cflags': [
1200                  '-march=armv7-a',
1201                  '-mtune=cortex-a8',
1202                  '-mfpu=vfp3',
1203                ],
1204                'ldflags': [
1205                  '-L<(android_libcpp_libs)/armeabi-v7a',
1206                ],
1207              }],
1208              ['target_arch=="arm" and arm_version < 7', {
1209                'ldflags': [
1210                  '-L<(android_libcpp_libs)/armeabi',
1211                ],
1212              }],
1213              ['target_arch=="x64"', {
1214                'ldflags': [
1215                  '-L<(android_libcpp_libs)/x86_64',
1216                ],
1217              }],
1218              ['target_arch=="arm64"', {
1219                'ldflags': [
1220                  '-L<(android_libcpp_libs)/arm64-v8a',
1221                ],
1222              }],
1223              ['target_arch=="ia32" or target_arch=="x87"', {
1224                # The x86 toolchain currently has problems with stack-protector.
1225                'cflags!': [
1226                  '-fstack-protector',
1227                ],
1228                'cflags': [
1229                  '-fno-stack-protector',
1230                ],
1231                'ldflags': [
1232                  '-L<(android_libcpp_libs)/x86',
1233                ],
1234              }],
1235              ['target_arch=="mipsel"', {
1236                # The mips toolchain currently has problems with stack-protector.
1237                'cflags!': [
1238                  '-fstack-protector',
1239                  '-U__linux__'
1240                ],
1241                'cflags': [
1242                  '-fno-stack-protector',
1243                ],
1244                'ldflags': [
1245                  '-L<(android_libcpp_libs)/mips',
1246                ],
1247              }],
1248              ['(target_arch=="arm" or target_arch=="arm64" or target_arch=="x64" or target_arch=="ia32") and component!="shared_library"', {
1249                'cflags': [
1250                  '-fPIE',
1251                ],
1252                'ldflags': [
1253                  '-pie',
1254                ],
1255              }],
1256            ],
1257            'target_conditions': [
1258              ['_type=="executable"', {
1259                'conditions': [
1260                  ['target_arch=="arm64" or target_arch=="x64"', {
1261                    'ldflags': [
1262                      '-Wl,-dynamic-linker,/system/bin/linker64',
1263                    ],
1264                  }, {
1265                    'ldflags': [
1266                      '-Wl,-dynamic-linker,/system/bin/linker',
1267                    ],
1268                  }]
1269                ],
1270                'ldflags': [
1271                  '-Bdynamic',
1272                  '-Wl,-z,nocopyreloc',
1273                  # crtbegin_dynamic.o should be the last item in ldflags.
1274                  '<(android_lib)/crtbegin_dynamic.o',
1275                ],
1276                'libraries': [
1277                  # crtend_android.o needs to be the last item in libraries.
1278                  # Do not add any libraries after this!
1279                  '<(android_lib)/crtend_android.o',
1280                ],
1281              }],
1282              ['_type=="shared_library"', {
1283                'ldflags': [
1284                  '-Wl,-shared,-Bsymbolic',
1285                  '<(android_lib)/crtbegin_so.o',
1286                ],
1287              }],
1288              ['_type=="static_library"', {
1289                'ldflags': [
1290                  # Don't export symbols from statically linked libraries.
1291                  '-Wl,--exclude-libs=ALL',
1292                ],
1293              }],
1294            ],
1295          }],  # _toolset=="target"
1296          # Settings for building host targets using the system toolchain.
1297          ['_toolset=="host"', {
1298            'cflags': [ '-pthread' ],
1299            'ldflags': [ '-pthread' ],
1300            'ldflags!': [
1301              '-Wl,-z,noexecstack',
1302              '-Wl,--gc-sections',
1303              '-Wl,-O1',
1304              '-Wl,--as-needed',
1305            ],
1306          }],
1307        ],  # target_conditions
1308      },  # target_defaults
1309    }],  # OS=="android"
1310    ['OS=="android" and clang==0', {
1311      # Hardcode the compiler names in the Makefile so that
1312      # it won't depend on the environment at make time.
1313      'make_global_settings': [
1314        ['LD', '<!(/bin/echo -n <(android_toolchain)/../*/bin/ld)'],
1315        ['RANLIB', '<!(/bin/echo -n <(android_toolchain)/../*/bin/ranlib)'],
1316        ['CC', '<!(/bin/echo -n <(android_toolchain)/*-gcc)'],
1317        ['CXX', '<!(/bin/echo -n <(android_toolchain)/*-g++)'],
1318        ['LD.host', '<(host_ld)'],
1319        ['RANLIB.host', '<(host_ranlib)'],
1320        ['CC.host', '<(host_cc)'],
1321        ['CXX.host', '<(host_cxx)'],
1322      ],
1323    }],
1324    ['clang!=1 and host_clang==1 and target_arch!="ia32" and target_arch!="x64"', {
1325      'make_global_settings': [
1326        ['CC.host', '<(clang_dir)/bin/clang'],
1327        ['CXX.host', '<(clang_dir)/bin/clang++'],
1328      ],
1329    }],
1330    ['clang==0 and host_clang==1 and target_arch!="ia32" and target_arch!="x64"', {
1331      'target_conditions': [
1332        ['_toolset=="host"', {
1333          'cflags_cc': [ '-std=gnu++11', ],
1334        }],
1335      ],
1336      'target_defaults': {
1337        'target_conditions': [
1338          ['_toolset=="host"', { 'cflags!': [ '-Wno-unused-local-typedefs' ]}],
1339        ],
1340      },
1341    }],
1342    ['clang==1 and "<(GENERATOR)"=="ninja"', {
1343      # See http://crbug.com/110262
1344      'target_defaults': {
1345        'cflags': [ '-fcolor-diagnostics' ],
1346        'xcode_settings': { 'OTHER_CFLAGS': [ '-fcolor-diagnostics' ] },
1347      },
1348    }],
1349    ['clang==1 and ((OS!="mac" and OS!="ios") or clang_xcode==0) '
1350        'and OS!="win" and "<(GENERATOR)"=="make"', {
1351      'make_global_settings': [
1352        ['CC', '<(clang_dir)/bin/clang'],
1353        ['CXX', '<(clang_dir)/bin/clang++'],
1354        ['CC.host', '$(CC)'],
1355        ['CXX.host', '$(CXX)'],
1356      ],
1357    }],
1358    ['clang==1 and ((OS!="mac" and OS!="ios") or clang_xcode==0) '
1359        'and OS!="win" and "<(GENERATOR)"=="ninja"', {
1360      'make_global_settings': [
1361        ['CC', '<(clang_dir)/bin/clang'],
1362        ['CXX', '<(clang_dir)/bin/clang++'],
1363        ['CC.host', '$(CC)'],
1364        ['CXX.host', '$(CXX)'],
1365      ],
1366    }],
1367    ['clang==1 and OS=="win"', {
1368      'make_global_settings': [
1369        # On Windows, gyp's ninja generator only looks at CC.
1370        ['CC', '<(clang_dir)/bin/clang-cl'],
1371      ],
1372    }],
1373    ['OS=="linux" and target_arch=="arm" and host_arch!="arm" and clang==0 and "<(GENERATOR)"=="ninja"', {
1374      # Set default ARM cross tools on linux.  These can be overridden
1375      # using CC,CXX,CC.host and CXX.host environment variables.
1376      'make_global_settings': [
1377        ['CC', '<!(which arm-linux-gnueabihf-gcc)'],
1378        ['CXX', '<!(which arm-linux-gnueabihf-g++)'],
1379        ['CC.host', '<(host_cc)'],
1380        ['CXX.host', '<(host_cxx)'],
1381      ],
1382    }],
1383    # TODO(yyanagisawa): supports GENERATOR==make
1384    #  make generator doesn't support CC_wrapper without CC
1385    #  in make_global_settings yet.
1386    ['use_goma==1 and ("<(GENERATOR)"=="ninja" or clang==1)', {
1387      'conditions': [
1388        ['coverage==1', {
1389          # Wrap goma with coverage wrapper.
1390          'make_global_settings': [
1391            ['CC_wrapper', '<(base_dir)/gypfiles/coverage_wrapper.py <(gomadir)/gomacc'],
1392            ['CXX_wrapper', '<(base_dir)/gypfiles/coverage_wrapper.py <(gomadir)/gomacc'],
1393            ['CC.host_wrapper', '<(base_dir)/gypfiles/coverage_wrapper.py <(gomadir)/gomacc'],
1394            ['CXX.host_wrapper', '<(base_dir)/gypfiles/coverage_wrapper.py <(gomadir)/gomacc'],
1395          ],
1396        }, {
1397          # Use only goma wrapper.
1398          'make_global_settings': [
1399            ['CC_wrapper', '<(gomadir)/gomacc'],
1400            ['CXX_wrapper', '<(gomadir)/gomacc'],
1401            ['CC.host_wrapper', '<(gomadir)/gomacc'],
1402            ['CXX.host_wrapper', '<(gomadir)/gomacc'],
1403          ],
1404        }],
1405      ],
1406    }, {
1407      'conditions': [
1408        ['coverage==1', {
1409          # Use only coverage wrapper.
1410          'make_global_settings': [
1411            ['CC_wrapper', '<(base_dir)/gypfiles/coverage_wrapper.py'],
1412            ['CXX_wrapper', '<(base_dir)/gypfiles/coverage_wrapper.py'],
1413            ['CC.host_wrapper', '<(base_dir)/gypfiles/coverage_wrapper.py'],
1414            ['CXX.host_wrapper', '<(base_dir)/gypfiles/coverage_wrapper.py'],
1415          ],
1416        }],
1417      ],
1418    }],
1419    ['use_lto==1', {
1420      'target_defaults': {
1421        'target_conditions': [
1422          ['_toolset=="target"', {
1423            'cflags': [
1424              '-flto',
1425            ],
1426          }],
1427        ],
1428      },
1429    }],
1430    ['use_lto==1 and clang==0', {
1431      'target_defaults': {
1432        'target_conditions': [
1433          ['_toolset=="target"', {
1434            'cflags': [
1435              '-ffat-lto-objects',
1436            ],
1437          }],
1438        ],
1439      },
1440    }],
1441    ['use_lto==1 and clang==1', {
1442      'target_defaults': {
1443        'target_conditions': [
1444          ['_toolset=="target"', {
1445            'arflags': [
1446              '--plugin', '<(clang_dir)/lib/LLVMgold.so',
1447            ],
1448            # Apply a lower optimization level with lto. Chromium does this
1449            # for non-official builds only - a differentiation that doesn't
1450            # exist in v8.
1451            'ldflags': [
1452              '-Wl,--plugin-opt,O1',
1453            ],
1454          }],
1455        ],
1456      },
1457    }],
1458    ['use_lto==1 and clang==0', {
1459      'target_defaults': {
1460        'target_conditions': [
1461          ['_toolset=="target"', {
1462            'ldflags': [
1463              '-flto=32',
1464            ],
1465          }],
1466        ],
1467      },
1468    }],
1469    ['use_lto==1 and clang==1', {
1470      'target_defaults': {
1471        'target_conditions': [
1472          ['_toolset=="target"', {
1473            'ldflags': [
1474              '-flto',
1475            ],
1476          }],
1477        ],
1478      },
1479    }],
1480    ['cfi_diag==1', {
1481      'target_defaults': {
1482        'target_conditions': [
1483          ['_toolset=="target"', {
1484            'cflags': [
1485              '-fno-sanitize-trap=cfi',
1486              '-fno-sanitize-recover=cfi',
1487            ],
1488            'cflags_cc!': [
1489              '-fno-rtti',
1490            ],
1491            'cflags!': [
1492              '-fno-rtti',
1493            ],
1494            'ldflags': [
1495              '-fno-sanitize-trap=cfi',
1496              '-fno-sanitize-recover=cfi',
1497            ],
1498          }],
1499        ],
1500      },
1501    }],
1502    ['cfi_vptr==1', {
1503      'target_defaults': {
1504        'target_conditions': [
1505          ['_toolset=="target"', {
1506            'cflags': [
1507              '-fsanitize=cfi-vcall',
1508              '-fsanitize=cfi-derived-cast',
1509              '-fsanitize=cfi-unrelated-cast',
1510              '-fsanitize-blacklist=<(cfi_blacklist)',
1511            ],
1512            'ldflags': [
1513              '-fsanitize=cfi-vcall',
1514              '-fsanitize=cfi-derived-cast',
1515              '-fsanitize=cfi-unrelated-cast',
1516            ],
1517          }],
1518        ],
1519      },
1520    }],
1521  ],
1522}
1523