Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / build / config / BUILDCONFIG.gn
index dfa9c3b..7994dd7 100644 (file)
@@ -22,7 +22,8 @@ declare_args() {
   #   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
@@ -63,6 +64,13 @@ declare_args() {
 
   # 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
+  }
 }
 
 # =============================================================================
@@ -283,12 +291,6 @@ set_sources_assignment_filter(sources_assignment_filter)
 # 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)) {
@@ -323,6 +325,7 @@ if (is_win) {
     "//build/config/win:nominmax",
     "//build/config/win:sdk",
     "//build/config/win:unicode",
+    "//build/config/win:winver",
   ]
 }
 if (is_posix) {
@@ -359,14 +362,19 @@ if (is_debug) {
 }
 _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"
@@ -396,39 +404,65 @@ if (is_win) {
   ]
 }
 
+# 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
@@ -469,6 +503,9 @@ if (is_win) {
     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)
@@ -476,3 +513,180 @@ if (is_win) {
   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 }
+    }
+  }
+}