blob: e6ffa374e198bb7232e534eea1543d5737a90678 [file] [log] [blame]
"""
Copyright (C) 2021 The Android Open Source Project
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.
"""
# Configuration transitions for APEX rules.
#
# Transitions are a Bazel mechanism to analyze/build dependencies in a different
# configuration (i.e. options and flags). The APEX transition is applied from a
# top level APEX rule to its dependencies via an outgoing edge, so that the
# dependencies can be built specially for APEXes (vs the platform).
#
# e.g. if an apex A depends on some target T, building T directly as a top level target
# will use a different configuration from building T indirectly as a dependency of A. The
# latter will contain APEX specific configuration settings that its rule or an aspect can
# use to create different actions or providers for APEXes specifically..
#
# The outgoing transitions are similar to ApexInfo propagation in Soong's
# top-down ApexInfoMutator:
# https://cs.android.com/android/platform/superproject/+/master:build/soong/apex/apex.go;l=948-962;drc=539d41b686758eeb86236c0e0dcf75478acb77f3
load("@bazel_skylib//lib:dicts.bzl", "dicts")
def _create_apex_configuration(attr, additional = {}):
return dicts.add({
"//build/bazel/rules/apex:apex_name": attr.name, # Name of the APEX
"//build/bazel/rules/apex:min_sdk_version": attr.min_sdk_version, # Min SDK version of the APEX
}, additional)
def _impl(settings, attr):
# Perform a transition to apply APEX specific build settings on the
# destination target (i.e. an APEX dependency).
return _create_apex_configuration(attr)
apex_transition = transition(
implementation = _impl,
inputs = [],
outputs = [
"//build/bazel/rules/apex:apex_name",
"//build/bazel/rules/apex:min_sdk_version",
],
)
def _impl_shared_lib_transition_32(settings, attr):
# Perform a transition to apply APEX specific build settings on the
# destination target (i.e. an APEX dependency).
direct_deps = [str(dep) for dep in attr.native_shared_libs_32]
# TODO: We need to check if this is a x86 or arm arch then only set one platform
# instead of this 1:2 split to avoid performance hit.
return {
"x86": _create_apex_configuration(attr, {
"//command_line_option:platforms": "//build/bazel/platforms:android_x86",
"//build/bazel/rules/apex:apex_direct_deps": direct_deps,
}),
"arm": _create_apex_configuration(attr, {
"//command_line_option:platforms": "//build/bazel/platforms:android_arm",
"//build/bazel/rules/apex:apex_direct_deps": direct_deps,
}),
}
shared_lib_transition_32 = transition(
implementation = _impl_shared_lib_transition_32,
inputs = [],
outputs = [
"//build/bazel/rules/apex:apex_name",
"//build/bazel/rules/apex:min_sdk_version",
"//build/bazel/rules/apex:apex_direct_deps",
"//command_line_option:platforms",
],
)
def _impl_shared_lib_transition_64(settings, attr):
# Perform a transition to apply APEX specific build settings on the
# destination target (i.e. an APEX dependency).
direct_deps = [str(dep) for dep in attr.native_shared_libs_64]
# TODO: We need to check if this is a x86 or arm arch then only set one platform
# instead of this 1:2 split to avoid performance hit.
return {
"x86_64": _create_apex_configuration(attr, {
"//command_line_option:platforms": "//build/bazel/platforms:android_x86_64",
"//build/bazel/rules/apex:apex_direct_deps": direct_deps,
}),
"arm64": _create_apex_configuration(attr, {
"//command_line_option:platforms": "//build/bazel/platforms:android_arm64",
"//build/bazel/rules/apex:apex_direct_deps": direct_deps,
}),
}
shared_lib_transition_64 = transition(
implementation = _impl_shared_lib_transition_64,
inputs = [],
outputs = [
"//build/bazel/rules/apex:apex_name",
"//build/bazel/rules/apex:min_sdk_version",
"//build/bazel/rules/apex:apex_direct_deps",
"//command_line_option:platforms",
],
)