1*7594170eSAndroid Build Coastguard Worker# Copyright (C) 2021 The Android Open Source Project 2*7594170eSAndroid Build Coastguard Worker# 3*7594170eSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 4*7594170eSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 5*7594170eSAndroid Build Coastguard Worker# You may obtain a copy of the License at 6*7594170eSAndroid Build Coastguard Worker# 7*7594170eSAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 8*7594170eSAndroid Build Coastguard Worker# 9*7594170eSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 10*7594170eSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 11*7594170eSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*7594170eSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 13*7594170eSAndroid Build Coastguard Worker# limitations under the License. 14*7594170eSAndroid Build Coastguard Worker 15*7594170eSAndroid Build Coastguard Worker""" 16*7594170eSAndroid Build Coastguard WorkerConfiguration transitions for APEX rules. 17*7594170eSAndroid Build Coastguard Worker 18*7594170eSAndroid Build Coastguard WorkerTransitions are a Bazel mechanism to analyze/build dependencies in a different 19*7594170eSAndroid Build Coastguard Workerconfiguration (i.e. options and flags). The APEX transition is applied from a 20*7594170eSAndroid Build Coastguard Workertop level APEX rule to its dependencies via an outgoing edge, so that the 21*7594170eSAndroid Build Coastguard Workerdependencies can be built specially for APEXes (vs the platform). 22*7594170eSAndroid Build Coastguard Worker 23*7594170eSAndroid Build Coastguard Workere.g. if an apex A depends on some target T, building T directly as a top level target 24*7594170eSAndroid Build Coastguard Workerwill use a different configuration from building T indirectly as a dependency of A. The 25*7594170eSAndroid Build Coastguard Workerlatter will contain APEX specific configuration settings that its rule or an aspect can 26*7594170eSAndroid Build Coastguard Workeruse to create different actions or providers for APEXes specifically.. 27*7594170eSAndroid Build Coastguard Worker 28*7594170eSAndroid Build Coastguard WorkerThe outgoing transitions are similar to ApexInfo propagation in Soong's 29*7594170eSAndroid Build Coastguard Workertop-down ApexInfoMutator: 30*7594170eSAndroid Build Coastguard Workerhttps://cs.android.com/android/platform/superproject/+/master:build/soong/apex/apex.go;l=948-962;drc=539d41b686758eeb86236c0e0dcf75478acb77f3 31*7594170eSAndroid Build Coastguard Worker""" 32*7594170eSAndroid Build Coastguard Worker 33*7594170eSAndroid Build Coastguard Workerload("@bazel_skylib//lib:collections.bzl", "collections") 34*7594170eSAndroid Build Coastguard Workerload("@bazel_skylib//lib:dicts.bzl", "dicts") 35*7594170eSAndroid Build Coastguard Workerload("//build/bazel/rules/apex:sdk_versions.bzl", "maybe_override_min_sdk_version") 36*7594170eSAndroid Build Coastguard Worker 37*7594170eSAndroid Build Coastguard Workerdef _get_api_domain(apex_name, base_apex_name): 38*7594170eSAndroid Build Coastguard Worker # AOSP and Google variants of apexes are part of the same API domain. 39*7594170eSAndroid Build Coastguard Worker # Test apexes and source apexes are part of the same API domain. 40*7594170eSAndroid Build Coastguard Worker # Override test apexes should return the api domain of the overriden test apex 41*7594170eSAndroid Build Coastguard Worker # Return base_apex_name if it is not empty. 42*7594170eSAndroid Build Coastguard Worker if base_apex_name: 43*7594170eSAndroid Build Coastguard Worker # TODO (b/282058578): Deprecate this special handling. 44*7594170eSAndroid Build Coastguard Worker # TODO: This does not handle special cases like test1_com.android.tzdata. 45*7594170eSAndroid Build Coastguard Worker # This is fine for now since tzdata does not have native code. 46*7594170eSAndroid Build Coastguard Worker return base_apex_name.lstrip("test_") 47*7594170eSAndroid Build Coastguard Worker 48*7594170eSAndroid Build Coastguard Worker return apex_name 49*7594170eSAndroid Build Coastguard Worker 50*7594170eSAndroid Build Coastguard Workerdef _create_apex_configuration(settings, attr, additional = {}): 51*7594170eSAndroid Build Coastguard Worker min_sdk_version = maybe_override_min_sdk_version( 52*7594170eSAndroid Build Coastguard Worker attr.min_sdk_version, 53*7594170eSAndroid Build Coastguard Worker settings["//build/bazel/product_config:apex_global_min_sdk_version_override"], 54*7594170eSAndroid Build Coastguard Worker ) 55*7594170eSAndroid Build Coastguard Worker 56*7594170eSAndroid Build Coastguard Worker apex_name = attr.name 57*7594170eSAndroid Build Coastguard Worker if attr.apex_available_name != "": 58*7594170eSAndroid Build Coastguard Worker apex_name = attr.apex_available_name 59*7594170eSAndroid Build Coastguard Worker 60*7594170eSAndroid Build Coastguard Worker return dicts.add({ 61*7594170eSAndroid Build Coastguard Worker "//build/bazel/rules/apex:apex_name": apex_name, # Name of the APEX 62*7594170eSAndroid Build Coastguard Worker "//build/bazel/rules/apex:base_apex_name": attr.base_apex_name, # Name of the base APEX, if exists 63*7594170eSAndroid Build Coastguard Worker "//build/bazel/rules/apex:min_sdk_version": min_sdk_version, 64*7594170eSAndroid Build Coastguard Worker "//build/bazel/rules/apex:within_apex": True, # Building a APEX 65*7594170eSAndroid Build Coastguard Worker "//build/bazel/rules/apex:api_domain": _get_api_domain(attr.name, attr.base_apex_name), 66*7594170eSAndroid Build Coastguard Worker }, additional) 67*7594170eSAndroid Build Coastguard Worker 68*7594170eSAndroid Build Coastguard Workerdef _impl(settings, attr): 69*7594170eSAndroid Build Coastguard Worker # Perform a transition to apply APEX specific build settings on the 70*7594170eSAndroid Build Coastguard Worker # destination target (i.e. an APEX dependency). 71*7594170eSAndroid Build Coastguard Worker 72*7594170eSAndroid Build Coastguard Worker # At this point, the configurable attributes native_shared_libs_32 and 73*7594170eSAndroid Build Coastguard Worker # native_shared_libs_64 are already resolved according to the lunch target 74*7594170eSAndroid Build Coastguard Worker direct_deps = [str(dep) for dep in attr.native_shared_libs_32] 75*7594170eSAndroid Build Coastguard Worker direct_deps += [str(dep) for dep in attr.native_shared_libs_64] 76*7594170eSAndroid Build Coastguard Worker direct_deps += [str(dep) for dep in attr.binaries] 77*7594170eSAndroid Build Coastguard Worker 78*7594170eSAndroid Build Coastguard Worker return _create_apex_configuration(settings, attr, { 79*7594170eSAndroid Build Coastguard Worker "//build/bazel/rules/apex:apex_direct_deps": collections.uniq(sorted(direct_deps)), 80*7594170eSAndroid Build Coastguard Worker }) 81*7594170eSAndroid Build Coastguard Worker 82*7594170eSAndroid Build Coastguard Worker_TRANSITION_INPUTS = [ 83*7594170eSAndroid Build Coastguard Worker "//build/bazel/product_config:apex_global_min_sdk_version_override", 84*7594170eSAndroid Build Coastguard Worker] 85*7594170eSAndroid Build Coastguard Worker 86*7594170eSAndroid Build Coastguard Worker_TRANSITION_OUTPUTS = [ 87*7594170eSAndroid Build Coastguard Worker "//build/bazel/rules/apex:apex_name", 88*7594170eSAndroid Build Coastguard Worker "//build/bazel/rules/apex:base_apex_name", 89*7594170eSAndroid Build Coastguard Worker "//build/bazel/rules/apex:within_apex", 90*7594170eSAndroid Build Coastguard Worker "//build/bazel/rules/apex:min_sdk_version", 91*7594170eSAndroid Build Coastguard Worker "//build/bazel/rules/apex:apex_direct_deps", 92*7594170eSAndroid Build Coastguard Worker "//build/bazel/rules/apex:api_domain", 93*7594170eSAndroid Build Coastguard Worker] 94*7594170eSAndroid Build Coastguard Worker 95*7594170eSAndroid Build Coastguard Workerapex_transition = transition( 96*7594170eSAndroid Build Coastguard Worker implementation = _impl, 97*7594170eSAndroid Build Coastguard Worker inputs = _TRANSITION_INPUTS, 98*7594170eSAndroid Build Coastguard Worker outputs = _TRANSITION_OUTPUTS, 99*7594170eSAndroid Build Coastguard Worker) 100*7594170eSAndroid Build Coastguard Worker 101*7594170eSAndroid Build Coastguard Worker# The following table describes how target platform of shared_lib_transition_32 and shared_lib_transition_64 102*7594170eSAndroid Build Coastguard Worker# look like when building APEXes for different primary/secondary architecture. 103*7594170eSAndroid Build Coastguard Worker# 104*7594170eSAndroid Build Coastguard Worker# |---------------------------+----------------------------------------------------+----------------------------------------------------| 105*7594170eSAndroid Build Coastguard Worker# | Primary arch | Platform for | Platform for | 106*7594170eSAndroid Build Coastguard Worker# | / Secondary arch | 32b libs transition | 64b libs transition | 107*7594170eSAndroid Build Coastguard Worker# |---------------------------+----------------------------------------------------+----------------------------------------------------| 108*7594170eSAndroid Build Coastguard Worker# | 32bit / N/A | android_target | android_target | 109*7594170eSAndroid Build Coastguard Worker# | (android_target is 32bit) | | (wrong target platform indicates the transition | 110*7594170eSAndroid Build Coastguard Worker# | | | is not needed, and the 64bit libs are not included | 111*7594170eSAndroid Build Coastguard Worker# | | | in APEXes for 32bit devices, see | 112*7594170eSAndroid Build Coastguard Worker# | | | _create_file_mapping() in apex.bzl) | 113*7594170eSAndroid Build Coastguard Worker# |---------------------------+----------------------------------------------------+----------------------------------------------------| 114*7594170eSAndroid Build Coastguard Worker# | 64bit / 32bit | android_target_secondary | android_target | 115*7594170eSAndroid Build Coastguard Worker# | (android_target is 64bit) | | | 116*7594170eSAndroid Build Coastguard Worker# |---------------------------+----------------------------------------------------+----------------------------------------------------| 117*7594170eSAndroid Build Coastguard Worker# | 64bit / N/A | android_target | android_target | 118*7594170eSAndroid Build Coastguard Worker# | (android_target is 64bit) | (wrong target platform indicates the transition | | 119*7594170eSAndroid Build Coastguard Worker# | | is not needed, and the 32bit libs are not included | | 120*7594170eSAndroid Build Coastguard Worker# | | in APEXes for 64bit ONLY devices, see | | 121*7594170eSAndroid Build Coastguard Worker# | | _create_file_mapping() in apex.bzl) | | 122*7594170eSAndroid Build Coastguard Worker# |---------------------------+----------------------------------------------------+----------------------------------------------------| 123*7594170eSAndroid Build Coastguard Worker 124*7594170eSAndroid Build Coastguard Workerdef _impl_shared_lib_transition_32(settings, attr): 125*7594170eSAndroid Build Coastguard Worker # Perform a transition to apply APEX specific build settings on the 126*7594170eSAndroid Build Coastguard Worker # destination target (i.e. an APEX dependency). 127*7594170eSAndroid Build Coastguard Worker 128*7594170eSAndroid Build Coastguard Worker direct_deps = [str(dep) for dep in attr.native_shared_libs_32] 129*7594170eSAndroid Build Coastguard Worker direct_deps += [str(dep) for dep in attr.binaries] 130*7594170eSAndroid Build Coastguard Worker 131*7594170eSAndroid Build Coastguard Worker old_platform = str(settings["//command_line_option:platforms"][0]) 132*7594170eSAndroid Build Coastguard Worker 133*7594170eSAndroid Build Coastguard Worker return _create_apex_configuration(settings, attr, { 134*7594170eSAndroid Build Coastguard Worker "//build/bazel/rules/apex:apex_direct_deps": collections.uniq(sorted(direct_deps)), 135*7594170eSAndroid Build Coastguard Worker "//command_line_option:platforms": old_platform + "_secondary", 136*7594170eSAndroid Build Coastguard Worker }) 137*7594170eSAndroid Build Coastguard Worker 138*7594170eSAndroid Build Coastguard Workershared_lib_transition_32 = transition( 139*7594170eSAndroid Build Coastguard Worker implementation = _impl_shared_lib_transition_32, 140*7594170eSAndroid Build Coastguard Worker inputs = _TRANSITION_INPUTS + ["//command_line_option:platforms"], 141*7594170eSAndroid Build Coastguard Worker outputs = _TRANSITION_OUTPUTS + ["//command_line_option:platforms"], 142*7594170eSAndroid Build Coastguard Worker) 143*7594170eSAndroid Build Coastguard Worker 144*7594170eSAndroid Build Coastguard Workerdef _impl_shared_lib_transition_64(settings, attr): 145*7594170eSAndroid Build Coastguard Worker # Perform a transition to apply APEX specific build settings on the 146*7594170eSAndroid Build Coastguard Worker # destination target (i.e. an APEX dependency). 147*7594170eSAndroid Build Coastguard Worker 148*7594170eSAndroid Build Coastguard Worker direct_deps = [str(dep) for dep in attr.native_shared_libs_64] 149*7594170eSAndroid Build Coastguard Worker direct_deps += [str(dep) for dep in attr.binaries] 150*7594170eSAndroid Build Coastguard Worker 151*7594170eSAndroid Build Coastguard Worker # For the 64 bit transition, we don't actually change the arch, because 152*7594170eSAndroid Build Coastguard Worker # we only read the value of native_shared_libs_64 when the target 153*7594170eSAndroid Build Coastguard Worker # is 64-bit already 154*7594170eSAndroid Build Coastguard Worker return _create_apex_configuration(settings, attr, { 155*7594170eSAndroid Build Coastguard Worker "//build/bazel/rules/apex:apex_direct_deps": collections.uniq(sorted(direct_deps)), 156*7594170eSAndroid Build Coastguard Worker }) 157*7594170eSAndroid Build Coastguard Worker 158*7594170eSAndroid Build Coastguard Workershared_lib_transition_64 = transition( 159*7594170eSAndroid Build Coastguard Worker implementation = _impl_shared_lib_transition_64, 160*7594170eSAndroid Build Coastguard Worker inputs = _TRANSITION_INPUTS, 161*7594170eSAndroid Build Coastguard Worker outputs = _TRANSITION_OUTPUTS, 162*7594170eSAndroid Build Coastguard Worker) 163