| # Copyright 2023 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. |
| |
| """Allows building Android-specific dependencies with the correct configuration.""" |
| |
| def _android_transition_impl(settings, attr): |
| if not settings["//command_line_option:incompatible_enable_android_toolchain_resolution"]: |
| return {} |
| return { |
| "//command_line_option:platforms": str(attr.platform), |
| "//command_line_option:android_platforms": str(attr.platform), |
| } |
| |
| _android_transition = transition( |
| implementation = _android_transition_impl, |
| inputs = [ |
| "//command_line_option:incompatible_enable_android_toolchain_resolution", |
| ], |
| outputs = [ |
| "//command_line_option:platforms", |
| "//command_line_option:android_platforms", |
| ], |
| ) |
| |
| # TODO(blaze-configurability-team): Consider replacing with platform_data when that is available. |
| def _android_platform_data_impl(ctx): |
| result = [] |
| |
| new_file = ctx.outputs.out |
| original_file = ctx.file.target |
| |
| ctx.actions.symlink( |
| output = new_file, |
| target_file = original_file, |
| ) |
| |
| files = depset(direct = [new_file]) |
| |
| result.append( |
| DefaultInfo( |
| files = files, |
| ), |
| ) |
| |
| return result |
| |
| _android_platform_data = rule( |
| implementation = _android_platform_data_impl, |
| attrs = { |
| "target": attr.label( |
| allow_single_file = True, |
| cfg = _android_transition, |
| ), |
| "platform": attr.label( |
| mandatory = True, |
| ), |
| "out": attr.output(), |
| "_allowlist_function_transition": attr.label( |
| default = "@bazel_tools//tools/allowlists/function_transition_allowlist", |
| ), |
| }, |
| ) |
| |
| def android_genrule( |
| name = "", |
| platform = "", |
| out = "", |
| tags = [], |
| visibility = [], |
| **kwargs): |
| # TODO(jcater): Check for empty name, platform, and outs. |
| |
| # Transition to an Android config. |
| _android_platform_data( |
| name = name, |
| target = ":%s_for_android_%s" % (name, out), |
| out = out, |
| platform = platform, |
| visibility = visibility, |
| ) |
| |
| # The actual genrule. |
| native.genrule( |
| name = "%s_for_android" % name, |
| outs = [ |
| ":%s_for_android_%s" % (name, out), |
| ], |
| tags = tags + ["manual"], |
| visibility = ["//visibility:private"], |
| **kwargs |
| ) |