1*6777b538SAndroid Build Coastguard Worker# Copyright 2013 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker# found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker# ============================================================================= 6*6777b538SAndroid Build Coastguard Worker# WHAT IS THIS FILE? 7*6777b538SAndroid Build Coastguard Worker# ============================================================================= 8*6777b538SAndroid Build Coastguard Worker# 9*6777b538SAndroid Build Coastguard Worker# This is the main GN build configuration. This file is loaded after the 10*6777b538SAndroid Build Coastguard Worker# build args (args.gn) for the build directory and after the toplevel ".gn" 11*6777b538SAndroid Build Coastguard Worker# file (which points to this file as the build configuration). 12*6777b538SAndroid Build Coastguard Worker# 13*6777b538SAndroid Build Coastguard Worker# This file will be executed and the resulting context will be used to execute 14*6777b538SAndroid Build Coastguard Worker# every other file in the build. So variables declared here (that don't start 15*6777b538SAndroid Build Coastguard Worker# with an underscore) will be implicitly global. 16*6777b538SAndroid Build Coastguard Worker 17*6777b538SAndroid Build Coastguard Worker# ============================================================================= 18*6777b538SAndroid Build Coastguard Worker# PLATFORM SELECTION 19*6777b538SAndroid Build Coastguard Worker# ============================================================================= 20*6777b538SAndroid Build Coastguard Worker# 21*6777b538SAndroid Build Coastguard Worker# There are two main things to set: "os" and "cpu". The "toolchain" is the name 22*6777b538SAndroid Build Coastguard Worker# of the GN thing that encodes combinations of these things. 23*6777b538SAndroid Build Coastguard Worker# 24*6777b538SAndroid Build Coastguard Worker# Users typically only set the variables "target_os" and "target_cpu" in "gn 25*6777b538SAndroid Build Coastguard Worker# args", the rest are set up by our build and internal to GN. 26*6777b538SAndroid Build Coastguard Worker# 27*6777b538SAndroid Build Coastguard Worker# There are three different types of each of these things: The "host" 28*6777b538SAndroid Build Coastguard Worker# represents the computer doing the compile and never changes. The "target" 29*6777b538SAndroid Build Coastguard Worker# represents the main thing we're trying to build. The "current" represents 30*6777b538SAndroid Build Coastguard Worker# which configuration is currently being defined, which can be either the 31*6777b538SAndroid Build Coastguard Worker# host, the target, or something completely different (like nacl). GN will 32*6777b538SAndroid Build Coastguard Worker# run the same build file multiple times for the different required 33*6777b538SAndroid Build Coastguard Worker# configuration in the same build. 34*6777b538SAndroid Build Coastguard Worker# 35*6777b538SAndroid Build Coastguard Worker# This gives the following variables: 36*6777b538SAndroid Build Coastguard Worker# - host_os, host_cpu, host_toolchain 37*6777b538SAndroid Build Coastguard Worker# - target_os, target_cpu, default_toolchain 38*6777b538SAndroid Build Coastguard Worker# - current_os, current_cpu, current_toolchain. 39*6777b538SAndroid Build Coastguard Worker# 40*6777b538SAndroid Build Coastguard Worker# Note the default_toolchain isn't symmetrical (you would expect 41*6777b538SAndroid Build Coastguard Worker# target_toolchain). This is because the "default" toolchain is a GN built-in 42*6777b538SAndroid Build Coastguard Worker# concept, and "target" is something our build sets up that's symmetrical with 43*6777b538SAndroid Build Coastguard Worker# its GYP counterpart. Potentially the built-in default_toolchain variable 44*6777b538SAndroid Build Coastguard Worker# could be renamed in the future. 45*6777b538SAndroid Build Coastguard Worker# 46*6777b538SAndroid Build Coastguard Worker# When writing build files, to do something only for the host: 47*6777b538SAndroid Build Coastguard Worker# if (current_toolchain == host_toolchain) { ... 48*6777b538SAndroid Build Coastguard Worker 49*6777b538SAndroid Build Coastguard Workerif (target_os == "") { 50*6777b538SAndroid Build Coastguard Worker target_os = host_os 51*6777b538SAndroid Build Coastguard Worker} 52*6777b538SAndroid Build Coastguard Worker 53*6777b538SAndroid Build Coastguard Workerif (target_cpu == "") { 54*6777b538SAndroid Build Coastguard Worker if (target_os == "android") { 55*6777b538SAndroid Build Coastguard Worker # If we're building for Android, we should assume that we want to 56*6777b538SAndroid Build Coastguard Worker # build for ARM by default, not the host_cpu (which is likely x64). 57*6777b538SAndroid Build Coastguard Worker # This allows us to not have to specify both target_os and target_cpu 58*6777b538SAndroid Build Coastguard Worker # on the command line. 59*6777b538SAndroid Build Coastguard Worker target_cpu = "arm" 60*6777b538SAndroid Build Coastguard Worker } else { 61*6777b538SAndroid Build Coastguard Worker target_cpu = host_cpu 62*6777b538SAndroid Build Coastguard Worker } 63*6777b538SAndroid Build Coastguard Worker} 64*6777b538SAndroid Build Coastguard Worker 65*6777b538SAndroid Build Coastguard Workerif (current_cpu == "") { 66*6777b538SAndroid Build Coastguard Worker current_cpu = target_cpu 67*6777b538SAndroid Build Coastguard Worker} 68*6777b538SAndroid Build Coastguard Workerif (current_os == "") { 69*6777b538SAndroid Build Coastguard Worker current_os = target_os 70*6777b538SAndroid Build Coastguard Worker} 71*6777b538SAndroid Build Coastguard Worker 72*6777b538SAndroid Build Coastguard Worker# ============================================================================= 73*6777b538SAndroid Build Coastguard Worker# BUILD FLAGS 74*6777b538SAndroid Build Coastguard Worker# ============================================================================= 75*6777b538SAndroid Build Coastguard Worker# 76*6777b538SAndroid Build Coastguard Worker# This block lists input arguments to the build, along with their default 77*6777b538SAndroid Build Coastguard Worker# values. 78*6777b538SAndroid Build Coastguard Worker# 79*6777b538SAndroid Build Coastguard Worker# If a value is specified on the command line, it will overwrite the defaults 80*6777b538SAndroid Build Coastguard Worker# given in a declare_args block, otherwise the default will be used. 81*6777b538SAndroid Build Coastguard Worker# 82*6777b538SAndroid Build Coastguard Worker# YOU SHOULD ALMOST NEVER NEED TO ADD FLAGS TO THIS FILE. GN allows any file in 83*6777b538SAndroid Build Coastguard Worker# the build to declare build flags. If you need a flag for a single component, 84*6777b538SAndroid Build Coastguard Worker# you can just declare it in the corresponding BUILD.gn file. 85*6777b538SAndroid Build Coastguard Worker# 86*6777b538SAndroid Build Coastguard Worker# - If your feature is a single target, say //components/foo, you can put 87*6777b538SAndroid Build Coastguard Worker# a declare_args() block in //components/foo/BUILD.gn and use it there. 88*6777b538SAndroid Build Coastguard Worker# Nobody else in the build needs to see the flag. 89*6777b538SAndroid Build Coastguard Worker# 90*6777b538SAndroid Build Coastguard Worker# - Defines based on build variables should be implemented via the generated 91*6777b538SAndroid Build Coastguard Worker# build flag header system. See //build/buildflag_header.gni. You can put 92*6777b538SAndroid Build Coastguard Worker# the buildflag_header target in the same file as the build flag itself. You 93*6777b538SAndroid Build Coastguard Worker# should almost never set "defines" directly. 94*6777b538SAndroid Build Coastguard Worker# 95*6777b538SAndroid Build Coastguard Worker# - If your flag toggles a target on and off or toggles between different 96*6777b538SAndroid Build Coastguard Worker# versions of similar things, write a "group" target that forwards to the 97*6777b538SAndroid Build Coastguard Worker# right target (or no target) depending on the value of the build flag. This 98*6777b538SAndroid Build Coastguard Worker# group can be in the same BUILD.gn file as the build flag, and targets can 99*6777b538SAndroid Build Coastguard Worker# depend unconditionally on the group rather than duplicating flag checks 100*6777b538SAndroid Build Coastguard Worker# across many targets. 101*6777b538SAndroid Build Coastguard Worker# 102*6777b538SAndroid Build Coastguard Worker# - If a semi-random set of build files REALLY needs to know about a define and 103*6777b538SAndroid Build Coastguard Worker# the above pattern for isolating the build logic in a forwarding group 104*6777b538SAndroid Build Coastguard Worker# doesn't work, you can put the argument in a .gni file. This should be put 105*6777b538SAndroid Build Coastguard Worker# in the lowest level of the build that knows about this feature (which should 106*6777b538SAndroid Build Coastguard Worker# almost always be outside of the //build directory!). 107*6777b538SAndroid Build Coastguard Worker# 108*6777b538SAndroid Build Coastguard Worker# Other flag advice: 109*6777b538SAndroid Build Coastguard Worker# 110*6777b538SAndroid Build Coastguard Worker# - Use boolean values when possible. If you need a default value that expands 111*6777b538SAndroid Build Coastguard Worker# to some complex thing in the default case (like the location of the 112*6777b538SAndroid Build Coastguard Worker# compiler which would be computed by a script), use a default value of -1 or 113*6777b538SAndroid Build Coastguard Worker# the empty string. Outside of the declare_args block, conditionally expand 114*6777b538SAndroid Build Coastguard Worker# the default value as necessary. 115*6777b538SAndroid Build Coastguard Worker# 116*6777b538SAndroid Build Coastguard Worker# - Use a name like "use_foo" or "is_foo" (whatever is more appropriate for 117*6777b538SAndroid Build Coastguard Worker# your feature) rather than just "foo". 118*6777b538SAndroid Build Coastguard Worker# 119*6777b538SAndroid Build Coastguard Worker# - Write good comments directly above the declaration with no blank line. 120*6777b538SAndroid Build Coastguard Worker# These comments will appear as documentation in "gn args --list". 121*6777b538SAndroid Build Coastguard Worker# 122*6777b538SAndroid Build Coastguard Worker# - Don't call exec_script inside declare_args. This will execute the script 123*6777b538SAndroid Build Coastguard Worker# even if the value is overridden, which is wasteful. See first bullet. 124*6777b538SAndroid Build Coastguard Worker 125*6777b538SAndroid Build Coastguard Workerdeclare_args() { 126*6777b538SAndroid Build Coastguard Worker # Set to enable the official build level of optimization. This has nothing 127*6777b538SAndroid Build Coastguard Worker # to do with branding, but enables an additional level of optimization above 128*6777b538SAndroid Build Coastguard Worker # release (!is_debug). This might be better expressed as a tri-state 129*6777b538SAndroid Build Coastguard Worker # (debug, release, official) but for historical reasons there are two 130*6777b538SAndroid Build Coastguard Worker # separate flags. 131*6777b538SAndroid Build Coastguard Worker # 132*6777b538SAndroid Build Coastguard Worker # IMPORTANT NOTE: (!is_debug) is *not* sufficient to get satisfying 133*6777b538SAndroid Build Coastguard Worker # performance. In particular, DCHECK()s are still enabled for release builds, 134*6777b538SAndroid Build Coastguard Worker # which can halve overall performance, and do increase memory usage. Always 135*6777b538SAndroid Build Coastguard Worker # set "is_official_build" to true for any build intended to ship to end-users. 136*6777b538SAndroid Build Coastguard Worker is_official_build = false 137*6777b538SAndroid Build Coastguard Worker 138*6777b538SAndroid Build Coastguard Worker # Set to true when compiling with the Clang compiler. 139*6777b538SAndroid Build Coastguard Worker is_clang = current_os != "linux" || 140*6777b538SAndroid Build Coastguard Worker (current_cpu != "s390x" && current_cpu != "s390" && 141*6777b538SAndroid Build Coastguard Worker current_cpu != "ppc64" && current_cpu != "ppc" && 142*6777b538SAndroid Build Coastguard Worker current_cpu != "mips" && current_cpu != "mips64" && 143*6777b538SAndroid Build Coastguard Worker current_cpu != "riscv64") 144*6777b538SAndroid Build Coastguard Worker 145*6777b538SAndroid Build Coastguard Worker # Allows the path to a custom target toolchain to be injected as a single 146*6777b538SAndroid Build Coastguard Worker # argument, and set as the default toolchain. 147*6777b538SAndroid Build Coastguard Worker custom_toolchain = "" 148*6777b538SAndroid Build Coastguard Worker 149*6777b538SAndroid Build Coastguard Worker # This should not normally be set as a build argument. It's here so that 150*6777b538SAndroid Build Coastguard Worker # every toolchain can pass through the "global" value via toolchain_args(). 151*6777b538SAndroid Build Coastguard Worker host_toolchain = "" 152*6777b538SAndroid Build Coastguard Worker 153*6777b538SAndroid Build Coastguard Worker # Do not set this directly. 154*6777b538SAndroid Build Coastguard Worker # It should be set only by //build/toolchains/android:robolectric_x64. 155*6777b538SAndroid Build Coastguard Worker # True when compiling native code for use with robolectric_binary(). 156*6777b538SAndroid Build Coastguard Worker is_robolectric = false 157*6777b538SAndroid Build Coastguard Worker 158*6777b538SAndroid Build Coastguard Worker # DON'T ADD MORE FLAGS HERE. Read the comment above. 159*6777b538SAndroid Build Coastguard Worker} 160*6777b538SAndroid Build Coastguard Worker 161*6777b538SAndroid Build Coastguard Workerdeclare_args() { 162*6777b538SAndroid Build Coastguard Worker # Debug build. Enabling official builds automatically sets is_debug to false. 163*6777b538SAndroid Build Coastguard Worker is_debug = !is_official_build 164*6777b538SAndroid Build Coastguard Worker} 165*6777b538SAndroid Build Coastguard Worker 166*6777b538SAndroid Build Coastguard Workerdeclare_args() { 167*6777b538SAndroid Build Coastguard Worker # Component build. Setting to true compiles targets declared as "components" 168*6777b538SAndroid Build Coastguard Worker # as shared libraries loaded dynamically. This speeds up development time. 169*6777b538SAndroid Build Coastguard Worker # When false, components will be linked statically. 170*6777b538SAndroid Build Coastguard Worker # 171*6777b538SAndroid Build Coastguard Worker # For more information see 172*6777b538SAndroid Build Coastguard Worker # https://chromium.googlesource.com/chromium/src/+/main/docs/component_build.md 173*6777b538SAndroid Build Coastguard Worker is_component_build = is_debug && current_os != "ios" 174*6777b538SAndroid Build Coastguard Worker} 175*6777b538SAndroid Build Coastguard Worker 176*6777b538SAndroid Build Coastguard Workerassert(!(is_debug && is_official_build), "Can't do official debug builds") 177*6777b538SAndroid Build Coastguard Workerassert(!(current_os == "ios" && is_component_build), 178*6777b538SAndroid Build Coastguard Worker "Can't use component build on iOS") 179*6777b538SAndroid Build Coastguard Worker 180*6777b538SAndroid Build Coastguard Workerdeclare_args() { 181*6777b538SAndroid Build Coastguard Worker # Unsafe buffers. Location of file used by plugins to track portions of 182*6777b538SAndroid Build Coastguard Worker # the codebase which have been made manifestly safe. 183*6777b538SAndroid Build Coastguard Worker clang_unsafe_buffers_paths = "" 184*6777b538SAndroid Build Coastguard Worker} 185*6777b538SAndroid Build Coastguard Worker 186*6777b538SAndroid Build Coastguard Worker# ============================================================================== 187*6777b538SAndroid Build Coastguard Worker# TOOLCHAIN SETUP 188*6777b538SAndroid Build Coastguard Worker# ============================================================================== 189*6777b538SAndroid Build Coastguard Worker# 190*6777b538SAndroid Build Coastguard Worker# Here we set the default toolchain, as well as the variable host_toolchain 191*6777b538SAndroid Build Coastguard Worker# which will identify the toolchain corresponding to the local system when 192*6777b538SAndroid Build Coastguard Worker# doing cross-compiles. When not cross-compiling, this will be the same as the 193*6777b538SAndroid Build Coastguard Worker# default toolchain. 194*6777b538SAndroid Build Coastguard Worker# 195*6777b538SAndroid Build Coastguard Worker# We do this before anything else to make sure we complain about any 196*6777b538SAndroid Build Coastguard Worker# unsupported os/cpu combinations as early as possible. 197*6777b538SAndroid Build Coastguard Worker 198*6777b538SAndroid Build Coastguard Workerif (host_toolchain == "") { 199*6777b538SAndroid Build Coastguard Worker # This should only happen in the top-level context. 200*6777b538SAndroid Build Coastguard Worker # In a specific toolchain context, the toolchain_args() 201*6777b538SAndroid Build Coastguard Worker # block should have propagated a value down. 202*6777b538SAndroid Build Coastguard Worker # TODO(dpranke): Add some sort of assert here that verifies that 203*6777b538SAndroid Build Coastguard Worker # no toolchain omitted host_toolchain from its toolchain_args(). 204*6777b538SAndroid Build Coastguard Worker 205*6777b538SAndroid Build Coastguard Worker if (host_os == "linux") { 206*6777b538SAndroid Build Coastguard Worker if (target_os != "linux") { 207*6777b538SAndroid Build Coastguard Worker host_toolchain = "//build/toolchain/linux:clang_$host_cpu" 208*6777b538SAndroid Build Coastguard Worker } else if (is_clang) { 209*6777b538SAndroid Build Coastguard Worker host_toolchain = "//build/toolchain/linux:clang_$host_cpu" 210*6777b538SAndroid Build Coastguard Worker } else { 211*6777b538SAndroid Build Coastguard Worker host_toolchain = "//build/toolchain/linux:$host_cpu" 212*6777b538SAndroid Build Coastguard Worker } 213*6777b538SAndroid Build Coastguard Worker } else if (host_os == "mac") { 214*6777b538SAndroid Build Coastguard Worker host_toolchain = "//build/toolchain/mac:clang_$host_cpu" 215*6777b538SAndroid Build Coastguard Worker } else if (host_os == "win") { 216*6777b538SAndroid Build Coastguard Worker # On Windows always use the target CPU for host builds for x86/x64. On the 217*6777b538SAndroid Build Coastguard Worker # configurations we support this will always work and it saves build steps. 218*6777b538SAndroid Build Coastguard Worker # Windows ARM64 targets require an x64 host for cross build. 219*6777b538SAndroid Build Coastguard Worker if (target_cpu == "x86" || target_cpu == "x64") { 220*6777b538SAndroid Build Coastguard Worker if (is_clang) { 221*6777b538SAndroid Build Coastguard Worker host_toolchain = "//build/toolchain/win:win_clang_$target_cpu" 222*6777b538SAndroid Build Coastguard Worker } else { 223*6777b538SAndroid Build Coastguard Worker host_toolchain = "//build/toolchain/win:$target_cpu" 224*6777b538SAndroid Build Coastguard Worker } 225*6777b538SAndroid Build Coastguard Worker } else if (is_clang) { 226*6777b538SAndroid Build Coastguard Worker host_toolchain = "//build/toolchain/win:win_clang_$host_cpu" 227*6777b538SAndroid Build Coastguard Worker } else { 228*6777b538SAndroid Build Coastguard Worker host_toolchain = "//build/toolchain/win:$host_cpu" 229*6777b538SAndroid Build Coastguard Worker } 230*6777b538SAndroid Build Coastguard Worker } else if (host_os == "aix") { 231*6777b538SAndroid Build Coastguard Worker host_toolchain = "//build/toolchain/aix:$host_cpu" 232*6777b538SAndroid Build Coastguard Worker } else if (host_os == "zos") { 233*6777b538SAndroid Build Coastguard Worker host_toolchain = "//build/toolchain/zos:$host_cpu" 234*6777b538SAndroid Build Coastguard Worker } else { 235*6777b538SAndroid Build Coastguard Worker assert(false, "Unsupported host_os: $host_os") 236*6777b538SAndroid Build Coastguard Worker } 237*6777b538SAndroid Build Coastguard Worker} 238*6777b538SAndroid Build Coastguard Worker 239*6777b538SAndroid Build Coastguard Worker_default_toolchain = "" 240*6777b538SAndroid Build Coastguard Worker 241*6777b538SAndroid Build Coastguard Workerif (target_os == "android") { 242*6777b538SAndroid Build Coastguard Worker assert(host_os == "linux", "Android builds are only supported on Linux.") 243*6777b538SAndroid Build Coastguard Worker _default_toolchain = "//build/toolchain/android:android_clang_$target_cpu" 244*6777b538SAndroid Build Coastguard Worker} else if (target_os == "chromeos" || target_os == "linux") { 245*6777b538SAndroid Build Coastguard Worker # See comments in build/toolchain/cros/BUILD.gn about board compiles. 246*6777b538SAndroid Build Coastguard Worker if (is_clang) { 247*6777b538SAndroid Build Coastguard Worker _default_toolchain = "//build/toolchain/linux:clang_$target_cpu" 248*6777b538SAndroid Build Coastguard Worker } else { 249*6777b538SAndroid Build Coastguard Worker _default_toolchain = "//build/toolchain/linux:$target_cpu" 250*6777b538SAndroid Build Coastguard Worker } 251*6777b538SAndroid Build Coastguard Worker} else if (target_os == "fuchsia") { 252*6777b538SAndroid Build Coastguard Worker _default_toolchain = "//build/toolchain/fuchsia:$target_cpu" 253*6777b538SAndroid Build Coastguard Worker} else if (target_os == "ios") { 254*6777b538SAndroid Build Coastguard Worker _default_toolchain = "//build/toolchain/ios:ios_clang_$target_cpu" 255*6777b538SAndroid Build Coastguard Worker} else if (target_os == "mac") { 256*6777b538SAndroid Build Coastguard Worker assert(host_os == "mac" || host_os == "linux", 257*6777b538SAndroid Build Coastguard Worker "Mac cross-compiles are unsupported.") 258*6777b538SAndroid Build Coastguard Worker _default_toolchain = "//build/toolchain/mac:clang_$target_cpu" 259*6777b538SAndroid Build Coastguard Worker} else if (target_os == "win") { 260*6777b538SAndroid Build Coastguard Worker # On Windows, we use the same toolchain for host and target by default. 261*6777b538SAndroid Build Coastguard Worker # Beware, win cross builds have some caveats, see docs/win_cross.md 262*6777b538SAndroid Build Coastguard Worker if (is_clang) { 263*6777b538SAndroid Build Coastguard Worker _default_toolchain = "//build/toolchain/win:win_clang_$target_cpu" 264*6777b538SAndroid Build Coastguard Worker } else { 265*6777b538SAndroid Build Coastguard Worker _default_toolchain = "//build/toolchain/win:$target_cpu" 266*6777b538SAndroid Build Coastguard Worker } 267*6777b538SAndroid Build Coastguard Worker} else if (target_os == "winuwp") { 268*6777b538SAndroid Build Coastguard Worker # Only target WinUWP on for a Windows store application and only 269*6777b538SAndroid Build Coastguard Worker # x86, x64 and arm are supported target CPUs. 270*6777b538SAndroid Build Coastguard Worker assert(target_cpu == "x86" || target_cpu == "x64" || target_cpu == "arm" || 271*6777b538SAndroid Build Coastguard Worker target_cpu == "arm64") 272*6777b538SAndroid Build Coastguard Worker _default_toolchain = "//build/toolchain/win:uwp_$target_cpu" 273*6777b538SAndroid Build Coastguard Worker} else if (target_os == "aix") { 274*6777b538SAndroid Build Coastguard Worker _default_toolchain = "//build/toolchain/aix:$target_cpu" 275*6777b538SAndroid Build Coastguard Worker} else if (target_os == "zos") { 276*6777b538SAndroid Build Coastguard Worker _default_toolchain = "//build/toolchain/zos:$target_cpu" 277*6777b538SAndroid Build Coastguard Worker} else { 278*6777b538SAndroid Build Coastguard Worker assert(false, "Unsupported target_os: $target_os") 279*6777b538SAndroid Build Coastguard Worker} 280*6777b538SAndroid Build Coastguard Worker 281*6777b538SAndroid Build Coastguard Worker# If a custom toolchain has been set in the args, set it as default. Otherwise, 282*6777b538SAndroid Build Coastguard Worker# set the default toolchain for the platform (if any). 283*6777b538SAndroid Build Coastguard Workerif (custom_toolchain != "") { 284*6777b538SAndroid Build Coastguard Worker set_default_toolchain(custom_toolchain) 285*6777b538SAndroid Build Coastguard Worker} else if (_default_toolchain != "") { 286*6777b538SAndroid Build Coastguard Worker set_default_toolchain(_default_toolchain) 287*6777b538SAndroid Build Coastguard Worker} 288*6777b538SAndroid Build Coastguard Worker 289*6777b538SAndroid Build Coastguard Worker# ============================================================================= 290*6777b538SAndroid Build Coastguard Worker# OS DEFINITIONS 291*6777b538SAndroid Build Coastguard Worker# ============================================================================= 292*6777b538SAndroid Build Coastguard Worker# 293*6777b538SAndroid Build Coastguard Worker# We set these various is_FOO booleans for convenience in writing OS-based 294*6777b538SAndroid Build Coastguard Worker# conditions. 295*6777b538SAndroid Build Coastguard Worker# 296*6777b538SAndroid Build Coastguard Worker# - is_android, is_chromeos, is_ios, and is_win should be obvious. 297*6777b538SAndroid Build Coastguard Worker# - is_mac is set only for desktop Mac. It is not set on iOS. 298*6777b538SAndroid Build Coastguard Worker# - is_posix is true for mac and any Unix-like system (basically everything 299*6777b538SAndroid Build Coastguard Worker# except Fuchsia and Windows). 300*6777b538SAndroid Build Coastguard Worker# - is_linux is true for desktop Linux, but not for ChromeOS nor Android (which 301*6777b538SAndroid Build Coastguard Worker# is generally too different despite being based on the Linux kernel). 302*6777b538SAndroid Build Coastguard Worker# 303*6777b538SAndroid Build Coastguard Worker# Do not add more is_* variants here for random lesser-used Unix systems like 304*6777b538SAndroid Build Coastguard Worker# aix or one of the BSDs. If you need to check these, just check the 305*6777b538SAndroid Build Coastguard Worker# current_os value directly. 306*6777b538SAndroid Build Coastguard Worker 307*6777b538SAndroid Build Coastguard Workeris_android = current_os == "android" 308*6777b538SAndroid Build Coastguard Workeris_chromeos = current_os == "chromeos" 309*6777b538SAndroid Build Coastguard Workeris_fuchsia = current_os == "fuchsia" 310*6777b538SAndroid Build Coastguard Workeris_ios = current_os == "ios" 311*6777b538SAndroid Build Coastguard Workeris_linux = current_os == "linux" 312*6777b538SAndroid Build Coastguard Workeris_mac = current_os == "mac" 313*6777b538SAndroid Build Coastguard Workeris_nacl = current_os == "nacl" 314*6777b538SAndroid Build Coastguard Workeris_win = current_os == "win" || current_os == "winuwp" 315*6777b538SAndroid Build Coastguard Worker 316*6777b538SAndroid Build Coastguard Workeris_apple = is_ios || is_mac 317*6777b538SAndroid Build Coastguard Workeris_posix = !is_win && !is_fuchsia 318*6777b538SAndroid Build Coastguard Worker 319*6777b538SAndroid Build Coastguard Worker# ============================================================================= 320*6777b538SAndroid Build Coastguard Worker# TARGET DEFAULTS 321*6777b538SAndroid Build Coastguard Worker# ============================================================================= 322*6777b538SAndroid Build Coastguard Worker# 323*6777b538SAndroid Build Coastguard Worker# Set up the default configuration for every build target of the given type. 324*6777b538SAndroid Build Coastguard Worker# The values configured here will be automatically set on the scope of the 325*6777b538SAndroid Build Coastguard Worker# corresponding target. Target definitions can add or remove to the settings 326*6777b538SAndroid Build Coastguard Worker# here as needed. 327*6777b538SAndroid Build Coastguard Worker# 328*6777b538SAndroid Build Coastguard Worker# WHAT GOES HERE? 329*6777b538SAndroid Build Coastguard Worker# 330*6777b538SAndroid Build Coastguard Worker# Other than the main compiler and linker configs, the only reason for a config 331*6777b538SAndroid Build Coastguard Worker# to be in this list is if some targets need to explicitly override that config 332*6777b538SAndroid Build Coastguard Worker# by removing it. This is how targets opt-out of flags. If you don't have that 333*6777b538SAndroid Build Coastguard Worker# requirement and just need to add a config everywhere, reference it as a 334*6777b538SAndroid Build Coastguard Worker# sub-config of an existing one, most commonly the main "compiler" one. 335*6777b538SAndroid Build Coastguard Worker 336*6777b538SAndroid Build Coastguard Worker# Holds all configs used for running the compiler. 337*6777b538SAndroid Build Coastguard Workerdefault_compiler_configs = [ 338*6777b538SAndroid Build Coastguard Worker "//build/config:feature_flags", 339*6777b538SAndroid Build Coastguard Worker "//build/config/compiler:afdo", 340*6777b538SAndroid Build Coastguard Worker "//build/config/compiler:afdo_optimize_size", 341*6777b538SAndroid Build Coastguard Worker "//build/config/compiler:cet_shadow_stack", 342*6777b538SAndroid Build Coastguard Worker "//build/config/compiler:chromium_code", 343*6777b538SAndroid Build Coastguard Worker "//build/config/compiler:compiler", 344*6777b538SAndroid Build Coastguard Worker "//build/config/compiler:compiler_arm_fpu", 345*6777b538SAndroid Build Coastguard Worker "//build/config/compiler:compiler_arm_thumb", 346*6777b538SAndroid Build Coastguard Worker "//build/config/compiler:default_include_dirs", 347*6777b538SAndroid Build Coastguard Worker "//build/config/compiler:default_init_stack_vars", 348*6777b538SAndroid Build Coastguard Worker "//build/config/compiler:default_optimization", 349*6777b538SAndroid Build Coastguard Worker "//build/config/compiler:default_stack_frames", 350*6777b538SAndroid Build Coastguard Worker "//build/config/compiler:default_symbols", 351*6777b538SAndroid Build Coastguard Worker "//build/config/compiler:no_exceptions", 352*6777b538SAndroid Build Coastguard Worker "//build/config/compiler:no_rtti", 353*6777b538SAndroid Build Coastguard Worker "//build/config/compiler:no_unresolved_symbols", 354*6777b538SAndroid Build Coastguard Worker "//build/config/compiler:runtime_library", 355*6777b538SAndroid Build Coastguard Worker "//build/config/compiler:thin_archive", 356*6777b538SAndroid Build Coastguard Worker "//build/config/compiler:thinlto_optimize_default", 357*6777b538SAndroid Build Coastguard Worker "//build/config/compiler/pgo:default_pgo_flags", 358*6777b538SAndroid Build Coastguard Worker "//build/config/coverage:default_coverage", 359*6777b538SAndroid Build Coastguard Worker "//build/config/sanitizers:default_sanitizer_flags", 360*6777b538SAndroid Build Coastguard Worker] 361*6777b538SAndroid Build Coastguard Worker 362*6777b538SAndroid Build Coastguard Workerif (is_win) { 363*6777b538SAndroid Build Coastguard Worker default_compiler_configs += [ 364*6777b538SAndroid Build Coastguard Worker "//build/config/win:default_cfg_compiler", 365*6777b538SAndroid Build Coastguard Worker "//build/config/win:default_crt", 366*6777b538SAndroid Build Coastguard Worker "//build/config/win:lean_and_mean", 367*6777b538SAndroid Build Coastguard Worker "//build/config/win:nominmax", 368*6777b538SAndroid Build Coastguard Worker "//build/config/win:unicode", 369*6777b538SAndroid Build Coastguard Worker "//build/config/win:winver", 370*6777b538SAndroid Build Coastguard Worker ] 371*6777b538SAndroid Build Coastguard Worker} 372*6777b538SAndroid Build Coastguard Worker 373*6777b538SAndroid Build Coastguard Workerif (is_apple) { 374*6777b538SAndroid Build Coastguard Worker default_compiler_configs += [ "//build/config/compiler:enable_arc" ] 375*6777b538SAndroid Build Coastguard Worker} 376*6777b538SAndroid Build Coastguard Worker 377*6777b538SAndroid Build Coastguard Workerif (is_posix) { 378*6777b538SAndroid Build Coastguard Worker if (current_os != "aix") { 379*6777b538SAndroid Build Coastguard Worker default_compiler_configs += 380*6777b538SAndroid Build Coastguard Worker [ "//build/config/gcc:symbol_visibility_hidden" ] 381*6777b538SAndroid Build Coastguard Worker } 382*6777b538SAndroid Build Coastguard Worker} 383*6777b538SAndroid Build Coastguard Worker 384*6777b538SAndroid Build Coastguard Workerif (is_fuchsia) { 385*6777b538SAndroid Build Coastguard Worker default_compiler_configs += [ "//build/config/gcc:symbol_visibility_hidden" ] 386*6777b538SAndroid Build Coastguard Worker} 387*6777b538SAndroid Build Coastguard Worker 388*6777b538SAndroid Build Coastguard Workerif (is_android) { 389*6777b538SAndroid Build Coastguard Worker default_compiler_configs += 390*6777b538SAndroid Build Coastguard Worker [ "//build/config/android:default_orderfile_instrumentation" ] 391*6777b538SAndroid Build Coastguard Worker} 392*6777b538SAndroid Build Coastguard Worker 393*6777b538SAndroid Build Coastguard Workerif (is_clang && !is_nacl) { 394*6777b538SAndroid Build Coastguard Worker default_compiler_configs += [ 395*6777b538SAndroid Build Coastguard Worker "//build/config/clang:extra_warnings", 396*6777b538SAndroid Build Coastguard Worker "//build/config/clang:find_bad_constructs", 397*6777b538SAndroid Build Coastguard Worker "//build/config/clang:unsafe_buffers", 398*6777b538SAndroid Build Coastguard Worker ] 399*6777b538SAndroid Build Coastguard Worker} 400*6777b538SAndroid Build Coastguard Worker 401*6777b538SAndroid Build Coastguard Worker# Debug/release-related defines. 402*6777b538SAndroid Build Coastguard Workerif (is_debug) { 403*6777b538SAndroid Build Coastguard Worker default_compiler_configs += [ "//build/config:debug" ] 404*6777b538SAndroid Build Coastguard Worker} else { 405*6777b538SAndroid Build Coastguard Worker default_compiler_configs += [ "//build/config:release" ] 406*6777b538SAndroid Build Coastguard Worker} 407*6777b538SAndroid Build Coastguard Worker 408*6777b538SAndroid Build Coastguard Worker# Static libraries and source sets use only the compiler ones. 409*6777b538SAndroid Build Coastguard Workerset_defaults("static_library") { 410*6777b538SAndroid Build Coastguard Worker configs = default_compiler_configs 411*6777b538SAndroid Build Coastguard Worker} 412*6777b538SAndroid Build Coastguard Workerset_defaults("source_set") { 413*6777b538SAndroid Build Coastguard Worker configs = default_compiler_configs 414*6777b538SAndroid Build Coastguard Worker} 415*6777b538SAndroid Build Coastguard Workerset_defaults("rust_library") { 416*6777b538SAndroid Build Coastguard Worker configs = default_compiler_configs 417*6777b538SAndroid Build Coastguard Worker} 418*6777b538SAndroid Build Coastguard Worker 419*6777b538SAndroid Build Coastguard Worker# Compute the set of configs common to all linked targets (shared libraries, 420*6777b538SAndroid Build Coastguard Worker# loadable modules, executables) to avoid duplication below. 421*6777b538SAndroid Build Coastguard Workerif (is_win) { 422*6777b538SAndroid Build Coastguard Worker # Many targets remove these configs, so they are not contained within 423*6777b538SAndroid Build Coastguard Worker # //build/config:executable_config for easy removal. 424*6777b538SAndroid Build Coastguard Worker _linker_configs = [ 425*6777b538SAndroid Build Coastguard Worker "//build/config/win:default_incremental_linking", 426*6777b538SAndroid Build Coastguard Worker 427*6777b538SAndroid Build Coastguard Worker # Default to console-mode apps. Most of our targets are tests and such 428*6777b538SAndroid Build Coastguard Worker # that shouldn't use the windows subsystem. 429*6777b538SAndroid Build Coastguard Worker "//build/config/win:console", 430*6777b538SAndroid Build Coastguard Worker ] 431*6777b538SAndroid Build Coastguard Worker} else if (is_apple) { 432*6777b538SAndroid Build Coastguard Worker _linker_configs = [ "//build/config/apple:strip_all" ] 433*6777b538SAndroid Build Coastguard Worker} else { 434*6777b538SAndroid Build Coastguard Worker _linker_configs = [] 435*6777b538SAndroid Build Coastguard Worker} 436*6777b538SAndroid Build Coastguard Worker 437*6777b538SAndroid Build Coastguard Worker# Executable defaults. 438*6777b538SAndroid Build Coastguard Workerdefault_executable_configs = default_compiler_configs + [ 439*6777b538SAndroid Build Coastguard Worker "//build/config/compiler:export_dynamic", 440*6777b538SAndroid Build Coastguard Worker "//build/config:default_libs", 441*6777b538SAndroid Build Coastguard Worker "//build/config:executable_config", 442*6777b538SAndroid Build Coastguard Worker ] + _linker_configs 443*6777b538SAndroid Build Coastguard Worker 444*6777b538SAndroid Build Coastguard Workerif (is_win) { 445*6777b538SAndroid Build Coastguard Worker # Turn on linker CFI for executables, and position it so it can be removed 446*6777b538SAndroid Build Coastguard Worker # if needed. 447*6777b538SAndroid Build Coastguard Worker default_executable_configs += [ "//build/config/win:cfi_linker" ] 448*6777b538SAndroid Build Coastguard Worker} 449*6777b538SAndroid Build Coastguard Workerif (is_fuchsia) { 450*6777b538SAndroid Build Coastguard Worker # Sometimes executables are linked by rustc passing a command line to 451*6777b538SAndroid Build Coastguard Worker # clang++. It includes "-pie" which is pointless on Fuchsia. Suppress the 452*6777b538SAndroid Build Coastguard Worker # resulting (fatal) warning. Unfortunately there's no way to do this only 453*6777b538SAndroid Build Coastguard Worker # for binaries linked by rustc; gn does not make the distinction. 454*6777b538SAndroid Build Coastguard Worker default_executable_configs += 455*6777b538SAndroid Build Coastguard Worker [ "//build/config/fuchsia:rustc_no_pie_warning" ] 456*6777b538SAndroid Build Coastguard Worker} 457*6777b538SAndroid Build Coastguard Worker 458*6777b538SAndroid Build Coastguard Workerset_defaults("executable") { 459*6777b538SAndroid Build Coastguard Worker configs = default_executable_configs 460*6777b538SAndroid Build Coastguard Worker} 461*6777b538SAndroid Build Coastguard Worker 462*6777b538SAndroid Build Coastguard Worker# Shared library and loadable module defaults (also for components in component 463*6777b538SAndroid Build Coastguard Worker# mode). 464*6777b538SAndroid Build Coastguard Workerdefault_shared_library_configs = default_compiler_configs + [ 465*6777b538SAndroid Build Coastguard Worker "//build/config:default_libs", 466*6777b538SAndroid Build Coastguard Worker "//build/config:shared_library_config", 467*6777b538SAndroid Build Coastguard Worker ] + _linker_configs 468*6777b538SAndroid Build Coastguard Workerif (is_win) { 469*6777b538SAndroid Build Coastguard Worker # Turn on linker CFI for DLLs, and position it so it can be removed if needed. 470*6777b538SAndroid Build Coastguard Worker default_shared_library_configs += [ "//build/config/win:cfi_linker" ] 471*6777b538SAndroid Build Coastguard Worker} 472*6777b538SAndroid Build Coastguard Worker 473*6777b538SAndroid Build Coastguard Workerif (is_android) { 474*6777b538SAndroid Build Coastguard Worker # Strip native JNI exports from shared libraries by default. Binaries that 475*6777b538SAndroid Build Coastguard Worker # want this can remove this config. 476*6777b538SAndroid Build Coastguard Worker default_shared_library_configs += 477*6777b538SAndroid Build Coastguard Worker [ "//build/config/android:hide_all_but_jni_onload" ] 478*6777b538SAndroid Build Coastguard Worker} 479*6777b538SAndroid Build Coastguard Workerif (is_fuchsia) { 480*6777b538SAndroid Build Coastguard Worker # Sometimes shared libraries are linked by rustc passing a command line to 481*6777b538SAndroid Build Coastguard Worker # clang++. It includes "-pie" which is pointless on Fuchsia. Suppress the 482*6777b538SAndroid Build Coastguard Worker # resulting (fatal) warning. Unfortunately there's no way to do this only 483*6777b538SAndroid Build Coastguard Worker # for binaries linked by rustc; gn does not make the distinction. 484*6777b538SAndroid Build Coastguard Worker default_shared_library_configs += 485*6777b538SAndroid Build Coastguard Worker [ "//build/config/fuchsia:rustc_no_pie_warning" ] 486*6777b538SAndroid Build Coastguard Worker} 487*6777b538SAndroid Build Coastguard Workerset_defaults("shared_library") { 488*6777b538SAndroid Build Coastguard Worker configs = default_shared_library_configs 489*6777b538SAndroid Build Coastguard Worker} 490*6777b538SAndroid Build Coastguard Workerset_defaults("loadable_module") { 491*6777b538SAndroid Build Coastguard Worker configs = default_shared_library_configs 492*6777b538SAndroid Build Coastguard Worker 493*6777b538SAndroid Build Coastguard Worker # loadable_modules are generally used by other libs, not just via JNI. 494*6777b538SAndroid Build Coastguard Worker if (is_android) { 495*6777b538SAndroid Build Coastguard Worker configs -= [ "//build/config/android:hide_all_but_jni_onload" ] 496*6777b538SAndroid Build Coastguard Worker } 497*6777b538SAndroid Build Coastguard Worker} 498*6777b538SAndroid Build Coastguard Worker 499*6777b538SAndroid Build Coastguard Workerdefault_rust_proc_macro_configs = 500*6777b538SAndroid Build Coastguard Worker default_shared_library_configs + [ "//build/rust:proc_macro_extern" ] + 501*6777b538SAndroid Build Coastguard Worker # Rust proc macros don't support (Thin)LTO, so always remove it. 502*6777b538SAndroid Build Coastguard Worker [ 503*6777b538SAndroid Build Coastguard Worker "//build/config/compiler:thinlto_optimize_default", 504*6777b538SAndroid Build Coastguard Worker "//build/config/compiler:thinlto_optimize_max", 505*6777b538SAndroid Build Coastguard Worker ] - 506*6777b538SAndroid Build Coastguard Worker [ 507*6777b538SAndroid Build Coastguard Worker "//build/config/compiler:thinlto_optimize_default", 508*6777b538SAndroid Build Coastguard Worker "//build/config/compiler:thinlto_optimize_max", 509*6777b538SAndroid Build Coastguard Worker ] 510*6777b538SAndroid Build Coastguard Worker 511*6777b538SAndroid Build Coastguard Workerset_defaults("rust_proc_macro") { 512*6777b538SAndroid Build Coastguard Worker configs = default_rust_proc_macro_configs 513*6777b538SAndroid Build Coastguard Worker} 514*6777b538SAndroid Build Coastguard Worker 515*6777b538SAndroid Build Coastguard Worker# A helper for forwarding testonly and visibility. 516*6777b538SAndroid Build Coastguard Worker# Forwarding "*" does not include variables from outer scopes (to avoid copying 517*6777b538SAndroid Build Coastguard Worker# all globals into each template invocation), so it will not pick up 518*6777b538SAndroid Build Coastguard Worker# file-scoped or outer-template-scoped variables. Normally this behavior is 519*6777b538SAndroid Build Coastguard Worker# desired, but "visibility" and "testonly" are commonly defined in outer scopes. 520*6777b538SAndroid Build Coastguard Worker# Explicitly forwarding them in forward_variables_from() works around this 521*6777b538SAndroid Build Coastguard Worker# nuance. See //build/docs/writing_gn_templates.md#using-forward_variables_from 522*6777b538SAndroid Build Coastguard WorkerTESTONLY_AND_VISIBILITY = [ 523*6777b538SAndroid Build Coastguard Worker "testonly", 524*6777b538SAndroid Build Coastguard Worker "visibility", 525*6777b538SAndroid Build Coastguard Worker] 526*6777b538SAndroid Build Coastguard Worker 527*6777b538SAndroid Build Coastguard Worker# Sets default dependencies for static_library and source_set targets. 528*6777b538SAndroid Build Coastguard Workerforeach(_target_type, 529*6777b538SAndroid Build Coastguard Worker [ 530*6777b538SAndroid Build Coastguard Worker "source_set", 531*6777b538SAndroid Build Coastguard Worker "static_library", 532*6777b538SAndroid Build Coastguard Worker ]) { 533*6777b538SAndroid Build Coastguard Worker template(_target_type) { 534*6777b538SAndroid Build Coastguard Worker target(_target_type, target_name) { 535*6777b538SAndroid Build Coastguard Worker forward_variables_from(invoker, "*", TESTONLY_AND_VISIBILITY) 536*6777b538SAndroid Build Coastguard Worker forward_variables_from(invoker, TESTONLY_AND_VISIBILITY) 537*6777b538SAndroid Build Coastguard Worker if (!defined(inputs)) { 538*6777b538SAndroid Build Coastguard Worker inputs = [] 539*6777b538SAndroid Build Coastguard Worker } 540*6777b538SAndroid Build Coastguard Worker 541*6777b538SAndroid Build Coastguard Worker # Consumed by the unsafe-buffers plugin during compile. 542*6777b538SAndroid Build Coastguard Worker # 543*6777b538SAndroid Build Coastguard Worker # TODO(crbug.com/326584510): Reclient doesn't respect this variable, see 544*6777b538SAndroid Build Coastguard Worker # rbe_bug_326584510_missing_inputs in //build/config/rbe.gni. 545*6777b538SAndroid Build Coastguard Worker _uses_cflags = false 546*6777b538SAndroid Build Coastguard Worker if (defined(sources)) { 547*6777b538SAndroid Build Coastguard Worker foreach(f, sources) { 548*6777b538SAndroid Build Coastguard Worker if (string_replace(f + ".END", ".cc.END", "") != f + ".END" || 549*6777b538SAndroid Build Coastguard Worker string_replace(f + ".END", ".c.END", "") != f + ".END" || 550*6777b538SAndroid Build Coastguard Worker string_replace(f + ".END", ".mm.END", "") != f + ".END" || 551*6777b538SAndroid Build Coastguard Worker string_replace(f + ".END", ".m.END", "") != f + ".END") { 552*6777b538SAndroid Build Coastguard Worker _uses_cflags = true 553*6777b538SAndroid Build Coastguard Worker } 554*6777b538SAndroid Build Coastguard Worker } 555*6777b538SAndroid Build Coastguard Worker } 556*6777b538SAndroid Build Coastguard Worker if (_uses_cflags && clang_unsafe_buffers_paths != "") { 557*6777b538SAndroid Build Coastguard Worker inputs += [ clang_unsafe_buffers_paths ] 558*6777b538SAndroid Build Coastguard Worker } 559*6777b538SAndroid Build Coastguard Worker } 560*6777b538SAndroid Build Coastguard Worker } 561*6777b538SAndroid Build Coastguard Worker} 562*6777b538SAndroid Build Coastguard Worker 563*6777b538SAndroid Build Coastguard Worker# Sets default dependencies for executable and shared_library targets. 564*6777b538SAndroid Build Coastguard Worker# 565*6777b538SAndroid Build Coastguard Worker# Variables 566*6777b538SAndroid Build Coastguard Worker# no_default_deps: If true, no standard dependencies will be added. 567*6777b538SAndroid Build Coastguard Worker# Targets that set this usually also want to remove 568*6777b538SAndroid Build Coastguard Worker# "//build/config/compiler:runtime_library" from configs (to remove 569*6777b538SAndroid Build Coastguard Worker# its subconfig "//build/config/c++:runtime_library"). 570*6777b538SAndroid Build Coastguard Workerforeach(_target_type, 571*6777b538SAndroid Build Coastguard Worker [ 572*6777b538SAndroid Build Coastguard Worker "executable", 573*6777b538SAndroid Build Coastguard Worker "loadable_module", 574*6777b538SAndroid Build Coastguard Worker "shared_library", 575*6777b538SAndroid Build Coastguard Worker ]) { 576*6777b538SAndroid Build Coastguard Worker template(_target_type) { 577*6777b538SAndroid Build Coastguard Worker # Alias "target_name" because it is clobbered by forward_variables_from(). 578*6777b538SAndroid Build Coastguard Worker _target_name = target_name 579*6777b538SAndroid Build Coastguard Worker target(_target_type, _target_name) { 580*6777b538SAndroid Build Coastguard Worker forward_variables_from(invoker, 581*6777b538SAndroid Build Coastguard Worker "*", 582*6777b538SAndroid Build Coastguard Worker TESTONLY_AND_VISIBILITY + [ "no_default_deps" ]) 583*6777b538SAndroid Build Coastguard Worker forward_variables_from(invoker, TESTONLY_AND_VISIBILITY) 584*6777b538SAndroid Build Coastguard Worker if (!defined(inputs)) { 585*6777b538SAndroid Build Coastguard Worker inputs = [] 586*6777b538SAndroid Build Coastguard Worker } 587*6777b538SAndroid Build Coastguard Worker 588*6777b538SAndroid Build Coastguard Worker # Consumed by the unsafe-buffers plugin during compile. 589*6777b538SAndroid Build Coastguard Worker # 590*6777b538SAndroid Build Coastguard Worker # TODO(crbug.com/326584510): Reclient doesn't respect this variable, see 591*6777b538SAndroid Build Coastguard Worker # rbe_bug_326584510_missing_inputs in //build/config/rbe.gni. 592*6777b538SAndroid Build Coastguard Worker _uses_cflags = false 593*6777b538SAndroid Build Coastguard Worker if (defined(sources)) { 594*6777b538SAndroid Build Coastguard Worker foreach(f, sources) { 595*6777b538SAndroid Build Coastguard Worker if (string_replace(f + ".END", ".cc.END", "") != f + ".END" || 596*6777b538SAndroid Build Coastguard Worker string_replace(f + ".END", ".c.END", "") != f + ".END" || 597*6777b538SAndroid Build Coastguard Worker string_replace(f + ".END", ".mm.END", "") != f + ".END" || 598*6777b538SAndroid Build Coastguard Worker string_replace(f + ".END", ".m.END", "") != f + ".END") { 599*6777b538SAndroid Build Coastguard Worker _uses_cflags = true 600*6777b538SAndroid Build Coastguard Worker } 601*6777b538SAndroid Build Coastguard Worker } 602*6777b538SAndroid Build Coastguard Worker } 603*6777b538SAndroid Build Coastguard Worker if (_uses_cflags && clang_unsafe_buffers_paths != "") { 604*6777b538SAndroid Build Coastguard Worker inputs += [ clang_unsafe_buffers_paths ] 605*6777b538SAndroid Build Coastguard Worker } 606*6777b538SAndroid Build Coastguard Worker 607*6777b538SAndroid Build Coastguard Worker if (!defined(deps)) { 608*6777b538SAndroid Build Coastguard Worker deps = [] 609*6777b538SAndroid Build Coastguard Worker } 610*6777b538SAndroid Build Coastguard Worker if (!defined(invoker.no_default_deps) || !invoker.no_default_deps) { 611*6777b538SAndroid Build Coastguard Worker # This pulls in one of: 612*6777b538SAndroid Build Coastguard Worker # //build/config:executable_deps 613*6777b538SAndroid Build Coastguard Worker # //build/config:loadable_module_deps 614*6777b538SAndroid Build Coastguard Worker # //build/config:shared_library_deps 615*6777b538SAndroid Build Coastguard Worker # (This explicit list is so that grepping for these configs finds where 616*6777b538SAndroid Build Coastguard Worker # they are used.) 617*6777b538SAndroid Build Coastguard Worker deps += [ "//build/config:${_target_type}_deps" ] 618*6777b538SAndroid Build Coastguard Worker } 619*6777b538SAndroid Build Coastguard Worker 620*6777b538SAndroid Build Coastguard Worker # On Android, write shared library output file to metadata. We will use 621*6777b538SAndroid Build Coastguard Worker # this information to, for instance, collect all shared libraries that 622*6777b538SAndroid Build Coastguard Worker # should be packaged into an APK. 623*6777b538SAndroid Build Coastguard Worker if (!defined(invoker.metadata) && (is_android || is_robolectric) && 624*6777b538SAndroid Build Coastguard Worker (_target_type == "shared_library" || 625*6777b538SAndroid Build Coastguard Worker _target_type == "loadable_module")) { 626*6777b538SAndroid Build Coastguard Worker _output_name = _target_name 627*6777b538SAndroid Build Coastguard Worker if (defined(invoker.output_name)) { 628*6777b538SAndroid Build Coastguard Worker _output_name = invoker.output_name 629*6777b538SAndroid Build Coastguard Worker } 630*6777b538SAndroid Build Coastguard Worker 631*6777b538SAndroid Build Coastguard Worker # Remove 'lib' prefix from output name if it exists. 632*6777b538SAndroid Build Coastguard Worker _magic_prefix = "$0x01$0x01" 633*6777b538SAndroid Build Coastguard Worker _output_name = string_replace("${_magic_prefix}${_output_name}", 634*6777b538SAndroid Build Coastguard Worker "${_magic_prefix}lib", 635*6777b538SAndroid Build Coastguard Worker _magic_prefix, 636*6777b538SAndroid Build Coastguard Worker 1) 637*6777b538SAndroid Build Coastguard Worker _output_name = string_replace(_output_name, _magic_prefix, "", 1) 638*6777b538SAndroid Build Coastguard Worker 639*6777b538SAndroid Build Coastguard Worker if (defined(output_extension)) { 640*6777b538SAndroid Build Coastguard Worker _shlib_extension = ".$output_extension" 641*6777b538SAndroid Build Coastguard Worker } else { 642*6777b538SAndroid Build Coastguard Worker _shlib_extension = ".so" 643*6777b538SAndroid Build Coastguard Worker } 644*6777b538SAndroid Build Coastguard Worker 645*6777b538SAndroid Build Coastguard Worker metadata = { 646*6777b538SAndroid Build Coastguard Worker shared_libraries = 647*6777b538SAndroid Build Coastguard Worker [ "$root_out_dir/lib${_output_name}${_shlib_extension}" ] 648*6777b538SAndroid Build Coastguard Worker } 649*6777b538SAndroid Build Coastguard Worker } 650*6777b538SAndroid Build Coastguard Worker } 651*6777b538SAndroid Build Coastguard Worker } 652*6777b538SAndroid Build Coastguard Worker} 653*6777b538SAndroid Build Coastguard Worker 654*6777b538SAndroid Build Coastguard Worker# ============================================================================== 655*6777b538SAndroid Build Coastguard Worker# COMPONENT SETUP 656*6777b538SAndroid Build Coastguard Worker# ============================================================================== 657*6777b538SAndroid Build Coastguard Worker 658*6777b538SAndroid Build Coastguard Worker# Defines a component, which equates to a shared_library when 659*6777b538SAndroid Build Coastguard Worker# is_component_build == true and a static_library otherwise. 660*6777b538SAndroid Build Coastguard Worker# 661*6777b538SAndroid Build Coastguard Worker# Use static libraries for the static build rather than source sets because 662*6777b538SAndroid Build Coastguard Worker# many of of our test binaries link many large dependencies but often don't 663*6777b538SAndroid Build Coastguard Worker# use large portions of them. The static libraries are much more efficient to 664*6777b538SAndroid Build Coastguard Worker# link in this situation since only the necessary object files are linked. 665*6777b538SAndroid Build Coastguard Worker# 666*6777b538SAndroid Build Coastguard Worker# The invoker can override the type of the target in the non-component-build 667*6777b538SAndroid Build Coastguard Worker# case by setting static_component_type to either "source_set" or 668*6777b538SAndroid Build Coastguard Worker# "static_library". If unset, the default will be used. 669*6777b538SAndroid Build Coastguard Workertemplate("component") { 670*6777b538SAndroid Build Coastguard Worker if (is_component_build) { 671*6777b538SAndroid Build Coastguard Worker _component_mode = "shared_library" 672*6777b538SAndroid Build Coastguard Worker 673*6777b538SAndroid Build Coastguard Worker # Generate a unique output_name for a shared library if not set by invoker. 674*6777b538SAndroid Build Coastguard Worker if (!defined(invoker.output_name)) { 675*6777b538SAndroid Build Coastguard Worker _output_name = get_label_info(":$target_name", "label_no_toolchain") 676*6777b538SAndroid Build Coastguard Worker _output_name = 677*6777b538SAndroid Build Coastguard Worker string_replace(_output_name, "$target_name:$target_name", target_name) 678*6777b538SAndroid Build Coastguard Worker _output_name = string_replace(_output_name, "//", "") 679*6777b538SAndroid Build Coastguard Worker _output_name = string_replace(_output_name, "/", "_") 680*6777b538SAndroid Build Coastguard Worker _output_name = string_replace(_output_name, ":", "_") 681*6777b538SAndroid Build Coastguard Worker } 682*6777b538SAndroid Build Coastguard Worker } else if (defined(invoker.static_component_type)) { 683*6777b538SAndroid Build Coastguard Worker assert(invoker.static_component_type == "static_library" || 684*6777b538SAndroid Build Coastguard Worker invoker.static_component_type == "source_set") 685*6777b538SAndroid Build Coastguard Worker _component_mode = invoker.static_component_type 686*6777b538SAndroid Build Coastguard Worker } else if (!defined(invoker.sources) || invoker.sources == []) { 687*6777b538SAndroid Build Coastguard Worker # When there are no sources defined, use a source set to avoid creating 688*6777b538SAndroid Build Coastguard Worker # an empty static library (which generally don't work). 689*6777b538SAndroid Build Coastguard Worker _component_mode = "source_set" 690*6777b538SAndroid Build Coastguard Worker } else { 691*6777b538SAndroid Build Coastguard Worker _component_mode = "static_library" 692*6777b538SAndroid Build Coastguard Worker } 693*6777b538SAndroid Build Coastguard Worker target(_component_mode, target_name) { 694*6777b538SAndroid Build Coastguard Worker if (defined(_output_name)) { 695*6777b538SAndroid Build Coastguard Worker output_name = _output_name 696*6777b538SAndroid Build Coastguard Worker } 697*6777b538SAndroid Build Coastguard Worker if (is_component_build && is_android) { 698*6777b538SAndroid Build Coastguard Worker # By appending .cr, we prevent name collisions with libraries already 699*6777b538SAndroid Build Coastguard Worker # loaded by the Android zygote. 700*6777b538SAndroid Build Coastguard Worker output_extension = "cr.so" 701*6777b538SAndroid Build Coastguard Worker } 702*6777b538SAndroid Build Coastguard Worker forward_variables_from(invoker, TESTONLY_AND_VISIBILITY) 703*6777b538SAndroid Build Coastguard Worker forward_variables_from(invoker, "*", TESTONLY_AND_VISIBILITY) 704*6777b538SAndroid Build Coastguard Worker } 705*6777b538SAndroid Build Coastguard Worker} 706*6777b538SAndroid Build Coastguard Worker 707*6777b538SAndroid Build Coastguard Worker# Component defaults 708*6777b538SAndroid Build Coastguard Worker# Set a variable since we also want to make this available 709*6777b538SAndroid Build Coastguard Worker# to mixed_component.gni 710*6777b538SAndroid Build Coastguard Workerif (is_component_build) { 711*6777b538SAndroid Build Coastguard Worker default_component_configs = default_shared_library_configs 712*6777b538SAndroid Build Coastguard Worker if (is_android) { 713*6777b538SAndroid Build Coastguard Worker default_component_configs -= 714*6777b538SAndroid Build Coastguard Worker [ "//build/config/android:hide_all_but_jni_onload" ] 715*6777b538SAndroid Build Coastguard Worker } 716*6777b538SAndroid Build Coastguard Worker} else { 717*6777b538SAndroid Build Coastguard Worker default_component_configs = default_compiler_configs 718*6777b538SAndroid Build Coastguard Worker} 719*6777b538SAndroid Build Coastguard Worker 720*6777b538SAndroid Build Coastguard Workerset_defaults("component") { 721*6777b538SAndroid Build Coastguard Worker configs = default_component_configs 722*6777b538SAndroid Build Coastguard Worker} 723*6777b538SAndroid Build Coastguard Worker 724*6777b538SAndroid Build Coastguard Worker# ============================================================================= 725*6777b538SAndroid Build Coastguard Worker# ACTION OVERRIDE 726*6777b538SAndroid Build Coastguard Worker# ============================================================================= 727*6777b538SAndroid Build Coastguard Worker# 728*6777b538SAndroid Build Coastguard Worker# We override gn action() to support remote execution using rewrapper. The 729*6777b538SAndroid Build Coastguard Worker# invoker should set allow_remote to true if remote execution is desired. 730*6777b538SAndroid Build Coastguard Worker# 731*6777b538SAndroid Build Coastguard Worker# As remote execution requires inputs to be made more explicit than is normally 732*6777b538SAndroid Build Coastguard Worker# expected with gn, you may find that setting allow_remote to true will result 733*6777b538SAndroid Build Coastguard Worker# in many missing file errors. In most cases, this should be resolved by 734*6777b538SAndroid Build Coastguard Worker# explicitly declaring these inputs/sources. 735*6777b538SAndroid Build Coastguard Worker# 736*6777b538SAndroid Build Coastguard Worker# However, it may be impractical to determine these inputs in gn. For such 737*6777b538SAndroid Build Coastguard Worker# cases, the invoker can specify a custom input processor, which are currently 738*6777b538SAndroid Build Coastguard Worker# defined and implemented in //build/util/action_remote.py. The appropriate 739*6777b538SAndroid Build Coastguard Worker# value should be set using the custom_processor arg. 740*6777b538SAndroid Build Coastguard Worker 741*6777b538SAndroid Build Coastguard Worker# Variables needed by rbe.gni aren't available at the top of this file. 742*6777b538SAndroid Build Coastguard Workerimport("//build/toolchain/rbe.gni") 743*6777b538SAndroid Build Coastguard Workerimport("//build/toolchain/siso.gni") 744*6777b538SAndroid Build Coastguard Worker 745*6777b538SAndroid Build Coastguard Worker# TODO(b/253987456): Add action_foreach support. 746*6777b538SAndroid Build Coastguard Workerforeach(_target_type, [ "action" ]) { 747*6777b538SAndroid Build Coastguard Worker template(_target_type) { 748*6777b538SAndroid Build Coastguard Worker forward_variables_from(invoker, TESTONLY_AND_VISIBILITY) 749*6777b538SAndroid Build Coastguard Worker action("${target_name}") { 750*6777b538SAndroid Build Coastguard Worker forward_variables_from(invoker, 751*6777b538SAndroid Build Coastguard Worker [ 752*6777b538SAndroid Build Coastguard Worker "args", 753*6777b538SAndroid Build Coastguard Worker "assert_no_deps", 754*6777b538SAndroid Build Coastguard Worker "check_includes", 755*6777b538SAndroid Build Coastguard Worker "configs", 756*6777b538SAndroid Build Coastguard Worker "data_deps", 757*6777b538SAndroid Build Coastguard Worker "data", 758*6777b538SAndroid Build Coastguard Worker "depfile", 759*6777b538SAndroid Build Coastguard Worker "deps", 760*6777b538SAndroid Build Coastguard Worker "metadata", 761*6777b538SAndroid Build Coastguard Worker "outputs", 762*6777b538SAndroid Build Coastguard Worker "pool", 763*6777b538SAndroid Build Coastguard Worker "script", 764*6777b538SAndroid Build Coastguard Worker "public_configs", 765*6777b538SAndroid Build Coastguard Worker "public_deps", 766*6777b538SAndroid Build Coastguard Worker "response_file_contents", 767*6777b538SAndroid Build Coastguard Worker "sources", 768*6777b538SAndroid Build Coastguard Worker "write_runtime_deps", 769*6777b538SAndroid Build Coastguard Worker ]) 770*6777b538SAndroid Build Coastguard Worker allow_remote = false 771*6777b538SAndroid Build Coastguard Worker if (defined(invoker.allow_remote)) { 772*6777b538SAndroid Build Coastguard Worker allow_remote = invoker.allow_remote 773*6777b538SAndroid Build Coastguard Worker } 774*6777b538SAndroid Build Coastguard Worker 775*6777b538SAndroid Build Coastguard Worker # If remote execution is desired, only run remotely when use_remoteexec 776*6777b538SAndroid Build Coastguard Worker # is enabled, and the environment is not nacl. 777*6777b538SAndroid Build Coastguard Worker # Siso doesn't use action_remote.py wrapper because it sends requests to 778*6777b538SAndroid Build Coastguard Worker # Reproxy directly without actions_remote.py/rewrapper. 779*6777b538SAndroid Build Coastguard Worker # TODO(b/259381924): Investigate enabling in nacl config. 780*6777b538SAndroid Build Coastguard Worker if (allow_remote && use_remoteexec && !is_nacl && !use_siso) { 781*6777b538SAndroid Build Coastguard Worker pool = "//build/toolchain:remote_action_pool($default_toolchain)" 782*6777b538SAndroid Build Coastguard Worker script = "//build/util/action_remote.py" 783*6777b538SAndroid Build Coastguard Worker inputs = [ invoker.script ] 784*6777b538SAndroid Build Coastguard Worker 785*6777b538SAndroid Build Coastguard Worker re_inputs = [ rebase_path(invoker.script, rbe_exec_root) ] 786*6777b538SAndroid Build Coastguard Worker if (defined(invoker.inputs)) { 787*6777b538SAndroid Build Coastguard Worker foreach(input, invoker.inputs) { 788*6777b538SAndroid Build Coastguard Worker re_inputs += [ rebase_path(input, rbe_exec_root) ] 789*6777b538SAndroid Build Coastguard Worker inputs += [ input ] 790*6777b538SAndroid Build Coastguard Worker } 791*6777b538SAndroid Build Coastguard Worker } 792*6777b538SAndroid Build Coastguard Worker if (defined(invoker.sources)) { 793*6777b538SAndroid Build Coastguard Worker foreach(source, invoker.sources) { 794*6777b538SAndroid Build Coastguard Worker re_inputs += [ rebase_path(source, rbe_exec_root) ] 795*6777b538SAndroid Build Coastguard Worker } 796*6777b538SAndroid Build Coastguard Worker } 797*6777b538SAndroid Build Coastguard Worker 798*6777b538SAndroid Build Coastguard Worker re_outputs = [] 799*6777b538SAndroid Build Coastguard Worker if (defined(invoker.outputs)) { 800*6777b538SAndroid Build Coastguard Worker foreach(output, invoker.outputs) { 801*6777b538SAndroid Build Coastguard Worker re_outputs += [ rebase_path(output, rbe_exec_root) ] 802*6777b538SAndroid Build Coastguard Worker } 803*6777b538SAndroid Build Coastguard Worker } 804*6777b538SAndroid Build Coastguard Worker 805*6777b538SAndroid Build Coastguard Worker # Write input/output lists to files as these can grow extremely large. 806*6777b538SAndroid Build Coastguard Worker re_inputs_file = "$target_gen_dir/${target_name}__remote_inputs.rsp" 807*6777b538SAndroid Build Coastguard Worker write_file(re_inputs_file, re_inputs) 808*6777b538SAndroid Build Coastguard Worker inputs += [ re_inputs_file ] 809*6777b538SAndroid Build Coastguard Worker re_outputs_file = "$target_gen_dir/${target_name}__remote_outputs.rsp" 810*6777b538SAndroid Build Coastguard Worker write_file(re_outputs_file, re_outputs) 811*6777b538SAndroid Build Coastguard Worker 812*6777b538SAndroid Build Coastguard Worker rewrapper_cfg = "$rbe_py_cfg_file" 813*6777b538SAndroid Build Coastguard Worker if (defined(invoker.remote_worker)) { 814*6777b538SAndroid Build Coastguard Worker remote_worker = invoker.remote_worker 815*6777b538SAndroid Build Coastguard Worker assert(remote_worker == "large", 816*6777b538SAndroid Build Coastguard Worker "remote_worker = " + remote_worker + " is not supported") 817*6777b538SAndroid Build Coastguard Worker rewrapper_cfg = "$rbe_py_large_cfg_file" 818*6777b538SAndroid Build Coastguard Worker } 819*6777b538SAndroid Build Coastguard Worker 820*6777b538SAndroid Build Coastguard Worker args = [] 821*6777b538SAndroid Build Coastguard Worker args += [ "$rbe_bin_dir/rewrapper" ] 822*6777b538SAndroid Build Coastguard Worker if (defined(invoker.custom_processor)) { 823*6777b538SAndroid Build Coastguard Worker args += [ "--custom_processor=" + invoker.custom_processor ] 824*6777b538SAndroid Build Coastguard Worker } 825*6777b538SAndroid Build Coastguard Worker 826*6777b538SAndroid Build Coastguard Worker args += [ 827*6777b538SAndroid Build Coastguard Worker "--cfg=" + rewrapper_cfg, 828*6777b538SAndroid Build Coastguard Worker "--exec_root=$rbe_exec_root", 829*6777b538SAndroid Build Coastguard Worker "--input_list_paths=" + rebase_path(re_inputs_file, root_build_dir), 830*6777b538SAndroid Build Coastguard Worker "--output_list_paths=" + rebase_path(re_outputs_file, root_build_dir), 831*6777b538SAndroid Build Coastguard Worker "python3", 832*6777b538SAndroid Build Coastguard Worker rebase_path(invoker.script, root_build_dir), 833*6777b538SAndroid Build Coastguard Worker ] 834*6777b538SAndroid Build Coastguard Worker 835*6777b538SAndroid Build Coastguard Worker if (defined(invoker.args)) { 836*6777b538SAndroid Build Coastguard Worker args += invoker.args 837*6777b538SAndroid Build Coastguard Worker } 838*6777b538SAndroid Build Coastguard Worker } else { 839*6777b538SAndroid Build Coastguard Worker forward_variables_from(invoker, [ "inputs" ]) 840*6777b538SAndroid Build Coastguard Worker not_needed(invoker, 841*6777b538SAndroid Build Coastguard Worker [ 842*6777b538SAndroid Build Coastguard Worker "custom_processor", 843*6777b538SAndroid Build Coastguard Worker "remote_worker", 844*6777b538SAndroid Build Coastguard Worker ]) 845*6777b538SAndroid Build Coastguard Worker } 846*6777b538SAndroid Build Coastguard Worker } 847*6777b538SAndroid Build Coastguard Worker } 848*6777b538SAndroid Build Coastguard Worker} 849