# 2 means regular build with symbols.
# 1 means minimal symbols, usually enough for backtraces only.
# 0 means no symbols.
- symbol_level = 2
+ # -1 means auto-set (off in release, regular in debug).
+ symbol_level = -1
# Component build.
is_component_build = false
# Compile for Thread Sanitizer to find threading bugs.
is_tsan = false
+
+ if (os == "chromeos") {
+ # Allows the target toolchain to be injected as arguments. This is needed
+ # to support the CrOS build system which supports per-build-configuration
+ # toolchains.
+ cros_use_custom_toolchain = false
+ }
}
# =============================================================================
# BUILD OPTIONS
# =============================================================================
-if (is_component_build) {
- component_mode = "shared_library"
-} else {
- component_mode = "source_set"
-}
-
# These Sanitizers all imply using the Clang compiler. On Windows they either
# don't work or work differently.
if (!is_clang && (is_asan || is_lsan || is_tsan || is_msan)) {
"//build/config/win:nominmax",
"//build/config/win:sdk",
"//build/config/win:unicode",
+ "//build/config/win:winver",
]
}
if (is_posix) {
}
_native_compiler_configs += [ _default_optimization_config ]
+# If it wasn't manually set, set to an appropriate default.
+if (symbol_level == -1) {
+ # Linux is slowed by having symbols as part of the target binary, whereas
+ # Mac and Windows have them separate, so in Release Linux, default them off.
+ if (is_debug || !is_linux) {
+ symbol_level = 2
+ } else {
+ symbol_level = 0
+ }
+}
+
# Symbol setup.
-if (is_clang && (is_linux || is_android)) {
- # Clang creates chubby debug information, which makes linking very slow.
- # For now, don't create debug information with clang.
- # See http://crbug.com/70000
- # TODO(brettw) This just copies GYP. Why not do this on Mac as well?
- _default_symbols_config = "//build/config/compiler:no_symbols"
-} else if (symbol_level == 2) {
+if (symbol_level == 2) {
_default_symbols_config = "//build/config/compiler:symbols"
} else if (symbol_level == 1) {
_default_symbols_config = "//build/config/compiler:minimal_symbols"
]
}
+# Executable defaults.
+_executable_configs = _native_compiler_configs + [
+ "//build/config:default_libs",
+]
+if (is_win) {
+ _executable_configs += _windows_linker_configs
+} else if (is_mac) {
+ _executable_configs += [
+ "//build/config/mac:mac_dynamic_flags",
+ "//build/config/mac:mac_executable_flags" ]
+} else if (is_linux || is_android) {
+ _executable_configs += [ "//build/config/gcc:executable_ldconfig" ]
+}
set_defaults("executable") {
- configs = _native_compiler_configs + [
- "//build/config:default_libs",
- ]
- if (is_win) {
- configs += _windows_linker_configs
- } else if (is_mac) {
- configs += [
- "//build/config/mac:mac_dynamic_flags",
- "//build/config/mac:mac_executable_flags" ]
- } else if (is_linux || is_android) {
- configs += [ "//build/config/gcc:executable_ldconfig" ]
- }
+ configs = _executable_configs
}
+# Static library defaults.
set_defaults("static_library") {
configs = _native_compiler_configs
}
+# Shared library defaults (also for components in component mode).
+_shared_library_configs = _native_compiler_configs + [
+ "//build/config:default_libs",
+]
+if (is_win) {
+ _shared_library_configs += _windows_linker_configs
+} else if (is_mac) {
+ _shared_library_configs += [ "//build/config/mac:mac_dynamic_flags" ]
+}
set_defaults("shared_library") {
- configs = _native_compiler_configs + [
- "//build/config:default_libs",
- ]
- if (is_win) {
- configs += _windows_linker_configs
- } else if (is_mac) {
- configs += [ "//build/config/mac:mac_dynamic_flags" ]
+ configs = _shared_library_configs
+}
+if (is_component_build) {
+ set_defaults("component") {
+ configs = _shared_library_configs
}
}
+# Source set defaults (also for components in non-component mode).
set_defaults("source_set") {
configs = _native_compiler_configs
}
+if (!is_component_build) {
+ set_defaults("component") {
+ configs = _native_compiler_configs
+ }
+}
+
+# Test defaults.
+set_defaults("test") {
+ if (is_android) {
+ configs = _shared_library_configs
+ } else {
+ configs = _executable_configs
+ }
+}
+
# ==============================================================================
# TOOLCHAIN SETUP
host_toolchain = "//build/toolchain/linux:$build_cpu_arch"
set_default_toolchain("//build/toolchain/linux:$cpu_arch")
}
+ if (is_chromeos && cros_use_custom_toolchain) {
+ set_default_toolchain("//build/toolchain/cros:target")
+ }
} else if (is_mac) {
host_toolchain = "//build/toolchain/mac:clang"
set_default_toolchain(host_toolchain)
host_toolchain = "//build/toolchain/mac:host_clang"
set_default_toolchain("//build/toolchain/mac:clang")
}
+
+# ==============================================================================
+# COMPONENT SETUP
+# ==============================================================================
+
+# TODO(brettw) erase this once the built-in "component" function is removed.
+if (is_component_build) {
+ component_mode = "shared_library"
+} else {
+ component_mode = "source_set"
+}
+
+template("component") {
+ if (is_component_build) {
+ shared_library(target_name) {
+ # Configs will always be defined since we set_defaults for a component
+ # above. We want to use those rather than whatever came with the nested
+ # shared/static library inside the component.
+ configs = [] # Prevent list overwriting warning.
+ configs = invoker.configs
+
+ # The sources assignment filter will have already been applied when the
+ # code was originally executed. We don't want to apply it again, since
+ # the original target may have override it for some assignments.
+ set_sources_assignment_filter([])
+
+ if (defined(invoker.all_dependent_configs)) { all_dependent_configs = invoker.all_dependent_configs }
+ if (defined(invoker.allow_circular_includes_from)) { allow_circular_includes_from = invoker.allow_circular_includes_from }
+ if (defined(invoker.cflags)) { cflags = invoker.cflags }
+ if (defined(invoker.cflags_c)) { cflags_c = invoker.cflags_c }
+ if (defined(invoker.cflags_cc)) { cflags_cc = invoker.cflags_cc }
+ if (defined(invoker.cflags_objc)) { cflags_objc = invoker.cflags_objc }
+ if (defined(invoker.cflags_objcc)) { cflags_objcc = invoker.cflags_objcc }
+ if (defined(invoker.check_includes)) { check_includes = invoker.check_includes }
+ if (defined(invoker.data)) { data = invoker.data }
+ if (defined(invoker.datadeps)) { datadeps = invoker.datadeps }
+ if (defined(invoker.defines)) { defines = invoker.defines }
+ if (defined(invoker.deps)) { deps = invoker.deps }
+ if (defined(invoker.direct_dependent_configs)) { direct_dependent_configs = invoker.direct_dependent_configs }
+ if (defined(invoker.forward_dependent_configs_from)) { forward_dependent_configs_from = invoker.forward_dependent_configs_from }
+ if (defined(invoker.include_dirs)) { include_dirs = invoker.include_dirs }
+ if (defined(invoker.ldflags)) { ldflags = invoker.ldflags }
+ if (defined(invoker.lib_dirs)) { lib_dirs = invoker.lib_dirs }
+ if (defined(invoker.libs)) { libs = invoker.libs }
+ if (defined(invoker.output_extension)) { output_extension = invoker.output_extension }
+ if (defined(invoker.output_name)) { output_name = invoker.output_name }
+ if (defined(invoker.public)) { public = invoker.public }
+ if (defined(invoker.public_configs)) { public_configs = invoker.public_configs }
+ if (defined(invoker.public_deps)) { public_deps = invoker.public_deps }
+ if (defined(invoker.sources)) { sources = invoker.sources }
+ if (defined(invoker.testonly)) { testonly = invoker.testonly }
+ if (defined(invoker.visibility)) { visibility = invoker.visibility }
+ }
+ } else {
+ source_set(target_name) {
+ # See above.
+ configs = [] # Prevent list overwriting warning.
+ configs = invoker.configs
+
+ # See above call.
+ set_sources_assignment_filter([])
+
+ if (defined(invoker.all_dependent_configs)) { all_dependent_configs = invoker.all_dependent_configs }
+ if (defined(invoker.allow_circular_includes_from)) { allow_circular_includes_from = invoker.allow_circular_includes_from }
+ if (defined(invoker.cflags)) { cflags = invoker.cflags }
+ if (defined(invoker.cflags_c)) { cflags_c = invoker.cflags_c }
+ if (defined(invoker.cflags_cc)) { cflags_cc = invoker.cflags_cc }
+ if (defined(invoker.cflags_objc)) { cflags_objc = invoker.cflags_objc }
+ if (defined(invoker.cflags_objcc)) { cflags_objcc = invoker.cflags_objcc }
+ if (defined(invoker.check_includes)) { check_includes = invoker.check_includes }
+ if (defined(invoker.data)) { data = invoker.data }
+ if (defined(invoker.datadeps)) { datadeps = invoker.datadeps }
+ if (defined(invoker.defines)) { defines = invoker.defines }
+ if (defined(invoker.deps)) { deps = invoker.deps }
+ if (defined(invoker.direct_dependent_configs)) { direct_dependent_configs = invoker.direct_dependent_configs }
+ if (defined(invoker.forward_dependent_configs_from)) { forward_dependent_configs_from = invoker.forward_dependent_configs_from }
+ if (defined(invoker.include_dirs)) { include_dirs = invoker.include_dirs }
+ if (defined(invoker.ldflags)) { ldflags = invoker.ldflags }
+ if (defined(invoker.lib_dirs)) { lib_dirs = invoker.lib_dirs }
+ if (defined(invoker.libs)) { libs = invoker.libs }
+ if (defined(invoker.output_extension)) { output_extension = invoker.output_extension }
+ if (defined(invoker.output_name)) { output_name = invoker.output_name }
+ if (defined(invoker.public)) { public = invoker.public }
+ if (defined(invoker.public_configs)) { public_configs = invoker.public_configs }
+ if (defined(invoker.public_deps)) { public_deps = invoker.public_deps }
+ if (defined(invoker.sources)) { sources = invoker.sources }
+ if (defined(invoker.testonly)) { testonly = invoker.testonly }
+ if (defined(invoker.visibility)) { visibility = invoker.visibility }
+ }
+ }
+}
+
+# ==============================================================================
+# TEST SETUP
+# ==============================================================================
+
+# Define a test as an executable (or shared_library on Android) with the
+# "testonly" flag set.
+template("test") {
+ if (is_android) {
+ shared_library(target_name) {
+ # Configs will always be defined since we set_defaults for a component
+ # above. We want to use those rather than whatever came with the nested
+ # shared/static library inside the component.
+ configs = [] # Prevent list overwriting warning.
+ configs = invoker.configs
+
+ # See above call.
+ set_sources_assignment_filter([])
+
+ testonly = true
+
+ if (defined(invoker.all_dependent_configs)) { all_dependent_configs = invoker.all_dependent_configs }
+ if (defined(invoker.allow_circular_includes_from)) { allow_circular_includes_from = invoker.allow_circular_includes_from }
+ if (defined(invoker.cflags)) { cflags = invoker.cflags }
+ if (defined(invoker.cflags_c)) { cflags_c = invoker.cflags_c }
+ if (defined(invoker.cflags_cc)) { cflags_cc = invoker.cflags_cc }
+ if (defined(invoker.cflags_objc)) { cflags_objc = invoker.cflags_objc }
+ if (defined(invoker.cflags_objcc)) { cflags_objcc = invoker.cflags_objcc }
+ if (defined(invoker.check_includes)) { check_includes = invoker.check_includes }
+ if (defined(invoker.data)) { data = invoker.data }
+ if (defined(invoker.datadeps)) { datadeps = invoker.datadeps }
+ if (defined(invoker.defines)) { defines = invoker.defines }
+ if (defined(invoker.deps)) { deps = invoker.deps }
+ if (defined(invoker.direct_dependent_configs)) { direct_dependent_configs = invoker.direct_dependent_configs }
+ if (defined(invoker.forward_dependent_configs_from)) { forward_dependent_configs_from = invoker.forward_dependent_configs_from }
+ if (defined(invoker.include_dirs)) { include_dirs = invoker.include_dirs }
+ if (defined(invoker.ldflags)) { ldflags = invoker.ldflags }
+ if (defined(invoker.lib_dirs)) { lib_dirs = invoker.lib_dirs }
+ if (defined(invoker.libs)) { libs = invoker.libs }
+ if (defined(invoker.output_extension)) { output_extension = invoker.output_extension }
+ if (defined(invoker.output_name)) { output_name = invoker.output_name }
+ if (defined(invoker.public)) { public = invoker.public }
+ if (defined(invoker.public_configs)) { public_configs = invoker.public_configs }
+ if (defined(invoker.public_deps)) { public_deps = invoker.public_deps }
+ if (defined(invoker.sources)) { sources = invoker.sources }
+ if (defined(invoker.visibility)) { visibility = invoker.visibility }
+ }
+ } else {
+ executable(target_name) {
+ # See above.
+ configs = [] # Prevent list overwriting warning.
+ configs = invoker.configs
+
+ # See above call.
+ set_sources_assignment_filter([])
+
+ testonly = true
+
+ if (defined(invoker.all_dependent_configs)) { all_dependent_configs = invoker.all_dependent_configs }
+ if (defined(invoker.allow_circular_includes_from)) { allow_circular_includes_from = invoker.allow_circular_includes_from }
+ if (defined(invoker.cflags)) { cflags = invoker.cflags }
+ if (defined(invoker.cflags_c)) { cflags_c = invoker.cflags_c }
+ if (defined(invoker.cflags_cc)) { cflags_cc = invoker.cflags_cc }
+ if (defined(invoker.cflags_objc)) { cflags_objc = invoker.cflags_objc }
+ if (defined(invoker.cflags_objcc)) { cflags_objcc = invoker.cflags_objcc }
+ if (defined(invoker.check_includes)) { check_includes = invoker.check_includes }
+ if (defined(invoker.data)) { data = invoker.data }
+ if (defined(invoker.datadeps)) { datadeps = invoker.datadeps }
+ if (defined(invoker.defines)) { defines = invoker.defines }
+ if (defined(invoker.deps)) { deps = invoker.deps }
+ if (defined(invoker.direct_dependent_configs)) { direct_dependent_configs = invoker.direct_dependent_configs }
+ if (defined(invoker.forward_dependent_configs_from)) { forward_dependent_configs_from = invoker.forward_dependent_configs_from }
+ if (defined(invoker.include_dirs)) { include_dirs = invoker.include_dirs }
+ if (defined(invoker.ldflags)) { ldflags = invoker.ldflags }
+ if (defined(invoker.lib_dirs)) { lib_dirs = invoker.lib_dirs }
+ if (defined(invoker.libs)) { libs = invoker.libs }
+ if (defined(invoker.output_extension)) { output_extension = invoker.output_extension }
+ if (defined(invoker.output_name)) { output_name = invoker.output_name }
+ if (defined(invoker.public)) { public = invoker.public }
+ if (defined(invoker.public_configs)) { public_configs = invoker.public_configs }
+ if (defined(invoker.public_deps)) { public_deps = invoker.public_deps }
+ if (defined(invoker.sources)) { sources = invoker.sources }
+ if (defined(invoker.visibility)) { visibility = invoker.visibility }
+ }
+ }
+}