xref: /aosp_15_r20/build/bazel/rules/apex/transition.bzl (revision 7594170e27e0732bc44b93d1440d87a54b6ffe7c)
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