blob: 8f6030eb4640280676ff8ca275aa4e8d2fb96d0e [file] [log] [blame]
# Copyright The Monogon Project Authors.
# SPDX-License-Identifier: Apache-2.0
load("@rules_cc//cc:action_names.bzl", "CPP_LINK_EXECUTABLE_ACTION_NAME", "C_COMPILE_ACTION_NAME")
load("@rules_cc//cc/common:cc_common.bzl", "cc_common")
load("//build/toolchain/toolchain-bundle:toolchain.bzl", "TOOLCHAIN_ENV_SETUP", "build_toolchain_env")
DISABLED_FEATURES = []
def build_llvm_compiler_env(ctx, cc_toolchain, prefix = ""):
feature_configuration = cc_common.configure_features(
ctx = ctx,
cc_toolchain = cc_toolchain,
requested_features = ctx.features,
unsupported_features = DISABLED_FEATURES + ctx.disabled_features,
)
c_compiler_path = cc_common.get_tool_for_action(
feature_configuration = feature_configuration,
action_name = C_COMPILE_ACTION_NAME,
)
c_compile_variables = cc_common.create_compile_variables(
feature_configuration = feature_configuration,
cc_toolchain = cc_toolchain,
user_compile_flags = ctx.fragments.cpp.copts + ctx.fragments.cpp.conlyopts,
)
c_compiler_flags = cc_common.get_memory_inefficient_command_line(
feature_configuration = feature_configuration,
action_name = C_COMPILE_ACTION_NAME,
variables = c_compile_variables,
)
c_linker_flags = cc_common.get_memory_inefficient_command_line(
feature_configuration = feature_configuration,
action_name = CPP_LINK_EXECUTABLE_ACTION_NAME,
variables = c_compile_variables,
)
# NOTE: Multicall tool is called as path/to/llvm clang to workaround a bug
# in out-of-process execution where tool name is repeated and parsing breaks.
return {
prefix + "CC_PATH": c_compiler_path.rsplit("/", 1)[0],
prefix + "CC": c_compiler_path.rsplit("/", 1)[0] + "/llvm clang",
prefix + "CXX": c_compiler_path.rsplit("/", 1)[0] + "/llvm clang++",
prefix + "LD": c_compiler_path.rsplit("/", 1)[0] + "/ld.lld",
prefix + "AR": c_compiler_path.rsplit("/", 1)[0] + "/llvm-ar",
prefix + "NM": c_compiler_path.rsplit("/", 1)[0] + "/llvm-nm",
prefix + "STRIP": c_compiler_path.rsplit("/", 1)[0] + "/llvm-strip",
prefix + "OBJCOPY": c_compiler_path.rsplit("/", 1)[0] + "/llvm-objcopy",
prefix + "OBJDUMP": c_compiler_path.rsplit("/", 1)[0] + "/llvm-objdump",
prefix + "READELF": c_compiler_path.rsplit("/", 1)[0] + "/llvm-readelf",
prefix + "CFLAGS": " ".join(c_compiler_flags),
prefix + "LDFLAGS": " ".join(c_linker_flags),
}, cc_toolchain.all_files
def merge_env(env, extra_env):
for k, v in extra_env.items():
if k in env:
env[k] += " " + v
else:
env[k] = v
return env
def generate_foreign_build_env(ctx, target_toolchain, exec_toolchain, toolchain_bundle_tools):
env = {}
# Figure out cc_toolchains
target_toolchain_env, target_toolchain_inputs = build_llvm_compiler_env(ctx, target_toolchain)
env = merge_env(env, target_toolchain_env)
exec_toolchain_env, exec_toolchain_inputs = build_llvm_compiler_env(ctx, exec_toolchain, "HOST")
env = merge_env(env, exec_toolchain_env)
# Setup tools from toolchain-bundle.
toolchain_bundle_env, toolchain_bundle_inputs = build_toolchain_env(ctx, toolchain_bundle_tools)
env = merge_env(env, toolchain_bundle_env)
inputs = depset(
transitive = [
target_toolchain_inputs,
exec_toolchain_inputs,
toolchain_bundle_inputs,
],
)
return env, inputs, TOOLCHAIN_ENV_SETUP