1*3f982cf4SFabien Sanglard# Copyright 2018 The Chromium Authors. All rights reserved. 2*3f982cf4SFabien Sanglard# Use of this source code is governed by a BSD-style license that can be 3*3f982cf4SFabien Sanglard# found in the LICENSE file. 4*3f982cf4SFabien Sanglard 5*3f982cf4SFabien Sanglard# ============================================================================= 6*3f982cf4SFabien Sanglard# WHAT IS THIS FILE? 7*3f982cf4SFabien Sanglard# ============================================================================= 8*3f982cf4SFabien Sanglard# 9*3f982cf4SFabien Sanglard# This is the master GN build configuration. This file is loaded after the 10*3f982cf4SFabien Sanglard# build args (args.gn) for the build directory and after the toplevel ".gn" 11*3f982cf4SFabien Sanglard# file (which points to this file as the build configuration). 12*3f982cf4SFabien Sanglard# 13*3f982cf4SFabien Sanglard# This file will be executed and the resulting context will be used to execute 14*3f982cf4SFabien Sanglard# every other file in the build. So variables declared here (that don't start 15*3f982cf4SFabien Sanglard# with an underscore) will be implicitly global. 16*3f982cf4SFabien Sanglard 17*3f982cf4SFabien Sanglard# ============================================================================= 18*3f982cf4SFabien Sanglard# PLATFORM SELECTION 19*3f982cf4SFabien Sanglard# ============================================================================= 20*3f982cf4SFabien Sanglard# 21*3f982cf4SFabien Sanglard# There are two main things to set: "os" and "cpu". The "toolchain" is the name 22*3f982cf4SFabien Sanglard# of the GN thing that encodes combinations of these things. 23*3f982cf4SFabien Sanglard# 24*3f982cf4SFabien Sanglard# Users typically only set the variables "target_os" and "target_cpu" in "gn 25*3f982cf4SFabien Sanglard# args", the rest are set up by our build and internal to GN. 26*3f982cf4SFabien Sanglard# 27*3f982cf4SFabien Sanglard# There are three different types of each of these things: The "host" 28*3f982cf4SFabien Sanglard# represents the computer doing the compile and never changes. The "target" 29*3f982cf4SFabien Sanglard# represents the main thing we're trying to build. The "current" represents 30*3f982cf4SFabien Sanglard# which configuration is currently being defined, which can be either the 31*3f982cf4SFabien Sanglard# host, the target, or something completely different. 32*3f982cf4SFabien Sanglard 33*3f982cf4SFabien Sanglardif (target_os == "") { 34*3f982cf4SFabien Sanglard target_os = host_os 35*3f982cf4SFabien Sanglard} 36*3f982cf4SFabien Sanglardif (target_cpu == "") { 37*3f982cf4SFabien Sanglard target_cpu = host_cpu 38*3f982cf4SFabien Sanglard} 39*3f982cf4SFabien Sanglardif (current_cpu == "") { 40*3f982cf4SFabien Sanglard current_cpu = target_cpu 41*3f982cf4SFabien Sanglard} 42*3f982cf4SFabien Sanglardif (current_os == "") { 43*3f982cf4SFabien Sanglard current_os = target_os 44*3f982cf4SFabien Sanglard} 45*3f982cf4SFabien Sanglard 46*3f982cf4SFabien Sanglard# ============================================================================= 47*3f982cf4SFabien Sanglard# BUILD FLAGS 48*3f982cf4SFabien Sanglard# ============================================================================= 49*3f982cf4SFabien Sanglard# 50*3f982cf4SFabien Sanglard# This block lists input arguments to the build, along with their default 51*3f982cf4SFabien Sanglard# values. 52*3f982cf4SFabien Sanglard# 53*3f982cf4SFabien Sanglard# If a value is specified on the command line, it will overwrite the defaults 54*3f982cf4SFabien Sanglard# given in a declare_args block, otherwise the default will be used. 55*3f982cf4SFabien Sanglard# 56*3f982cf4SFabien Sanglard# YOU SHOULD ALMOST NEVER NEED TO ADD FLAGS TO THIS FILE. GN allows any file in 57*3f982cf4SFabien Sanglard# the build to declare build flags. If you need a flag for a single component, 58*3f982cf4SFabien Sanglard# you can just declare it in the corresponding BUILD.gn file. 59*3f982cf4SFabien Sanglard 60*3f982cf4SFabien Sanglarddefault_clang_base_path = "//third_party/llvm-build/Release+Asserts" 61*3f982cf4SFabien Sanglard 62*3f982cf4SFabien Sanglarddeclare_args() { 63*3f982cf4SFabien Sanglard # Debug build. Most global debug build flags are declared in 64*3f982cf4SFabien Sanglard # //build/config/BUILD.gn. 65*3f982cf4SFabien Sanglard is_debug = false 66*3f982cf4SFabien Sanglard 67*3f982cf4SFabien Sanglard # By default, we use the clang compiler on both Mac and Linux. To use the 68*3f982cf4SFabien Sanglard # gcc compiler on Linux instead, set is_gcc to true. 69*3f982cf4SFabien Sanglard is_gcc = false 70*3f982cf4SFabien Sanglard clang_base_path = default_clang_base_path 71*3f982cf4SFabien Sanglard 72*3f982cf4SFabien Sanglard # This would not normally be set as a build argument, but rather is used as a 73*3f982cf4SFabien Sanglard # default value during the first parse of this config. All other toolchains 74*3f982cf4SFabien Sanglard # that cause this file to be re-parsed will already have this set. For 75*3f982cf4SFabien Sanglard # further explanation, see 76*3f982cf4SFabien Sanglard # https://gn.googlesource.com/gn/+/refs/heads/master/docs/reference.md#toolchain-overview 77*3f982cf4SFabien Sanglard host_toolchain = "" 78*3f982cf4SFabien Sanglard 79*3f982cf4SFabien Sanglard # Must be enabled for fuzzing targets. 80*3f982cf4SFabien Sanglard use_libfuzzer = false 81*3f982cf4SFabien Sanglard} 82*3f982cf4SFabien Sanglard 83*3f982cf4SFabien Sanglarddeclare_args() { 84*3f982cf4SFabien Sanglard is_clang = !is_gcc 85*3f982cf4SFabien Sanglard} 86*3f982cf4SFabien Sanglard 87*3f982cf4SFabien Sanglard# ============================================================================== 88*3f982cf4SFabien Sanglard# TOOLCHAIN SETUP 89*3f982cf4SFabien Sanglard# ============================================================================== 90*3f982cf4SFabien Sanglard# 91*3f982cf4SFabien Sanglard# Here we set the host and default toolchains. Currently only Mac and POSIX are 92*3f982cf4SFabien Sanglard# defined. 93*3f982cf4SFabien Sanglardif (host_toolchain == "") { 94*3f982cf4SFabien Sanglard if (current_os == "chromeos" || current_os == "linux") { 95*3f982cf4SFabien Sanglard if (is_clang) { 96*3f982cf4SFabien Sanglard host_toolchain = "//build/toolchain/linux:clang_$host_cpu" 97*3f982cf4SFabien Sanglard } else { 98*3f982cf4SFabien Sanglard host_toolchain = "//build/toolchain/linux:gcc_$host_cpu" 99*3f982cf4SFabien Sanglard } 100*3f982cf4SFabien Sanglard } else if (current_os == "mac") { 101*3f982cf4SFabien Sanglard host_toolchain = "//build/toolchain/mac:clang" 102*3f982cf4SFabien Sanglard } else { 103*3f982cf4SFabien Sanglard # TODO(miu): Windows, and others. 104*3f982cf4SFabien Sanglard assert(false, "Toolchain for current_os is not defined.") 105*3f982cf4SFabien Sanglard } 106*3f982cf4SFabien Sanglard} 107*3f982cf4SFabien Sanglard 108*3f982cf4SFabien Sanglard_default_toolchain = "" 109*3f982cf4SFabien Sanglardif (target_os == "chromeos" || target_os == "linux") { 110*3f982cf4SFabien Sanglard if (is_clang) { 111*3f982cf4SFabien Sanglard _default_toolchain = "//build/toolchain/linux:clang_$target_cpu" 112*3f982cf4SFabien Sanglard } else { 113*3f982cf4SFabien Sanglard _default_toolchain = "//build/toolchain/linux:gcc_$target_cpu" 114*3f982cf4SFabien Sanglard } 115*3f982cf4SFabien Sanglard} else if (target_os == "mac") { 116*3f982cf4SFabien Sanglard assert(host_os == "mac", "Cross-compiling on Mac is not supported.") 117*3f982cf4SFabien Sanglard _default_toolchain = "//build/toolchain/mac:clang" 118*3f982cf4SFabien Sanglard} else { 119*3f982cf4SFabien Sanglard assert(false, "Toolchain for target_os is not defined.") 120*3f982cf4SFabien Sanglard} 121*3f982cf4SFabien Sanglardset_default_toolchain(_default_toolchain) 122*3f982cf4SFabien Sanglard 123*3f982cf4SFabien Sanglard# ============================================================================= 124*3f982cf4SFabien Sanglard# OS DEFINITIONS 125*3f982cf4SFabien Sanglard# ============================================================================= 126*3f982cf4SFabien Sanglard# 127*3f982cf4SFabien Sanglard# We set these various is_FOO booleans for convenience in writing OS-based 128*3f982cf4SFabien Sanglard# conditions. 129*3f982cf4SFabien Sanglard 130*3f982cf4SFabien Sanglardif (current_os == "chromeos" || current_os == "linux") { 131*3f982cf4SFabien Sanglard is_linux = true 132*3f982cf4SFabien Sanglard is_mac = false 133*3f982cf4SFabien Sanglard is_posix = true 134*3f982cf4SFabien Sanglard} else if (current_os == "mac") { 135*3f982cf4SFabien Sanglard is_linux = false 136*3f982cf4SFabien Sanglard is_mac = true 137*3f982cf4SFabien Sanglard is_posix = true 138*3f982cf4SFabien Sanglard} else { 139*3f982cf4SFabien Sanglard # TODO(miu): Windows, and others. 140*3f982cf4SFabien Sanglard assert(false, "is_FOO booleans not defined for current_os.") 141*3f982cf4SFabien Sanglard} 142*3f982cf4SFabien Sanglard 143*3f982cf4SFabien Sanglard# ============================================================================= 144*3f982cf4SFabien Sanglard# TARGET DEFAULTS 145*3f982cf4SFabien Sanglard# ============================================================================= 146*3f982cf4SFabien Sanglard# 147*3f982cf4SFabien Sanglard# Set up the default configuration for every build target of the given type. 148*3f982cf4SFabien Sanglard# The values configured here will be automatically set on the scope of the 149*3f982cf4SFabien Sanglard# corresponding target. Target definitions can add or remove to the settings 150*3f982cf4SFabien Sanglard# here as needed. 151*3f982cf4SFabien Sanglard 152*3f982cf4SFabien Sanglard# All binary targets will get this list of configs by default. 153*3f982cf4SFabien Sanglard_shared_binary_target_configs = [ 154*3f982cf4SFabien Sanglard "//build/config:openscreen_code", 155*3f982cf4SFabien Sanglard "//build/config:no_exceptions", 156*3f982cf4SFabien Sanglard "//build/config:no_rtti", 157*3f982cf4SFabien Sanglard "//build/config:symbol_visibility_hidden", 158*3f982cf4SFabien Sanglard "//build/config:default_sanitizers", 159*3f982cf4SFabien Sanglard "//build/config:default_coverage", 160*3f982cf4SFabien Sanglard "//build/config:compiler_defaults", 161*3f982cf4SFabien Sanglard "//build/config:compiler_cpu_abi", 162*3f982cf4SFabien Sanglard "//build/config:default_optimization", 163*3f982cf4SFabien Sanglard "//build/config:sysroot_runtime_libraries", 164*3f982cf4SFabien Sanglard "//build/config:operating_system_defines", 165*3f982cf4SFabien Sanglard] 166*3f982cf4SFabien Sanglard 167*3f982cf4SFabien Sanglard# Apply that default list to the binary target types. 168*3f982cf4SFabien Sanglardset_defaults("executable") { 169*3f982cf4SFabien Sanglard configs = _shared_binary_target_configs 170*3f982cf4SFabien Sanglard} 171*3f982cf4SFabien Sanglardset_defaults("static_library") { 172*3f982cf4SFabien Sanglard configs = _shared_binary_target_configs 173*3f982cf4SFabien Sanglard} 174*3f982cf4SFabien Sanglardset_defaults("shared_library") { 175*3f982cf4SFabien Sanglard configs = _shared_binary_target_configs 176*3f982cf4SFabien Sanglard} 177*3f982cf4SFabien Sanglardset_defaults("source_set") { 178*3f982cf4SFabien Sanglard configs = _shared_binary_target_configs 179*3f982cf4SFabien Sanglard} 180