# 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.

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_fuchsia = current_os == "fuchsia"
is_linux = current_os == "linux"
is_mac = current_os == "mac"

declare_args() {
  is_debug = true
}

# Set the host_toolchain
declare_args() {
  host_toolchain = ""
}

# ==============================================================================
# TOOLCHAIN SETUP
# ==============================================================================
#
# Here we set the default toolchain, as well as the variable host_toolchain
# which will identify the toolchain corresponding to the local system when
# doing cross-compiles. When not cross-compiling, this will be the same as the
# default toolchain.
#
# We do this before anything else to make sure we complain about any
# unsupported os/cpu combinations as early as possible.

if (host_toolchain == "") {
  # This should only happen in the top-level context.
  # In a specific toolchain context, the toolchain_args()
  # block should have propagated a value down.

  if (host_os == "linux") {
    host_toolchain = "//build/toolchain/linux:clang_$host_cpu"
  } else if (host_os == "mac") {
    host_toolchain = "//build/toolchain/mac:clang_$host_cpu"
  } else {
    assert(false, "Unsupported host_os: $host_os")
  }
}

# Set toolchain based on target_os and target_cpu
_default_toolchain = ""

if (target_os == "linux") {
  _default_toolchain = "//build/toolchain/linux:clang_$target_cpu"
} else if (target_os == "mac") {
  _default_toolchain = "//build/toolchain/mac:clang_$target_cpu"
} else if (target_os == "fuchsia") {
  _default_toolchain = "//build/toolchain/fuchsia:$target_cpu"
} else {
  assert(false, "Unsupported target_os: $target_os")
}

set_default_toolchain(_default_toolchain)

# Set compiler defaults

# Holds all configs used for running the compiler.
default_compiler_configs = [
  "//build:compiler_defaults",
  "//build/config/compiler:assembler_debug_dir",
  "//build/config/compiler:compiler",
  "//build/config/compiler:compiler_arm_fpu",
  "//build/config/compiler:c++",
  "//build/config/compiler:default_include_dirs",
  "//build/config/compiler:default_optimization",
  "//build/config/compiler:default_symbols",
  "//build/config/compiler:no_exceptions",
  "//build/config/compiler:no_rtti",
  "//build/config/compiler:runtime_library",
  "//build/config/compiler:extra_warnings",
  "//build/config/compiler:symbol_visibility_hidden",
]

# Override the default usage of the system readelf binary to use the local llvm-readelf
# This is used in populate_build_id_dir.py and prepare_package_inputs.py which default to the system readelf
if (host_os == "linux") {
  fuchsia_sdk_readelf_exec = "//buildtools/linux64/clang-linux-amd64/bin/llvm-readelf"
} else if (host_os == "mac") {
  fuchsia_sdk_readelf_exec = "//buildtools/mac64/clang-mac-amd64/bin/llvm-readelf"
} else {
  assert(defined(fuchsia_sdk_readelf_exec), "host_os is not linux or mac: " + host_os)
}

if (is_fuchsia) {
  default_compiler_configs += [
    "//third_party/fuchsia-sdk/build/config:compiler",
    "//third_party/fuchsia-sdk/build/config:runtime_library",
  ]

  # these are additional flags recommended
  default_compiler_configs += [ "//build/config/compiler:default_stack_frames" ]
}

# Debug/release-related defines.
if (is_debug) {
  default_compiler_configs += [ "//build/config:debug" ]
} else {
  default_compiler_configs += [ "//build/config:release" ]
}

# Static libraries and source sets use only the compiler ones.
set_defaults("static_library") {
  configs = default_compiler_configs
}
set_defaults("source_set") {
  configs = default_compiler_configs
}

# Executable defaults.
default_executable_configs = default_compiler_configs + [
                               "//build:executable_ldconfig",
                               "//build/config:default_libs",
                             ]
set_defaults("executable") {
  configs = default_executable_configs
}

# Shared library and loadable module defaults (also for components in component
# mode).
default_shared_library_configs =
    default_compiler_configs + [ "//build/config:default_libs" ]

set_defaults("shared_library") {
  configs = default_shared_library_configs
}
set_defaults("loadable_module") {
  configs = default_shared_library_configs
}

if (is_fuchsia) {
  # Sets default dependencies for executable and shared_library targets.
  #
  # Variables
  #   no_default_deps: If true, no standard dependencies will be added.
  foreach(_target_type,
          [
            "executable",
            "shared_library",
          ]) {
    template(_target_type) {
      target(_target_type, target_name) {
        forward_variables_from(invoker, "*", [ "no_default_deps" ])
        if (!defined(deps)) {
          deps = []
        }
        if (!defined(data_deps)) {
          data_deps = []
        }
        if (!defined(invoker.no_default_deps) || !invoker.no_default_deps) {
          data_deps += [ "//build/config/clang:c++-runtime-deps" ]
          deps += [ "//third_party/fuchsia-sdk/build/config:runtime_library_group" ]
        }
      }
    }
  }
}
