| # 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. | 
 |  | 
 | """Utility for compiling at Java 8.""" | 
 |  | 
 | load("@platforms//host:constraints.bzl", "HOST_CONSTRAINTS") | 
 |  | 
 | visibility("//tools/...") | 
 |  | 
 | _java_language_version_8_transition = transition( | 
 |     implementation = lambda settings, attr: { | 
 |         "//command_line_option:java_language_version": "8", | 
 |     }, | 
 |     inputs = [], | 
 |     outputs = ["//command_line_option:java_language_version"], | 
 | ) | 
 |  | 
 | def _transition_java_language_8_files_impl(ctx): | 
 |     return [ | 
 |         DefaultInfo( | 
 |             files = depset(ctx.files.files), | 
 |         ), | 
 |     ] | 
 |  | 
 | _transitioned_java_8_files = rule( | 
 |     implementation = _transition_java_language_8_files_impl, | 
 |     attrs = { | 
 |         "files": attr.label_list( | 
 |             allow_files = True, | 
 |             cfg = _java_language_version_8_transition, | 
 |             mandatory = True, | 
 |         ), | 
 |     }, | 
 | ) | 
 |  | 
 | def transition_java_language_8_filegroup(name, files, visibility): | 
 |     _transitioned_java_8_files( | 
 |         name = name, | 
 |         files = files, | 
 |         visibility = visibility, | 
 |     ) | 
 |  | 
 | BZLMOD_ENABLED = str(Label("@bazel_tools//:foo")).startswith("@@") | 
 |  | 
 | IS_HOST_WINDOWS = Label("@platforms//os:windows") in [Label(label) for label in HOST_CONSTRAINTS] | 
 |  | 
 | def _single_binary_toolchain_rule_impl(ctx): | 
 |     return platform_common.ToolchainInfo( | 
 |         binary = ctx.file.binary, | 
 |     ) | 
 |  | 
 | _single_binary_toolchain_rule = rule( | 
 |     implementation = _single_binary_toolchain_rule_impl, | 
 |     attrs = { | 
 |         "binary": attr.label( | 
 |             allow_single_file = True, | 
 |             mandatory = True, | 
 |         ), | 
 |     }, | 
 | ) | 
 |  | 
 | def single_binary_toolchain( | 
 |         *, | 
 |         name, | 
 |         toolchain_type, | 
 |         binary = None, | 
 |         target_compatible_with = [], | 
 |         exec_compatible_with = []): | 
 |     """Declares a toolchain together with its implementation for an optional single binary.""" | 
 |     impl_name = name + "_impl" | 
 |  | 
 |     _single_binary_toolchain_rule( | 
 |         name = impl_name, | 
 |         binary = binary, | 
 |         # Avoid eager loading of the binary, which may come from a remote | 
 |         # repository, in wildcard builds. | 
 |         tags = ["manual"], | 
 |         visibility = ["//visibility:private"], | 
 |     ) | 
 |  | 
 |     native.toolchain( | 
 |         name = name, | 
 |         toolchain_type = toolchain_type, | 
 |         toolchain = ":" + impl_name, | 
 |         target_compatible_with = target_compatible_with, | 
 |         exec_compatible_with = exec_compatible_with, | 
 |         visibility = ["//visibility:private"], | 
 |     ) | 
 |  | 
 | def _current_toolchain_base_impl(ctx, *, toolchain_type): | 
 |     executable = ctx.actions.declare_file(ctx.label.name) | 
 |     ctx.actions.symlink( | 
 |         output = executable, | 
 |         target_file = ctx.toolchains[toolchain_type].binary, | 
 |     ) | 
 |     return DefaultInfo(executable = executable) | 
 |  | 
 | def _make_current_toolchain_rule(toolchain_type): | 
 |     return rule( | 
 |         implementation = lambda ctx: _current_toolchain_base_impl(ctx, toolchain_type = toolchain_type), | 
 |         toolchains = [toolchain_type], | 
 |         executable = True, | 
 |     ) | 
 |  | 
 | current_launcher_binary = _make_current_toolchain_rule("//tools/launcher:launcher_toolchain_type") |