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

import("//build/config/clang/clang.gni")

# Define a number of global variables that are normally defined by the Zircon
# build system. This should only be used when processing Zircon-specific target
# rules under //zircon/ which invoke zx_library() or zx_host_tool()

# `is_gcc` is true for GCC-based toolchains.
is_gcc =
    toolchain_variant.tags + [ "gcc" ] - [ "gcc" ] != toolchain_variant.tags

# `is_kernel` is true for kernel-specific toolchains.
is_kernel = toolchain_variant.tags + [ "kernel" ] - [ "kernel" ] !=
            toolchain_variant.tags

# `toolchain` is a scope used by the Zircon build to describe the current toolchain.
# Its layout is very different from `toolchain_variant` so try to mimic it here.
toolchain = {
  # The `environment` key corresponds to the runtime environment that the
  # binaries generated by the current toolchain will run in.
  if (zircon_toolchain != false) {
    environment = zircon_toolchain.environment
  } else if (is_fuchsia) {
    environment = "user"
  } else if (is_host) {
    environment = "host"
  } else {
    environment = "unknown"
  }

  # The `base_environment` key corresponds to the base runtime environment,
  # which is exactly the same as `environment` except for fuzzing environments
  # as defined by the Zircon builds. In the Fuchsia build, fuzzing is implemented
  # by variants instead, so copying the value of `environment` should be enough.
  base_environment = environment

  # The `shlib` key is defined when there is a companion toolchain that
  # generates shared-library binaries for the current toolchain. It is not
  # defined otherwise.
  if (!toolchain_variant.with_shared) {
    shlib = shlib_toolchain
  }

  # The `libprefix` key is a prefix used to locate the installation path
  # of variant-specific libraries. It is an empty string by default, except
  # in the case of instrumented variants, where it will be
  # "${variant_name}/" instead. As a special case, fuzzer variants use
  # the base variant name (i.e. without the "-fuzzer" suffix).
  libprefix = ""
  if (toolchain_variant.instrumented) {
    libprefix = string_replace(toolchain_variant.name, "-fuzzer", "") + "/"
  }

  # The `target_tuple` is the Clang-specific target tuple matching the
  # binaries generated by the current toolchain, even if it uses GCC
  # instead of Clang.
  target_tuple = clang_target

  # The `cpu` value is the Clang-specific CPU name. Used by Musl C library.
  if (current_cpu == "x64") {
    cpu = "x86_64"
  } else if (current_cpu == "arm64") {
    cpu = "aarch64"
  } else {
    cpu = current_cpu
  }

  # The `tags` value is the list of tags that applies to the current
  # toolchain instance.
  tags = toolchain_variant.tags
}

# This is the name for $current_cpu that's used in Zircon file names.
if (current_cpu == "x64") {
  zircon_cpu = "x86"
} else if (current_cpu != "") {
  zircon_cpu = current_cpu
}
