| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- # Part of the Carbon Language project, under the Apache License v2.0 with LLVM
- # Exceptions. See /LICENSE for license information.
- # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- """A Starlark cc_toolchain configuration rule"""
- load("@rules_cc//cc:defs.bzl", "cc_toolchain")
- load("@rules_cc//cc/common:cc_common.bzl", "cc_common")
- load(":cc_toolchain_carbon_project_features.bzl", "carbon_project_features")
- load(":cc_toolchain_cpp_features.bzl", "libcxx_feature")
- load(":cc_toolchain_features.bzl", "clang_cc_toolchain_features")
- load(
- ":cc_toolchain_tools.bzl",
- "llvm_action_configs",
- "llvm_tool_paths",
- )
- load(
- ":clang_detected_variables.bzl",
- "clang_bindir",
- "clang_include_dirs",
- "clang_resource_dir",
- "clang_version_for_cache",
- "llvm_bindir",
- "sysroot_dir",
- )
- def _impl(ctx):
- # Only use a sysroot if one was found when detecting Clang.
- sysroot = None
- if sysroot_dir != "None":
- sysroot = sysroot_dir
- identifier = "local-{0}-{1}".format(ctx.attr.target_cpu, ctx.attr.target_os)
- return cc_common.create_cc_toolchain_config_info(
- ctx = ctx,
- features = clang_cc_toolchain_features(
- target_os = ctx.attr.target_os,
- target_cpu = ctx.attr.target_cpu,
- project_features = carbon_project_features(clang_version_for_cache),
- extra_cpp_features = [libcxx_feature(llvm_bindir, clang_bindir)],
- ),
- action_configs = llvm_action_configs(llvm_bindir, clang_bindir),
- cxx_builtin_include_directories = clang_include_dirs + [
- # Add Clang's resource directory to the end of the builtin include
- # directories to cover the use of sanitizer resource files by the
- # driver.
- clang_resource_dir + "/share",
- ],
- builtin_sysroot = sysroot,
- # This configuration only supports local non-cross builds so derive
- # everything from the target CPU selected.
- toolchain_identifier = identifier,
- # This is used to expose a "flag" that `config_setting` rules can use to
- # determine if the compiler is Clang.
- compiler = "clang",
- # We do have to pass in our tool paths.
- tool_paths = llvm_tool_paths(llvm_bindir, clang_bindir),
- )
- cc_toolchain_config = rule(
- implementation = _impl,
- attrs = {
- "target_cpu": attr.string(mandatory = True),
- "target_os": attr.string(mandatory = True),
- },
- provides = [CcToolchainConfigInfo],
- )
- def cc_local_toolchain_suite(name, configs):
- """Create a toolchain suite that uses the local Clang/LLVM install.
- Args:
- name: The name of the toolchain suite to produce.
- configs: An array of (os, cpu) pairs to support in the toolchain.
- """
- # An empty filegroup to use when stubbing out the toolchains.
- native.filegroup(
- name = name + "_empty",
- srcs = [],
- )
- # Create the individual local toolchains for each CPU.
- for (os, cpu) in configs:
- config_name = "{0}_{1}_{2}".format(name, os, cpu)
- cc_toolchain_config(
- name = config_name + "_config",
- target_os = os,
- target_cpu = cpu,
- )
- cc_toolchain(
- name = config_name + "_tools",
- all_files = ":" + name + "_empty",
- ar_files = ":" + name + "_empty",
- as_files = ":" + name + "_empty",
- compiler_files = ":" + name + "_empty",
- dwp_files = ":" + name + "_empty",
- linker_files = ":" + name + "_empty",
- objcopy_files = ":" + name + "_empty",
- strip_files = ":" + name + "_empty",
- supports_param_files = 1,
- toolchain_config = ":" + config_name + "_config",
- toolchain_identifier = config_name,
- )
- compatible_with = ["@platforms//cpu:" + cpu, "@platforms//os:" + os]
- native.toolchain(
- name = config_name,
- exec_compatible_with = compatible_with,
- target_compatible_with = compatible_with + ["@carbon//bazel/cc_toolchains:stage0"],
- toolchain = config_name + "_tools",
- toolchain_type = "@bazel_tools//tools/cpp:toolchain_type",
- )
|