# Copyright 2018 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. # ============================================================================= # WHAT IS THIS FILE? # ============================================================================= # # This is the master GN build configuration. This file is loaded after the # build args (args.gn) for the build directory and after the toplevel ".gn" # file (which points to this file as the build configuration). # # This file will be executed and the resulting context will be used to execute # every other file in the build. So variables declared here (that don't start # with an underscore) will be implicitly global. # ============================================================================= # PLATFORM SELECTION # ============================================================================= # # There are two main things to set: "os" and "cpu". The "toolchain" is the name # of the GN thing that encodes combinations of these things. # # Users typically only set the variables "target_os" and "target_cpu" in "gn # args", the rest are set up by our build and internal to GN. # # There are three different types of each of these things: The "host" # represents the computer doing the compile and never changes. The "target" # represents the main thing we're trying to build. The "current" represents # which configuration is currently being defined, which can be either the # host, the target, or something completely different. if (target_os == "") { target_os = host_os } if (target_cpu == "") { target_cpu = host_cpu } if (current_cpu == "") { current_cpu = target_cpu } if (current_os == "") { current_os = target_os } # ============================================================================= # BUILD FLAGS # ============================================================================= # # This block lists input arguments to the build, along with their default # values. # # If a value is specified on the command line, it will overwrite the defaults # given in a declare_args block, otherwise the default will be used. # # YOU SHOULD ALMOST NEVER NEED TO ADD FLAGS TO THIS FILE. GN allows any file in # the build to declare build flags. If you need a flag for a single component, # you can just declare it in the corresponding BUILD.gn file. default_clang_base_path = "//third_party/llvm-build/Release+Asserts" declare_args() { # Debug build. Most global debug build flags are declared in # //build/config/BUILD.gn. is_debug = false # By default, we use the clang compiler on both Mac and Linux. To use the # gcc compiler on Linux instead, set is_gcc to true. is_gcc = false clang_base_path = default_clang_base_path # This would not normally be set as a build argument, but rather is used as a # default value during the first parse of this config. All other toolchains # that cause this file to be re-parsed will already have this set. For # further explanation, see # https://gn.googlesource.com/gn/+/refs/heads/master/docs/reference.md#toolchain-overview host_toolchain = "" # Must be enabled for fuzzing targets. use_libfuzzer = false } declare_args() { is_clang = !is_gcc } # ============================================================================== # TOOLCHAIN SETUP # ============================================================================== # # Here we set the host and default toolchains. Currently only Mac and POSIX are # defined. if (host_toolchain == "") { if (current_os == "chromeos" || current_os == "linux") { if (is_clang) { host_toolchain = "//build/toolchain/linux:clang_$host_cpu" } else { host_toolchain = "//build/toolchain/linux:gcc_$host_cpu" } } else if (current_os == "mac") { host_toolchain = "//build/toolchain/mac:clang" } else { # TODO(miu): Windows, and others. assert(false, "Toolchain for current_os is not defined.") } } _default_toolchain = "" if (target_os == "chromeos" || target_os == "linux") { if (is_clang) { _default_toolchain = "//build/toolchain/linux:clang_$target_cpu" } else { _default_toolchain = "//build/toolchain/linux:gcc_$target_cpu" } } else if (target_os == "mac") { assert(host_os == "mac", "Cross-compiling on Mac is not supported.") _default_toolchain = "//build/toolchain/mac:clang" } else { assert(false, "Toolchain for target_os is not defined.") } set_default_toolchain(_default_toolchain) # ============================================================================= # OS DEFINITIONS # ============================================================================= # # We set these various is_FOO booleans for convenience in writing OS-based # conditions. if (current_os == "chromeos" || current_os == "linux") { is_linux = true is_mac = false is_posix = true } else if (current_os == "mac") { is_linux = false is_mac = true is_posix = true } else { # TODO(miu): Windows, and others. assert(false, "is_FOO booleans not defined for current_os.") } # ============================================================================= # TARGET DEFAULTS # ============================================================================= # # Set up the default configuration for every build target of the given type. # The values configured here will be automatically set on the scope of the # corresponding target. Target definitions can add or remove to the settings # here as needed. # All binary targets will get this list of configs by default. _shared_binary_target_configs = [ "//build/config:openscreen_code", "//build/config:no_exceptions", "//build/config:no_rtti", "//build/config:symbol_visibility_hidden", "//build/config:default_sanitizers", "//build/config:default_coverage", "//build/config:compiler_defaults", "//build/config:compiler_cpu_abi", "//build/config:default_optimization", "//build/config:sysroot_runtime_libraries", "//build/config:operating_system_defines", ] # Apply that default list to the binary target types. set_defaults("executable") { configs = _shared_binary_target_configs } set_defaults("static_library") { configs = _shared_binary_target_configs } set_defaults("shared_library") { configs = _shared_binary_target_configs } set_defaults("source_set") { configs = _shared_binary_target_configs }