2024-03-05 23:57:21 +00:00
# Copyright 2024 The Bazel Authors. All rights reserved.
#
# 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
#
# http://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.
""" Implementation of the cc_toolchain rule. """
load ( " @bazel_skylib//rules:common_settings.bzl " , " BuildSettingInfo " )
load (
" //cc/toolchains:cc_toolchain_info.bzl " ,
" ActionTypeSetInfo " ,
" ArgsListInfo " ,
" FeatureSetInfo " ,
2024-08-22 15:45:51 +00:00
" ToolConfigInfo " ,
2024-03-05 23:57:21 +00:00
" ToolchainConfigInfo " ,
)
load ( " :collect.bzl " , " collect_action_types " )
2024-03-06 00:04:23 +00:00
load ( " :legacy_converter.bzl " , " convert_toolchain " )
2024-03-05 23:57:21 +00:00
load ( " :toolchain_config_info.bzl " , " toolchain_config_info " )
visibility ( [
" //cc/toolchains/... " ,
" //tests/rule_based_toolchain/... " ,
] )
def _cc_legacy_file_group_impl ( ctx ) :
files = ctx . attr . config [ ToolchainConfigInfo ] . files
return [ DefaultInfo ( files = depset ( transitive = [
files [ action ]
for action in collect_action_types ( ctx . attr . actions ) . to_list ( )
if action in files
] ) ) ]
cc_legacy_file_group = rule (
implementation = _cc_legacy_file_group_impl ,
attrs = {
" actions " : attr . label_list ( providers = [ ActionTypeSetInfo ] , mandatory = True ) ,
" config " : attr . label ( providers = [ ToolchainConfigInfo ] , mandatory = True ) ,
} ,
)
def _cc_toolchain_config_impl ( ctx ) :
if ctx . attr . features :
2024-08-02 02:13:59 +00:00
fail ( " Features is a reserved attribute in bazel. Did you mean ' known_features ' or ' enabled_features ' ? " )
2024-03-05 23:57:21 +00:00
if not ctx . attr . _enabled [ BuildSettingInfo ] . value and not ctx . attr . skip_experimental_flag_validation_for_test :
2024-03-07 15:39:26 +00:00
fail ( " Rule based toolchains are experimental. To use it, please add --@rules_cc//cc/toolchains:experimental_enable_rule_based_toolchains to your bazelrc " )
2024-03-05 23:57:21 +00:00
toolchain_config = toolchain_config_info (
label = ctx . label ,
2024-08-02 02:13:59 +00:00
known_features = ctx . attr . known_features + [ ctx . attr . _builtin_features ] ,
enabled_features = ctx . attr . enabled_features ,
2024-08-22 15:45:51 +00:00
tool_map = ctx . attr . tool_map ,
2024-03-05 23:57:21 +00:00
args = ctx . attr . args ,
)
2024-03-06 00:04:23 +00:00
legacy = convert_toolchain ( toolchain_config )
2024-03-05 23:57:21 +00:00
return [
toolchain_config ,
2024-03-06 00:04:23 +00:00
cc_common . create_cc_toolchain_config_info (
ctx = ctx ,
action_configs = legacy . action_configs ,
features = legacy . features ,
2024-09-05 16:05:23 +00:00
cxx_builtin_include_directories = legacy . cxx_builtin_include_directories ,
2024-04-18 22:46:31 +00:00
# toolchain_identifier is deprecated, but setting it to None results
# in an error that it expected a string, and for safety's sake, I'd
# prefer to provide something unique.
toolchain_identifier = str ( ctx . label ) ,
2024-06-04 04:59:10 +00:00
# These fields are only relevant for legacy toolchain resolution.
target_system_name = " " ,
target_cpu = " " ,
target_libc = " " ,
compiler = " " ,
abi_version = " " ,
abi_libc_version = " " ,
2024-03-06 00:04:23 +00:00
) ,
2024-03-07 04:31:23 +00:00
# This allows us to support all_files.
# If all_files was simply an alias to
# ///cc/toolchains/actions:all_actions,
# then if a toolchain introduced a new type of action, it wouldn't get
# put in all_files.
DefaultInfo ( files = depset ( transitive = toolchain_config . files . values ( ) ) ) ,
2024-03-05 23:57:21 +00:00
]
cc_toolchain_config = rule (
implementation = _cc_toolchain_config_impl ,
# @unsorted-dict-items
attrs = {
2024-03-06 00:04:23 +00:00
# Attributes new to this rule.
2024-08-22 15:45:51 +00:00
" tool_map " : attr . label ( providers = [ ToolConfigInfo ] , mandatory = True ) ,
2024-03-05 23:57:21 +00:00
" args " : attr . label_list ( providers = [ ArgsListInfo ] ) ,
2024-08-02 02:13:59 +00:00
" known_features " : attr . label_list ( providers = [ FeatureSetInfo ] ) ,
" enabled_features " : attr . label_list ( providers = [ FeatureSetInfo ] ) ,
2024-03-05 23:57:21 +00:00
" skip_experimental_flag_validation_for_test " : attr . bool ( default = False ) ,
" _builtin_features " : attr . label ( default = " //cc/toolchains/features:all_builtin_features " ) ,
" _enabled " : attr . label ( default = " //cc/toolchains:experimental_enable_rule_based_toolchains " ) ,
} ,
provides = [ ToolchainConfigInfo ] ,
)