# Copyright 2018 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

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

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

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

# 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" ]

# If it's not building a host utility, it's building against the platform so apply the configuration.
if (arch != "host") {
  _shared_binary_target_configs += [ "//build:platform" ]
}

# Apply that default list to the binary target types.
set_defaults("executable") {
  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
}

# The default toolchain is the target toolchain for building utilities and tests.
set_default_toolchain("//build/toolchain:host_clang")
