# Copyright 2019 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 = host_os
}

if (target_cpu == "") {
  target_cpu = host_cpu
}

if (current_cpu == "") {
  current_cpu = target_cpu
}

if (current_os == "") {
  current_os = target_os
}

is_android = false
is_chromeos = 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 this BUILDCONFIG is in use, that means we are running the standalone cobalt
# build, and as such are not in the fuchsia tree.
is_fuchsia_tree = false

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

# Some library targets may be built as different type depending on the target
# platform. This variable specifies the default library type for each target.
if (is_fuchsia) {
  default_library_type = "shared_library"
} else {
  default_library_type = "static_library"
}

cobalt_root = "//"

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

if (is_debug) {
  _shared_binary_target_configs += [
    "//build/config:debug",
    "//build/config/sanitizers:asan",
    "//build/config/sanitizers:ubsan",
    "//build/config/sanitizers:sancov",
  ]
} else {
  _shared_binary_target_configs += [ "//build/config:release" ]
}

# Apply that default list to the binary target types.
set_defaults("executable") {
  configs = _shared_binary_target_configs

  # Executables get this additional configuration.
  configs += [ "//build/config:executable_ldconfig" ]
}

set_defaults("test") {
  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
}

host_toolchain = "//build/toolchain:clang"
set_default_toolchain("//build/toolchain:clang")

target_sysroot = rebase_path("//sysroot")

foreach(_target_type,
        [
          "action",
          "action_foreach",
        ]) {
  template(_target_type) {
    target(_target_type, target_name) {
      forward_variables_from(invoker,
                             "*",
                             [
                               "testonly",
                               "visibility",
                               "metadata",
                             ])
      forward_variables_from(invoker,
                             [
                               "testonly",
                               "visibility",
                             ])

      not_needed([
                   "hermetic_deps",
                   "all_outputs_fresh",
                 ])
    }
  }
}

template("executable") {
  target("executable", target_name) {
    forward_variables_from(invoker, [ "visibility" ])
    forward_variables_from(invoker, "*")

    if (!defined(deps)) {
      deps = []
    }

    if (is_debug) {
      deps += [
        "//build/config/sanitizers:asan_deps",
        "//build/config/sanitizers:ubsan_deps",
      ]
    }
  }
}
