blob: 5b4b6f89729b61aebc77f3b6dfb13ee086306f3d [file] [log] [blame]
# Copyright 2022 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.
"""Create the toolchain defs in a BUILD.bazel file."""
load("@bazel_skylib//lib:selects.bzl", "selects")
_py_toolchain_type = Label("@bazel_tools//tools/python:toolchain_type")
_py_cc_toolchain_type = Label("//python/cc:toolchain_type")
def py_toolchain_suite(*, prefix, user_repository_name, python_version, set_python_version_constraint, **kwargs):
"""For internal use only.
Args:
prefix: Prefix for toolchain target names.
user_repository_name: The name of the user repository.
python_version: The full (X.Y.Z) version of the interpreter.
set_python_version_constraint: True or False as a string.
**kwargs: extra args passed to the `toolchain` calls.
"""
# We have to use a String value here because bzlmod is passing in a
# string as we cannot have list of bools in build rule attribues.
# This if statement does not appear to work unless it is in the
# toolchain file.
if set_python_version_constraint == "True":
major_minor, _, _ = python_version.rpartition(".")
selects.config_setting_group(
name = prefix + "_version_setting",
match_any = [
Label("//python/config_settings:is_python_%s" % v)
for v in [
major_minor,
python_version,
]
],
visibility = ["//visibility:private"],
)
target_settings = [prefix + "_version_setting"]
elif set_python_version_constraint == "False":
target_settings = []
else:
fail(("Invalid set_python_version_constraint value: got {} {}, wanted " +
"either the string 'True' or the string 'False'; " +
"(did you convert bool to string?)").format(
type(set_python_version_constraint),
repr(set_python_version_constraint),
))
native.toolchain(
name = "{prefix}_toolchain".format(prefix = prefix),
toolchain = "@{user_repository_name}//:python_runtimes".format(
user_repository_name = user_repository_name,
),
toolchain_type = _py_toolchain_type,
target_settings = target_settings,
**kwargs
)
native.toolchain(
name = "{prefix}_py_cc_toolchain".format(prefix = prefix),
toolchain = "@{user_repository_name}//:py_cc_toolchain".format(
user_repository_name = user_repository_name,
),
toolchain_type = _py_cc_toolchain_type,
target_settings = target_settings,
**kwargs
)