Home | History | Annotate | Download | only in build
      1 # Copyright 2010 Google Inc. All rights reserved.
      2 #
      3 # Redistribution and use in source and binary forms, with or without
      4 # modification, are permitted provided that the following conditions are
      5 # met:
      6 #
      7 #     * Redistributions of source code must retain the above copyright
      8 # notice, this list of conditions and the following disclaimer.
      9 #     * Redistributions in binary form must reproduce the above
     10 # copyright notice, this list of conditions and the following disclaimer
     11 # in the documentation and/or other materials provided with the
     12 # distribution.
     13 #     * Neither the name of Google Inc. nor the names of its
     14 # contributors may be used to endorse or promote products derived from
     15 # this software without specific prior written permission.
     16 #
     17 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     18 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     19 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     20 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     21 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     22 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     23 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     24 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     25 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     26 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     27 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     28 
     29 # IMPORTANT:
     30 # Please don't directly include this file if you are building via gyp_chromium,
     31 # since gyp_chromium is automatically forcing its inclusion.
     32 {
     33   'variables': {
     34     # Variables expected to be overriden on the GYP command line (-D) or by
     35     # ~/.gyp/include.gypi.
     36 
     37     # Putting a variables dict inside another variables dict looks kind of
     38     # weird. This is necessary to get these variables defined for the conditions
     39     # within this variables dict that operate on these variables.
     40     'variables': {
     41       'variables': {
     42         # Compute the architecture that we're building on.
     43         'conditions': [
     44           [ 'OS=="linux" or OS=="freebsd" or OS=="openbsd"', {
     45             # This handles the Linux platforms we generally deal with. Anything
     46             # else gets passed through, which probably won't work very well; such
     47             # hosts should pass an explicit target_arch to gyp.
     48             'host_arch%':
     49               '<!(uname -m | sed -e "s/i.86/ia32/;s/x86_64/x64/;s/amd64/x64/;s/arm.*/arm/")',
     50           }, {  # OS!="linux"
     51             'host_arch%': 'ia32',
     52           }],
     53         ],
     54       },
     55 
     56       'host_arch%': '<(host_arch)',
     57 
     58       # Default architecture we're building for is the architecture we're
     59       # building on.
     60       'target_arch%': '<(host_arch)',
     61 
     62       # This variable tells WebCore.gyp and JavaScriptCore.gyp whether they are
     63       # are built under a chromium full build (1) or a webkit.org chromium
     64       # build (0).
     65       'inside_chromium_build%': 1,
     66 
     67       # Set to 1 compile with -fPIC cflag on linux. This is a must for shared
     68       # libraries on linux x86-64 and arm.
     69       'linux_fpic%': 0,
     70 
     71       # Python version.
     72       'python_ver%': '2.5',
     73 
     74       # Determine ARM compilation flags.
     75       'arm_version%': 7,
     76 
     77       # Set Neon compilation flags (only meaningful if arm_version==7).
     78       'arm_neon%': 1,
     79 
     80       # The system root for cross-compiles. Default: none.
     81       'sysroot%': '',
     82 
     83       # On Linux, we build with sse2 for Chromium builds.
     84       'disable_sse2%': 0,
     85     },
     86 
     87     'target_arch%': '<(target_arch)',
     88     'host_arch%': '<(host_arch)',
     89     'inside_chromium_build%': '<(inside_chromium_build)',
     90     'linux_fpic%': '<(linux_fpic)',
     91     'python_ver%': '<(python_ver)',
     92     'arm_version%': '<(arm_version)',
     93     'arm_neon%': '<(arm_neon)',
     94     'sysroot%': '<(sysroot)',
     95     'disable_sse2%': '<(disable_sse2)',
     96 
     97     # The release channel that this build targets. This is used to restrict
     98     # channel-specific build options, like which installer packages to create.
     99     # The default is 'all', which does no channel-specific filtering.
    100     'channel%': 'all',
    101 
    102     # Override chromium_mac_pch and set it to 0 to suppress the use of
    103     # precompiled headers on the Mac.  Prefix header injection may still be
    104     # used, but prefix headers will not be precompiled.  This is useful when
    105     # using distcc to distribute a build to compile slaves that don't
    106     # share the same compiler executable as the system driving the compilation,
    107     # because precompiled headers rely on pointers into a specific compiler
    108     # executable's image.  Setting this to 0 is needed to use an experimental
    109     # Linux-Mac cross compiler distcc farm.
    110     'chromium_mac_pch%': 1,
    111 
    112     # Mac OS X SDK and deployment target support.
    113     # The SDK identifies the version of the system headers that will be used,
    114     # and corresponds to the MAC_OS_X_VERSION_MAX_ALLOWED compile-time macro.
    115     # "Maximum allowed" refers to the operating system version whose APIs are
    116     # available in the headers.
    117     # The deployment target identifies the minimum system version that the
    118     # built products are expected to function on.  It corresponds to the
    119     # MAC_OS_X_VERSION_MIN_REQUIRED compile-time macro.
    120     # To ensure these macros are available, #include <AvailabilityMacros.h>.
    121     # Additional documentation on these macros is available at
    122     # http://developer.apple.com/mac/library/technotes/tn2002/tn2064.html#SECTION3
    123     # Chrome normally builds with the Mac OS X 10.5 SDK and sets the
    124     # deployment target to 10.5.  Other projects, such as O3D, may override
    125     # these defaults.
    126     'mac_sdk%': '10.5',
    127     'mac_deployment_target%': '10.5',
    128 
    129     # Set to 1 to enable code coverage.  In addition to build changes
    130     # (e.g. extra CFLAGS), also creates a new target in the src/chrome
    131     # project file called "coverage".
    132     # Currently ignored on Windows.
    133     'coverage%': 0,
    134 
    135     # Although base/allocator lets you select a heap library via an
    136     # environment variable, the libcmt shim it uses sometimes gets in
    137     # the way.  To disable it entirely, and switch to normal msvcrt, do e.g.
    138     #  'win_use_allocator_shim': 0,
    139     #  'win_release_RuntimeLibrary': 2
    140     # to ~/.gyp/include.gypi, gclient runhooks --force, and do a release build.
    141     'win_use_allocator_shim%': 1, # 0 = shim allocator via libcmt; 1 = msvcrt
    142 
    143     # Whether usage of OpenMAX is enabled.
    144     'enable_openmax%': 0,
    145 
    146     # TODO(bradnelson): eliminate this when possible.
    147     # To allow local gyp files to prevent release.vsprops from being included.
    148     # Yes(1) means include release.vsprops.
    149     # Once all vsprops settings are migrated into gyp, this can go away.
    150     'msvs_use_common_release%': 1,
    151 
    152     # TODO(bradnelson): eliminate this when possible.
    153     # To allow local gyp files to override additional linker options for msvs.
    154     # Yes(1) means set use the common linker options.
    155     'msvs_use_common_linker_extras%': 1,
    156 
    157     # TODO(sgk): eliminate this if possible.
    158     # It would be nicer to support this via a setting in 'target_defaults'
    159     # in chrome/app/locales/locales.gypi overriding the setting in the
    160     # 'Debug' configuration in the 'target_defaults' dict below,
    161     # but that doesn't work as we'd like.
    162     'msvs_debug_link_incremental%': '2',
    163 
    164     # This is the location of the sandbox binary. Chrome looks for this before
    165     # running the zygote process. If found, and SUID, it will be used to
    166     # sandbox the zygote process and, thus, all renderer processes.
    167     'linux_sandbox_path%': '',
    168 
    169     # Set this to true to enable SELinux support.
    170     'selinux%': 0,
    171 
    172     # Strip the binary after dumping symbols.
    173     'linux_strip_binary%': 0,
    174 
    175     # Enable TCMalloc.
    176     'linux_use_tcmalloc%': 1,
    177 
    178     # Disable TCMalloc's debugallocation.
    179     'linux_use_debugallocation%': 0,
    180 
    181     # Disable TCMalloc's heapchecker.
    182     'linux_use_heapchecker%': 0,
    183 
    184     # Set to 1 to turn on seccomp sandbox by default.
    185     # (Note: this is ignored for official builds.)
    186     'linux_use_seccomp_sandbox%': 0,
    187 
    188     # Set to select the Title Case versions of strings in GRD files.
    189     'use_titlecase_in_grd%': 0,
    190 
    191     # Used to disable Native Client at compile time, for platforms where it
    192     # isn't supported
    193     'disable_nacl%': 0,
    194 
    195     # Set Thumb compilation flags.
    196     'arm_thumb%': 0,
    197 
    198     # Set ARM fpu compilation flags (only meaningful if arm_version==7 and
    199     # arm_neon==0).
    200     'arm_fpu%': 'vfpv3',
    201 
    202     # Enable new NPDevice API.
    203     'enable_new_npdevice_api%': 0,
    204 
    205     'conditions': [
    206       # Whether to use multiple cores to compile with visual studio. This is
    207       # optional because it sometimes causes corruption on VS 2005.
    208       # It is on by default on VS 2008 and off on VS 2005.
    209       ['OS=="win"', {
    210         'conditions': [
    211           ['MSVS_VERSION=="2005"', {
    212             'msvs_multi_core_compile%': 0,
    213           },{
    214             'msvs_multi_core_compile%': 1,
    215           }],
    216           # Don't do incremental linking for large modules on 32-bit.
    217           ['MSVS_OS_BITS==32', {
    218             'msvs_large_module_debug_link_mode%': '1',  # No
    219           },{
    220             'msvs_large_module_debug_link_mode%': '2',  # Yes
    221           }],
    222         ],
    223         'nacl_win64_defines': [
    224           # This flag is used to minimize dependencies when building
    225           # Native Client loader for 64-bit Windows.
    226           'NACL_WIN64',
    227         ],
    228       }],
    229     ],
    230 
    231     # NOTE: When these end up in the Mac bundle, we need to replace '-' for '_'
    232     # so Cocoa is happy (http://crbug.com/20441).
    233     'locales': [
    234       'am', 'ar', 'bg', 'bn', 'ca', 'cs', 'da', 'de', 'el', 'en-GB',
    235       'en-US', 'es-419', 'es', 'et', 'fi', 'fil', 'fr', 'gu', 'he',
    236       'hi', 'hr', 'hu', 'id', 'it', 'ja', 'kn', 'ko', 'lt', 'lv',
    237       'ml', 'mr', 'nb', 'nl', 'pl', 'pt-BR', 'pt-PT', 'ro', 'ru',
    238       'sk', 'sl', 'sr', 'sv', 'sw', 'ta', 'te', 'th', 'tr', 'uk',
    239       'vi', 'zh-CN', 'zh-TW',
    240     ],
    241   },
    242   'target_defaults': {
    243     'includes': [
    244       'filename_rules.gypi',
    245     ],
    246     'variables': {
    247       # See http://gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/Optimize-Options.html
    248       'mac_release_optimization%': '3', # Use -O3 unless overridden
    249       'mac_debug_optimization%': '0',   # Use -O0 unless overridden
    250       # See http://msdn.microsoft.com/en-us/library/aa652360(VS.71).aspx
    251       'win_release_Optimization%': '2', # 2 = /Os
    252       'win_debug_Optimization%': '0',   # 0 = /Od
    253       # See http://msdn.microsoft.com/en-us/library/aa652367(VS.71).aspx
    254       'win_release_RuntimeLibrary%': '0', # 0 = /MT (nondebug static)
    255       'win_debug_RuntimeLibrary%': '1',   # 1 = /MTd (debug static)
    256 
    257       'release_extra_cflags%': '',
    258       'debug_extra_cflags%': '',
    259       'release_valgrind_build%': 0,
    260     },
    261     'conditions': [
    262       ['selinux==1', {
    263         'defines': ['CHROMIUM_SELINUX=1'],
    264       }],
    265       ['win_use_allocator_shim==0', {
    266         'conditions': [
    267           ['OS=="win"', {
    268             'defines': ['NO_TCMALLOC'],
    269           }],
    270         ],
    271       }],
    272       ['coverage!=0', {
    273         'conditions': [
    274           ['OS=="mac"', {
    275             'xcode_settings': {
    276               'GCC_INSTRUMENT_PROGRAM_FLOW_ARCS': 'YES',  # -fprofile-arcs
    277               'GCC_GENERATE_TEST_COVERAGE_FILES': 'YES',  # -ftest-coverage
    278             },
    279             # Add -lgcov for types executable, shared_library, and
    280             # loadable_module; not for static_library.
    281             # This is a delayed conditional.
    282             'target_conditions': [
    283               ['_type!="static_library"', {
    284                 'xcode_settings': { 'OTHER_LDFLAGS': [ '-lgcov' ] },
    285               }],
    286             ],
    287           }],
    288           # Linux gyp (into scons) doesn't like target_conditions?
    289           # TODO(???): track down why 'target_conditions' doesn't work
    290           # on Linux gyp into scons like it does on Mac gyp into xcodeproj.
    291           ['OS=="linux"', {
    292             'cflags': [ '-ftest-coverage',
    293                         '-fprofile-arcs' ],
    294             'link_settings': { 'libraries': [ '-lgcov' ] },
    295           }],
    296           # Finally, for Windows, we simply turn on profiling.
    297           ['OS=="win"', {
    298             'msvs_settings': {
    299               'VCLinkerTool': {
    300                 'Profile': 'true',
    301               },
    302               'VCCLCompilerTool': {
    303                 # /Z7, not /Zi, so coverage is happyb
    304                 'DebugInformationFormat': '1',
    305                 'AdditionalOptions': ['/Yd'],
    306               }
    307             }
    308          }],  # OS==win
    309         ],  # conditions for coverage
    310       }],  # coverage!=0
    311     ],  # conditions for 'target_defaults'
    312     'target_conditions': [
    313       [ 'OS=="linux" or OS=="freebsd" or OS=="openbsd"', {
    314         'cflags!': [
    315           '-Wall',
    316           '-Wextra',
    317           '-Werror',
    318         ],
    319       }],
    320       [ 'OS=="win"', {
    321         'defines': [
    322           '_CRT_SECURE_NO_DEPRECATE',
    323           '_CRT_NONSTDC_NO_WARNINGS',
    324           '_CRT_NONSTDC_NO_DEPRECATE',
    325           # This is required for ATL to use XP-safe versions of its functions.
    326           '_USING_V110_SDK71_',
    327         ],
    328         'msvs_disabled_warnings': [4800],
    329         'msvs_settings': {
    330           'VCCLCompilerTool': {
    331             'WarnAsError': 'true',
    332             'Detect64BitPortabilityProblems': 'false',
    333           },
    334         },
    335       }],
    336       [ 'OS=="mac"', {
    337         'xcode_settings': {
    338           'GCC_TREAT_WARNINGS_AS_ERRORS': 'NO',
    339           'WARNING_CFLAGS!': ['-Wall'],
    340         },
    341       }],
    342     ],  # target_conditions for 'target_defaults'
    343     'default_configuration': 'Debug',
    344     'configurations': {
    345       # VCLinkerTool LinkIncremental values below:
    346       #   0 == default
    347       #   1 == /INCREMENTAL:NO
    348       #   2 == /INCREMENTAL
    349       # Debug links incremental, Release does not.
    350       #
    351       # Abstract base configurations to cover common
    352       # attributes.
    353       #
    354       'Common_Base': {
    355         'abstract': 1,
    356         'msvs_configuration_attributes': {
    357           'OutputDirectory': '$(SolutionDir)$(ConfigurationName)',
    358           'IntermediateDirectory': '$(OutDir)\\obj\\$(ProjectName)',
    359           'CharacterSet': '1',
    360         },
    361       },
    362       'x86_Base': {
    363         'abstract': 1,
    364         'msvs_settings': {
    365           'VCLinkerTool': {
    366             'MinimumRequiredVersion': '5.01',  # XP.
    367             'TargetMachine': '1',
    368           },
    369         },
    370         'msvs_configuration_platform': 'Win32',
    371       },
    372       'x64_Base': {
    373         'abstract': 1,
    374         'msvs_configuration_platform': 'x64',
    375         'msvs_settings': {
    376           'VCLinkerTool': {
    377             'TargetMachine': '17', # x86 - 64
    378             'AdditionalLibraryDirectories!':
    379               ['<(DEPTH)/third_party/platformsdk_win7/files/Lib'],
    380             'AdditionalLibraryDirectories':
    381               ['<(DEPTH)/third_party/platformsdk_win7/files/Lib/x64'],
    382           },
    383           'VCLibrarianTool': {
    384             'AdditionalLibraryDirectories!':
    385               ['<(DEPTH)/third_party/platformsdk_win7/files/Lib'],
    386             'AdditionalLibraryDirectories':
    387               ['<(DEPTH)/third_party/platformsdk_win7/files/Lib/x64'],
    388           },
    389         },
    390         'defines': [
    391           # Not sure if tcmalloc works on 64-bit Windows.
    392           'NO_TCMALLOC',
    393         ],
    394       },
    395       'Debug_Base': {
    396         'abstract': 1,
    397         'xcode_settings': {
    398           'COPY_PHASE_STRIP': 'NO',
    399           'GCC_OPTIMIZATION_LEVEL': '<(mac_debug_optimization)',
    400           'OTHER_CFLAGS': [ '<@(debug_extra_cflags)', ],
    401         },
    402         'msvs_settings': {
    403           'VCCLCompilerTool': {
    404             'Optimization': '<(win_debug_Optimization)',
    405             'PreprocessorDefinitions': ['_DEBUG'],
    406             'BasicRuntimeChecks': '3',
    407             'RuntimeLibrary': '<(win_debug_RuntimeLibrary)',
    408           },
    409           'VCLinkerTool': {
    410             'LinkIncremental': '<(msvs_debug_link_incremental)',
    411           },
    412           'VCResourceCompilerTool': {
    413             'PreprocessorDefinitions': ['_DEBUG'],
    414           },
    415         },
    416         'conditions': [
    417           ['OS=="linux"', {
    418             'cflags': [
    419               '<@(debug_extra_cflags)',
    420             ],
    421           }],
    422         ],
    423       },
    424       'Release_Base': {
    425         'abstract': 1,
    426         'defines': [
    427           'NDEBUG',
    428         ],
    429         'xcode_settings': {
    430           'DEAD_CODE_STRIPPING': 'YES',  # -Wl,-dead_strip
    431           'GCC_OPTIMIZATION_LEVEL': '<(mac_release_optimization)',
    432           'OTHER_CFLAGS': [ '<@(release_extra_cflags)', ],
    433         },
    434         'msvs_settings': {
    435           'VCCLCompilerTool': {
    436             'Optimization': '<(win_release_Optimization)',
    437             'RuntimeLibrary': '<(win_release_RuntimeLibrary)',
    438           },
    439           'VCLinkerTool': {
    440             'LinkIncremental': '1',
    441           },
    442         },
    443         'conditions': [
    444           ['release_valgrind_build==0', {
    445             'defines': ['NVALGRIND'],
    446           }],
    447           ['win_use_allocator_shim==0', {
    448             'defines': ['NO_TCMALLOC'],
    449           }],
    450           ['win_release_RuntimeLibrary==2', {
    451             # Visual C++ 2008 barfs when building anything with /MD (msvcrt):
    452             #  VC\include\typeinfo(139) : warning C4275: non dll-interface
    453             #  class 'stdext::exception' used as base for dll-interface
    454             #  class 'std::bad_cast'
    455             'msvs_disabled_warnings': [4275],
    456           }],
    457           ['OS=="linux"', {
    458             'cflags': [
    459              '<@(release_extra_cflags)',
    460             ],
    461           }],
    462         ],
    463       },
    464       'Purify_Base': {
    465         'abstract': 1,
    466         'defines': [
    467           'PURIFY',
    468           'NO_TCMALLOC',
    469         ],
    470         'msvs_settings': {
    471           'VCCLCompilerTool': {
    472             'Optimization': '0',
    473             'RuntimeLibrary': '0',
    474             'BufferSecurityCheck': 'false',
    475           },
    476           'VCLinkerTool': {
    477             'EnableCOMDATFolding': '1',
    478             'LinkIncremental': '1',
    479           },
    480         },
    481       },
    482       #
    483       # Concrete configurations
    484       #
    485       'Debug': {
    486         'inherit_from': ['Common_Base', 'x86_Base', 'Debug_Base'],
    487       },
    488       'Release': {
    489         'inherit_from': ['Common_Base', 'x86_Base', 'Release_Base'],
    490         'conditions': [
    491           ['msvs_use_common_release', {
    492             'defines': ['OFFICIAL_BUILD'],
    493             'msvs_settings': {
    494               'VCCLCompilerTool': {
    495                 'Optimization': '3',
    496                 'StringPooling': 'true',
    497                 'OmitFramePointers': 'true',
    498                 'InlineFunctionExpansion': '2',
    499                 'EnableIntrinsicFunctions': 'true',
    500                 'FavorSizeOrSpeed': '2',
    501                 'OmitFramePointers': 'true',
    502                 'EnableFiberSafeOptimizations': 'true',
    503                 'WholeProgramOptimization': 'true',
    504               },
    505               'VCLibrarianTool': {
    506                 'AdditionalOptions': ['/ltcg', '/expectedoutputsize:120000000'],
    507               },
    508               'VCLinkerTool': {
    509                 'LinkIncremental': '1',
    510                 'OptimizeReferences': '2',
    511                 'EnableCOMDATFolding': '2',
    512                 'OptimizeForWindows98': '1',
    513                 'LinkTimeCodeGeneration': '1',
    514               },
    515             },
    516           }],
    517         ]
    518       },
    519       'conditions': [
    520         [ 'OS=="win"', {
    521           # TODO(bradnelson): add a gyp mechanism to make this more graceful.
    522           'Purify': {
    523             'inherit_from': ['Common_Base', 'x86_Base', 'Release_Base', 'Purify'],
    524           },
    525           'Debug_x64': {
    526             'inherit_from': ['Common_Base', 'x64_Base', 'Debug_Base'],
    527           },
    528           'Release_x64': {
    529             'inherit_from': ['Common_Base', 'x64_Base', 'Release_Base'],
    530           },
    531           'Purify_x64': {
    532             'inherit_from': ['Common_Base', 'x64_Base', 'Release_Base', 'Purify_Base'],
    533           },
    534         }],
    535       ],
    536     },
    537   },
    538   'conditions': [
    539     ['OS=="linux" or OS=="freebsd" or OS=="openbsd" or OS=="solaris"', {
    540       'target_defaults': {
    541         # Enable -Werror by default, but put it in a variable so it can
    542         # be disabled in ~/.gyp/include.gypi on the valgrind builders.
    543         'variables': {
    544           # Use -fno-strict-aliasing by default since gcc 4.4 has periodic
    545           # issues that slip through the cracks. We could do this just for
    546           # gcc 4.4 but it makes more sense to be consistent on all
    547           # compilers in use. TODO(Craig): turn this off again when
    548           # there is some 4.4 test infrastructure in place and existing
    549           # aliasing issues have been fixed.
    550           'no_strict_aliasing%': 1,
    551           'conditions': [['OS=="linux"', {'werror%': '-Werror',}],
    552                          ['OS=="freebsd"', {'werror%': '',}],
    553                          ['OS=="openbsd"', {'werror%': '',}],
    554           ],
    555         },
    556         'cflags': [
    557           '<(werror)',  # See note above about the werror variable.
    558           '-pthread',
    559           '-fno-exceptions',
    560           '-Wall',
    561           # TODO(evan): turn this back on once all the builds work.
    562           # '-Wextra',
    563           # Don't warn about unused function params.  We use those everywhere.
    564           '-Wno-unused-parameter',
    565           # Don't warn about the "struct foo f = {0};" initialization pattern.
    566           '-Wno-missing-field-initializers',
    567           '-D_FILE_OFFSET_BITS=64',
    568           # Don't export any symbols (for example, to plugins we dlopen()).
    569           # Note: this is *required* to make some plugins work.
    570           '-fvisibility=hidden',
    571         ],
    572         'cflags_cc': [
    573           '-frtti',
    574           '-fno-threadsafe-statics',
    575           # Make inline functions have hidden visiblity by default.
    576           # Surprisingly, not covered by -fvisibility=hidden.
    577           '-fvisibility-inlines-hidden',
    578         ],
    579         'ldflags': [
    580           '-pthread', '-Wl,-z,noexecstack',
    581         ],
    582         'scons_variable_settings': {
    583           'LIBPATH': ['$LIB_DIR'],
    584           # Linking of large files uses lots of RAM, so serialize links
    585           # using the handy flock command from util-linux.
    586           'FLOCK_LINK': ['flock', '$TOP_BUILDDIR/linker.lock', '$LINK'],
    587           'FLOCK_SHLINK': ['flock', '$TOP_BUILDDIR/linker.lock', '$SHLINK'],
    588           'FLOCK_LDMODULE': ['flock', '$TOP_BUILDDIR/linker.lock', '$LDMODULE'],
    589 
    590           # We have several cases where archives depend on each other in
    591           # a cyclic fashion.  Since the GNU linker does only a single
    592           # pass over the archives we surround the libraries with
    593           # --start-group and --end-group (aka -( and -) ). That causes
    594           # ld to loop over the group until no more undefined symbols
    595           # are found. In an ideal world we would only make groups from
    596           # those libraries which we knew to be in cycles. However,
    597           # that's tough with SCons, so we bodge it by making all the
    598           # archives a group by redefining the linking command here.
    599           #
    600           # TODO:  investigate whether we still have cycles that
    601           # require --{start,end}-group.  There has been a lot of
    602           # refactoring since this was first coded, which might have
    603           # eliminated the circular dependencies.
    604           #
    605           # Note:  $_LIBDIRFLAGS comes before ${LINK,SHLINK,LDMODULE}FLAGS
    606           # so that we prefer our own built libraries (e.g. -lpng) to
    607           # system versions of libraries that pkg-config might turn up.
    608           # TODO(sgk): investigate handling this not by re-ordering the
    609           # flags this way, but by adding a hook to use the SCons
    610           # ParseFlags() option on the output from pkg-config.
    611           'LINKCOM': [['$FLOCK_LINK', '-o', '$TARGET',
    612                        '$_LIBDIRFLAGS', '$LINKFLAGS', '$SOURCES',
    613                        '-Wl,--start-group', '$_LIBFLAGS', '-Wl,--end-group']],
    614           'SHLINKCOM': [['$FLOCK_SHLINK', '-o', '$TARGET',
    615                          '$_LIBDIRFLAGS', '$SHLINKFLAGS', '$SOURCES',
    616                          '-Wl,--start-group', '$_LIBFLAGS', '-Wl,--end-group']],
    617           'LDMODULECOM': [['$FLOCK_LDMODULE', '-o', '$TARGET',
    618                            '$_LIBDIRFLAGS', '$LDMODULEFLAGS', '$SOURCES',
    619                            '-Wl,--start-group', '$_LIBFLAGS', '-Wl,--end-group']],
    620           'IMPLICIT_COMMAND_DEPENDENCIES': 0,
    621         },
    622         'scons_import_variables': [
    623           'AS',
    624           'CC',
    625           'CXX',
    626           'LINK',
    627         ],
    628         'scons_propagate_variables': [
    629           'AS',
    630           'CC',
    631           'CCACHE_DIR',
    632           'CXX',
    633           'DISTCC_DIR',
    634           'DISTCC_HOSTS',
    635           'HOME',
    636           'INCLUDE_SERVER_ARGS',
    637           'INCLUDE_SERVER_PORT',
    638           'LINK',
    639           'CHROME_BUILD_TYPE',
    640           'CHROMIUM_BUILD',
    641           'OFFICIAL_BUILD',
    642         ],
    643         'configurations': {
    644           'Debug_Base': {
    645             'variables': {
    646               'debug_optimize%': '0',
    647             },
    648             'defines': [
    649               '_DEBUG',
    650             ],
    651             'cflags': [
    652               '-O>(debug_optimize)',
    653               '-g',
    654               # One can use '-gstabs' to enable building the debugging
    655               # information in STABS format for breakpad's dumpsyms.
    656             ],
    657             'ldflags': [
    658               '-rdynamic',  # Allows backtrace to resolve symbols.
    659             ],
    660           },
    661           'Release_Base': {
    662             'variables': {
    663               'release_optimize%': '2',
    664             },
    665             'cflags': [
    666               '-O>(release_optimize)',
    667               # Don't emit the GCC version ident directives, they just end up
    668               # in the .comment section taking up binary size.
    669               '-fno-ident',
    670               # Put data and code in their own sections, so that unused symbols
    671               # can be removed at link time with --gc-sections.
    672               '-fdata-sections',
    673               '-ffunction-sections',
    674             ],
    675             'ldflags': [
    676               '-Wl,--gc-sections',
    677             ],
    678           },
    679         },
    680         'variants': {
    681           'coverage': {
    682             'cflags': ['-fprofile-arcs', '-ftest-coverage'],
    683             'ldflags': ['-fprofile-arcs'],
    684           },
    685           'profile': {
    686             'cflags': ['-pg', '-g'],
    687             'ldflags': ['-pg'],
    688           },
    689           'symbols': {
    690             'cflags': ['-g'],
    691           },
    692         },
    693         'conditions': [
    694           [ 'target_arch=="ia32"', {
    695             'asflags': [
    696               # Needed so that libs with .s files (e.g. libicudata.a)
    697               # are compatible with the general 32-bit-ness.
    698               '-32',
    699             ],
    700             # All floating-point computations on x87 happens in 80-bit
    701             # precision.  Because the C and C++ language standards allow
    702             # the compiler to keep the floating-point values in higher
    703             # precision than what's specified in the source and doing so
    704             # is more efficient than constantly rounding up to 64-bit or
    705             # 32-bit precision as specified in the source, the compiler,
    706             # especially in the optimized mode, tries very hard to keep
    707             # values in x87 floating-point stack (in 80-bit precision)
    708             # as long as possible. This has important side effects, that
    709             # the real value used in computation may change depending on
    710             # how the compiler did the optimization - that is, the value
    711             # kept in 80-bit is different than the value rounded down to
    712             # 64-bit or 32-bit. There are possible compiler options to make
    713             # this behavior consistent (e.g. -ffloat-store would keep all
    714             # floating-values in the memory, thus force them to be rounded
    715             # to its original precision) but they have significant runtime
    716             # performance penalty.
    717             #
    718             # -mfpmath=sse -msse2 makes the compiler use SSE instructions
    719             # which keep floating-point values in SSE registers in its
    720             # native precision (32-bit for single precision, and 64-bit for
    721             # double precision values). This means the floating-point value
    722             # used during computation does not change depending on how the
    723             # compiler optimized the code, since the value is always kept
    724             # in its specified precision.
    725             'conditions': [
    726               ['disable_sse2==0', {
    727                 'cflags': [
    728                   '-march=pentium4',
    729                   '-msse2',
    730                   '-mfpmath=sse',
    731                 ],
    732               }],
    733             ],
    734             # -mmmx allows mmintrin.h to be used for mmx intrinsics.
    735             # video playback is mmx and sse2 optimized.
    736             'cflags': [
    737               '-m32',
    738               '-mmmx',
    739             ],
    740             'ldflags': [
    741               '-m32',
    742             ],
    743           }],
    744           ['target_arch=="arm"', {
    745             'target_conditions': [
    746               ['_toolset=="target"', {
    747                 'cflags_cc': [
    748                   # The codesourcery arm-2009q3 toolchain warns at that the ABI
    749                   # has changed whenever it encounters a varargs function. This
    750                   # silences those warnings, as they are not helpful and
    751                   # clutter legitimate warnings.
    752                   '-Wno-abi',
    753                 ],
    754                 'conditions': [
    755                   ['arm_thumb == 1', {
    756                     'cflags': [
    757                     '-mthumb',
    758                     # TODO(piman): -Wa,-mimplicit-it=thumb is needed for
    759                     # inline assembly that uses condition codes but it's
    760                     # suboptimal. Better would be to #ifdef __thumb__ at the
    761                     # right place and have a separate thumb path.
    762                     '-Wa,-mimplicit-it=thumb',
    763                     ]
    764                   }],
    765                   ['arm_version==7', {
    766                     'cflags': [
    767                       '-march=armv7-a',
    768                       '-mtune=cortex-a8',
    769                       '-mfloat-abi=softfp',
    770                     ],
    771                     'conditions': [
    772                       ['arm_neon==1', {
    773                         'cflags': [ '-mfpu=neon', ],
    774                       }, {
    775                         'cflags': [ '-mfpu=<(arm_fpu)', ],
    776                       }]
    777                     ],
    778                   }],
    779                 ],
    780               }],
    781             ],
    782           }],
    783           ['linux_fpic==1', {
    784             'cflags': [
    785               '-fPIC',
    786             ],
    787           }],
    788           ['sysroot!=""', {
    789             'target_conditions': [
    790               ['_toolset=="target"', {
    791                 'cflags': [
    792                   '--sysroot=<(sysroot)',
    793                 ],
    794                 'ldflags': [
    795                   '--sysroot=<(sysroot)',
    796                 ],
    797               }]]
    798           }],
    799           ['no_strict_aliasing==1', {
    800             'cflags': [
    801               '-fno-strict-aliasing',
    802             ],
    803           }],
    804           ['linux_use_heapchecker==1', {
    805             'variables': {'linux_use_tcmalloc%': 1},
    806           }],
    807           ['linux_use_tcmalloc==0', {
    808             'defines': ['NO_TCMALLOC'],
    809           }],
    810           ['linux_use_heapchecker==0', {
    811             'defines': ['NO_HEAPCHECKER'],
    812           }],
    813         ],
    814       },
    815     }],
    816     # FreeBSD-specific options; note that most FreeBSD options are set above,
    817     # with Linux.
    818     ['OS=="freebsd"', {
    819       'target_defaults': {
    820         'ldflags': [
    821           '-Wl,--no-keep-memory',
    822         ],
    823       },
    824     }],
    825     ['OS=="solaris"', {
    826       'cflags!': ['-fvisibility=hidden'],
    827       'cflags_cc!': ['-fvisibility-inlines-hidden'],
    828     }],
    829     ['OS=="mac"', {
    830       'target_defaults': {
    831         'variables': {
    832           # This should be 'mac_real_dsym%', but there seems to be a bug
    833           # with % in variables that are intended to be set to different
    834           # values in different targets, like this one.
    835           'mac_real_dsym': 0,  # Fake .dSYMs are fine in most cases.
    836         },
    837         'mac_bundle': 0,
    838         'xcode_settings': {
    839           'ALWAYS_SEARCH_USER_PATHS': 'NO',
    840           'GCC_C_LANGUAGE_STANDARD': 'c99',         # -std=c99
    841           'GCC_CW_ASM_SYNTAX': 'NO',                # No -fasm-blocks
    842           'GCC_DYNAMIC_NO_PIC': 'NO',               # No -mdynamic-no-pic
    843                                                     # (Equivalent to -fPIC)
    844           'GCC_ENABLE_CPP_EXCEPTIONS': 'NO',        # -fno-exceptions
    845           'GCC_ENABLE_CPP_RTTI': 'YES',             # -frtti
    846           'GCC_ENABLE_PASCAL_STRINGS': 'NO',        # No -mpascal-strings
    847           # GCC_INLINES_ARE_PRIVATE_EXTERN maps to -fvisibility-inlines-hidden
    848           'GCC_INLINES_ARE_PRIVATE_EXTERN': 'YES',
    849           'GCC_OBJC_CALL_CXX_CDTORS': 'YES',        # -fobjc-call-cxx-cdtors
    850           'GCC_SYMBOLS_PRIVATE_EXTERN': 'YES',      # -fvisibility=hidden
    851           'GCC_THREADSAFE_STATICS': 'NO',           # -fno-threadsafe-statics
    852           'GCC_TREAT_WARNINGS_AS_ERRORS': 'YES',    # -Werror
    853           'GCC_VERSION': '4.2',
    854           'GCC_WARN_ABOUT_MISSING_NEWLINE': 'YES',  # -Wnewline-eof
    855           # MACOSX_DEPLOYMENT_TARGET maps to -mmacosx-version-min
    856           'MACOSX_DEPLOYMENT_TARGET': '<(mac_deployment_target)',
    857           'PREBINDING': 'NO',                       # No -Wl,-prebind
    858           'USE_HEADERMAP': 'NO',
    859           'WARNING_CFLAGS': ['-Wall', '-Wendif-labels'],
    860           'conditions': [
    861             ['chromium_mac_pch', {'GCC_PRECOMPILE_PREFIX_HEADER': 'YES'},
    862                                  {'GCC_PRECOMPILE_PREFIX_HEADER': 'NO'}
    863             ],
    864           ],
    865         },
    866         'target_conditions': [
    867           ['_type!="static_library"', {
    868             'xcode_settings': {'OTHER_LDFLAGS': ['-Wl,-search_paths_first']},
    869           }],
    870           ['_mac_bundle', {
    871             'xcode_settings': {'OTHER_LDFLAGS': ['-Wl,-ObjC']},
    872           }],
    873         ],  # target_conditions
    874       },  # target_defaults
    875     }],  # OS=="mac"
    876     ['OS=="win"', {
    877       'target_defaults': {
    878         'defines': [
    879           '_WIN32_WINNT=0x0600',
    880           'WINVER=0x0600',
    881           'WIN32',
    882           '_WINDOWS',
    883           '_HAS_EXCEPTIONS=0',
    884           'NOMINMAX',
    885           '_CRT_RAND_S',
    886           'CERT_CHAIN_PARA_HAS_EXTRA_FIELDS',
    887           'WIN32_LEAN_AND_MEAN',
    888           '_SECURE_ATL',
    889           '_HAS_TR1=0',
    890         ],
    891         'msvs_system_include_dirs': [
    892           '<(DEPTH)/third_party/platformsdk_win7/files/Include',
    893           '$(VSInstallDir)/VC/atlmfc/include',
    894         ],
    895         'msvs_cygwin_dirs': ['<(DEPTH)/third_party/cygwin'],
    896         'msvs_disabled_warnings': [
    897           4100, 4127, 4396, 4503, 4512, 4819, 4995, 4702
    898         ],
    899         'msvs_settings': {
    900           'VCCLCompilerTool': {
    901             'MinimalRebuild': 'false',
    902             'ExceptionHandling': '0',
    903             'BufferSecurityCheck': 'true',
    904             'EnableFunctionLevelLinking': 'true',
    905             'RuntimeTypeInfo': 'false',
    906             'WarningLevel': '4',
    907             'WarnAsError': 'true',
    908             'DebugInformationFormat': '3',
    909             'conditions': [
    910               [ 'msvs_multi_core_compile', {
    911                 'AdditionalOptions': ['/MP'],
    912               }],
    913             ],
    914           },
    915           'VCLibrarianTool': {
    916             'AdditionalOptions': ['/ignore:4221'],
    917             'AdditionalLibraryDirectories':
    918               ['<(DEPTH)/third_party/platformsdk_win7/files/Lib'],
    919           },
    920           'VCLinkerTool': {
    921             'AdditionalDependencies': [
    922               'wininet.lib',
    923               'version.lib',
    924               'msimg32.lib',
    925               'ws2_32.lib',
    926               'usp10.lib',
    927               'psapi.lib',
    928               'dbghelp.lib',
    929             ],
    930             'AdditionalLibraryDirectories':
    931               ['<(DEPTH)/third_party/platformsdk_win7/files/Lib'],
    932             'GenerateDebugInformation': 'true',
    933             'MapFileName': '$(OutDir)\\$(TargetName).map',
    934             'ImportLibrary': '$(OutDir)\\lib\\$(TargetName).lib',
    935             'FixedBaseAddress': '1',
    936             # SubSystem values:
    937             #   0 == not set
    938             #   1 == /SUBSYSTEM:CONSOLE
    939             #   2 == /SUBSYSTEM:WINDOWS
    940             # Most of the executables we'll ever create are tests
    941             # and utilities with console output.
    942             'SubSystem': '1',
    943           },
    944           'VCMIDLTool': {
    945             'GenerateStublessProxies': 'true',
    946             'TypeLibraryName': '$(InputName).tlb',
    947             'OutputDirectory': '$(IntDir)',
    948             'HeaderFileName': '$(InputName).h',
    949             'DLLDataFileName': 'dlldata.c',
    950             'InterfaceIdentifierFileName': '$(InputName)_i.c',
    951             'ProxyFileName': '$(InputName)_p.c',
    952           },
    953           'VCResourceCompilerTool': {
    954             'Culture' : '1033',
    955             'AdditionalIncludeDirectories': ['<(DEPTH)'],
    956           },
    957         },
    958       },
    959     }],
    960     ['disable_nacl==1 or OS=="freebsd" or OS=="openbsd" or OS=="solaris"', {
    961       'target_defaults': {
    962         'defines': [
    963           'DISABLE_NACL',
    964         ],
    965       },
    966     }],
    967     ['OS=="win" and msvs_use_common_linker_extras', {
    968       'target_defaults': {
    969         'msvs_settings': {
    970           'VCLinkerTool': {
    971             'DelayLoadDLLs': [
    972               'dbghelp.dll',
    973               'dwmapi.dll',
    974               'uxtheme.dll',
    975             ],
    976           },
    977         },
    978         'configurations': {
    979           'x86_Base': {
    980             'msvs_settings': {
    981               'VCLinkerTool': {
    982                 'AdditionalOptions': [
    983                   '/safeseh',
    984                   '/dynamicbase',
    985                   '/ignore:4199',
    986                   '/ignore:4221',
    987                   '/nxcompat',
    988                 ],
    989               },
    990             },
    991           },
    992           'x64_Base': {
    993             'msvs_settings': {
    994               'VCLinkerTool': {
    995                 'AdditionalOptions': [
    996                   # safeseh is not compatible with x64
    997                   '/dynamicbase',
    998                   '/ignore:4199',
    999                   '/ignore:4221',
   1000                   '/nxcompat',
   1001                 ],
   1002               },
   1003             },
   1004           },
   1005         },
   1006       },
   1007     }],
   1008     ['enable_new_npdevice_api==1', {
   1009       'target_defaults': {
   1010         'defines': [
   1011           'ENABLE_NEW_NPDEVICE_API',
   1012         ],
   1013       },
   1014     }],
   1015   ],
   1016   'scons_settings': {
   1017     'sconsbuild_dir': '<(DEPTH)/sconsbuild',
   1018     'tools': ['ar', 'as', 'gcc', 'g++', 'gnulink', 'chromium_builders'],
   1019   },
   1020   'xcode_settings': {
   1021     # DON'T ADD ANYTHING NEW TO THIS BLOCK UNLESS YOU REALLY REALLY NEED IT!
   1022     # This block adds *project-wide* configuration settings to each project
   1023     # file.  It's almost always wrong to put things here.  Specify your
   1024     # custom xcode_settings in target_defaults to add them to targets instead.
   1025 
   1026     # In an Xcode Project Info window, the "Base SDK for All Configurations"
   1027     # setting sets the SDK on a project-wide basis.  In order to get the
   1028     # configured SDK to show properly in the Xcode UI, SDKROOT must be set
   1029     # here at the project level.
   1030     'SDKROOT': 'macosx<(mac_sdk)',  # -isysroot
   1031 
   1032     # The Xcode generator will look for an xcode_settings section at the root
   1033     # of each dict and use it to apply settings on a file-wide basis.  Most
   1034     # settings should not be here, they should be in target-specific
   1035     # xcode_settings sections, or better yet, should use non-Xcode-specific
   1036     # settings in target dicts.  SYMROOT is a special case, because many other
   1037     # Xcode variables depend on it, including variables such as
   1038     # PROJECT_DERIVED_FILE_DIR.  When a source group corresponding to something
   1039     # like PROJECT_DERIVED_FILE_DIR is added to a project, in order for the
   1040     # files to appear (when present) in the UI as actual files and not red
   1041     # red "missing file" proxies, the correct path to PROJECT_DERIVED_FILE_DIR,
   1042     # and therefore SYMROOT, needs to be set at the project level.
   1043     'SYMROOT': '<(DEPTH)/xcodebuild',
   1044   },
   1045 }
   1046