# 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() {
  # The name of the project being built.
  project = "reference"

  # Enable extra debugging.
  is_debug = true

  # Whether to build against the platform for embedded images consisting of
  # include paths and defines. This is also used for host targets that simulate
  # an embedded image.
  use_platform = false
}

# 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 (use_platform) {
  _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")
