# This build configuration extends GN's cross-compilation concepts of "target",
# "host" and "current" with "arch" which is used to refer to the embedded
# architecture that the bare metal images are being built for.
#
# The concepts of "target", "host" and "current" are used when bulding tests
# and utilities for the non-embedded device. Note that there hasn't been any
# thought given to support building for anything other than the host so it
# probably won't work.
#
# In summary:
#  - host{_os,_cpu,_toolchain} is for the system running the build
#  - target{_os,_cpu,_toolchain} is for the system that will run utilities and tests
#  - arch{,_toolchain} is for the embedded system that will run the bare metal images

# Configuration of the build toolchain.
declare_args() {
  # Enable extra debugging.
  is_debug = true

  # Set to true to build with gcc (default is clang).
  use_gcc = false

  # The architecture to build the bare metal images for.
  arch = ""

  # Set by arch toolchain. Prefix for binutils tools.
  arch_tool_prefix = ""
}

# Check that we support the attempted build
assert(host_os == "linux", "Only linux builds are currently supported")

# Check that the requested architecture is supported
assert(arch == "aarch64", "Unsupported arch: $arch")

# Setup the standard variables
if (target_os == "") {
  target_os = host_os
}
if (target_cpu == "") {
  target_cpu = host_cpu
}
if (current_os == "") {
  current_os = target_os
}
if (current_cpu == "") {
  current_cpu = target_cpu
}

assert(target_os == host_os, "Cross compiles not yet supported")
assert(target_cpu == host_cpu, "Cross compiles not yet supported")

# All binary targets will get this list of configs by default
_shared_binary_target_configs = [
  "//build:compiler_defaults",
  "//build:lto",
]

# Apply that default list to the binary target types.
set_defaults("executable") {
  configs = _shared_binary_target_configs
  # Executables get this additional configuration
  configs += [ "//build:executable_ldconfig" ]
}
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
}

# Select host, target and arch toolchains
if (use_gcc) {
  host_toolchain = "//build/toolchain/host:gcc"
  target_toolchain = "//build/toolchain/host:gcc"
  arch_toolchain = "//build/toolchain/arch:gcc_${arch}"
} else {
  host_toolchain = "//build/toolchain/host:clang"
  target_toolchain = "//build/toolchain/host:clang"
  arch_toolchain = "//build/toolchain/arch:clang_${arch}"
}

# The default toolchain is the target toolchain for building utilities and tests
set_default_toolchain(target_toolchain)
