| # 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. | |
| """ | |
| This transition ensures that the platforms are set to valid Android Platforms. | |
| """ | |
| load("//rules:visibility.bzl", "PROJECT_VISIBILITY") | |
| load("@bazel_skylib//lib:sets.bzl", "sets") | |
| load(":min_sdk_version.bzl", "min_sdk_version") | |
| load(":utils.bzl", "utils") | |
| visibility(PROJECT_VISIBILITY) | |
| _ANDROID_PLATFORMS_SETTING = utils.ANDROID_PLATFORMS_SETTING | |
| def _android_platforms_transition_impl(settings, attrs): | |
| new_settings = dict(settings) | |
| android_platforms = utils.get_android_platforms(settings) | |
| new_platforms = utils.get_cls(settings, "platforms") | |
| # Set the value of --platforms for this target and its dependencies. | |
| # 1. If --android_platforms is set, use a value from that. | |
| # 2. Otherwise, leave --platforms alone (this will probably lead to build errors). | |
| if android_platforms: | |
| # If the current value of --platforms is not one of the values of --android_platforms, change | |
| # it to be the first one. If the current --platforms is part of --android_platforms, leave it | |
| # as-is. | |
| # NOTE: This does not handle aliases at all, so if someone is using aliases with platform | |
| # definitions this check will break. | |
| if not sets.is_subset(sets.make(new_platforms), sets.make(android_platforms)): | |
| new_platforms = [android_platforms[0]] | |
| # We only attempt this transition for rules that have the min_sdk_version attribute and set it explicitly | |
| # We do not transition the value if it was set previously. This can happen if an android_binary | |
| # transitively depends on another android_binary. The value must be consistent throughout | |
| # the entire android_binary configured target graph otherwise actions like Dex Mergining can | |
| # fail. | |
| if getattr(attrs, "min_sdk_version", 0) and not settings.get(min_sdk_version.SETTING, None): | |
| new_settings[min_sdk_version.SETTING] = min_sdk_version.clamp(getattr(attrs, "min_sdk_version", 0)) | |
| new_settings[utils.add_cls_prefix("platforms")] = new_platforms | |
| return new_settings | |
| android_platforms_transition = transition( | |
| implementation = _android_platforms_transition_impl, | |
| inputs = [ | |
| "//command_line_option:android_platforms", | |
| _ANDROID_PLATFORMS_SETTING, | |
| "//command_line_option:platforms", | |
| min_sdk_version.SETTING, | |
| ], | |
| outputs = [ | |
| "//command_line_option:android_platforms", | |
| _ANDROID_PLATFORMS_SETTING, | |
| "//command_line_option:platforms", | |
| min_sdk_version.SETTING, | |
| ], | |
| ) | |
| testing = struct( | |
| impl = _android_platforms_transition_impl, | |
| ) |