blob: 374ecdcfccae6c631a96088418402edf8f407746 [file] [log] [blame]
# 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
)