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