# Copyright 2016 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

declare_args() {
  # Debug build.
  is_debug = true
}

if (target_os == "") {
  target_os = "fuchsia"
}
if (target_cpu == "") {
  target_cpu = host_cpu
}
if (current_cpu == "") {
  current_cpu = target_cpu
}
if (current_os == "") {
  current_os = target_os
}

declare_args() {
  # This should not be set as a build argument.
  target_toolchain = ""

  # This should not be set as a build argument.
  host_toolchain = ""

  # Whether the toolchain defaults to PIC.
  is_pic_default = false

  # Use link time optimization (LTO).
  use_lto = false

  # magenta build project
  magenta_project = ""
}

if (magenta_project == "") {
  if (current_cpu == "arm64") {
    magenta_project = "magenta-qemu-arm64"
  } else if (current_cpu == "x64") {
    magenta_project = "magenta-pc-x86-64"
  }
}
assert(magenta_project != "", "unable to set default magenta build project")

is_android = false
is_fuchsia = false
is_fuchsia_host = false
is_ios = false
is_linux = false
is_mac = false
is_win = false
is_clang = true
is_component_build = false
is_official_build = false

if (current_os == "fuchsia") {
  is_fuchsia = true
} else if (current_os == "linux") {
  is_linux = true
  is_fuchsia_host = true
} else if (current_os == "mac") {
  is_mac = true
  is_fuchsia_host = true
}

# All binary targets will get this list of configs by default.
default_shared_binary_configs = [
  "//build/config:compiler",
  "//build/config:relative_paths",
  "//build/config:default_include_dirs",
  "//build/config:default_warnings",
  "//build/config:no_exceptions",
  "//build/config:no_rtti",
  "//build/config:symbol_visibility_hidden",
]

if (is_debug) {
  default_shared_binary_configs += [ "//build/config:debug" ]
} else {
  default_shared_binary_configs += [ "//build/config:release" ]
}

if (is_fuchsia) {
  default_shared_binary_configs += [
    "//build/config/fuchsia:icf",
    "//build/config/fuchsia:safestack",
    "//build/config/fuchsia:thread_safety_annotations",
    "//build/config/fuchsia:werror",
  ]
}

if (use_lto) {
  default_shared_binary_configs += [ "//build/config:lto" ]
}

default_shared_library_configs = default_shared_binary_configs + [
                                   "//build/config:shared_library_config",
                                   "//build/config:symbol_no_undefined",
                                 ]
default_executable_configs = default_shared_binary_configs + [
                               "//build/config:executable_config",
                               "//build/config:default_libs",
                             ]

if (is_pic_default) {
  default_shared_binary_configs += [ "//build/config:shared_library_config" ]
}

# Apply that default list to the binary target types.
set_defaults("source_set") {
  configs = default_shared_binary_configs
}
set_defaults("static_library") {
  configs = default_shared_binary_configs
}
set_defaults("shared_library") {
  configs = default_shared_library_configs
}
set_defaults("loadable_module") {
  configs = default_shared_library_configs
}
set_defaults("executable") {
  configs = default_executable_configs
}

# Some targets we share with Chromium declare themselves to be components,
# which means they can build either as shared libraries or as static libraries.
# We build them as static libraries.
template("component") {
  if (!defined(invoker.sources)) {
    # When there are no sources defined, use a source set to avoid creating
    # an empty static library (which generally don't work).
    _component_mode = "source_set"
  } else {
    _component_mode = "static_library"
  }

  target(_component_mode, target_name) {
    # Explicitly forward visibility, implicitly forward everything else.
    # Forwarding "*" doesn't recurse into nested scopes (to avoid copying all
    # globals into each template invocation), so won't pick up file-scoped
    # variables. Normally this isn't too bad, but visibility is commonly
    # defined at the file scope. Explicitly forwarding visibility and then
    # excluding it from the "*" set works around this problem.
    # See http://crbug.com/594610
    forward_variables_from(invoker, [ "visibility" ])
    forward_variables_from(invoker, "*", [ "visibility" ])
  }
}

set_defaults("component") {
  configs = default_shared_binary_configs
}

if (target_os == "fuchsia") {
  target_toolchain = "//build/toolchain/fuchsia:${target_cpu}"
} else {
  assert(false, "Target OS not supported")
}

if (host_os == "linux" || host_os == "mac") {
  host_toolchain = "//build/toolchain:host_${host_cpu}"
} else {
  assert(false, "Host OS not supported")
}

set_default_toolchain(target_toolchain)

# Some projects expect a default value for sources assigment filters.
sources_assignment_filter = []
