xref: /aosp_15_r20/build/bazel/rules/apex/cc.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 Workerload("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo")
16*7594170eSAndroid Build Coastguard Workerload("//build/bazel/rules:metadata.bzl", "MetadataFileInfo")
17*7594170eSAndroid Build Coastguard Workerload("//build/bazel/rules/cc:cc_library_common.bzl", "parse_apex_sdk_version")
18*7594170eSAndroid Build Coastguard Workerload("//build/bazel/rules/cc:cc_library_shared.bzl", "CcSharedLibraryOutputInfo", "CcStubLibrariesInfo")
19*7594170eSAndroid Build Coastguard Workerload("//build/bazel/rules/cc:cc_stub_library.bzl", "CcStubLibrarySharedInfo")
20*7594170eSAndroid Build Coastguard Workerload("//build/bazel/rules/cc:stripped_cc_common.bzl", "CcUnstrippedInfo")
21*7594170eSAndroid Build Coastguard Workerload("//build/bazel/rules/license:license_aspect.bzl", "license_aspect")
22*7594170eSAndroid Build Coastguard Worker
23*7594170eSAndroid Build Coastguard WorkerApexCcInfo = provider(
24*7594170eSAndroid Build Coastguard Worker    "Info needed to use CC targets in APEXes",
25*7594170eSAndroid Build Coastguard Worker    fields = {
26*7594170eSAndroid Build Coastguard Worker        "provides_native_libs": "Labels of native shared libs that this apex provides.",
27*7594170eSAndroid Build Coastguard Worker        "requires_native_libs": "Labels of native shared libs that this apex requires.",
28*7594170eSAndroid Build Coastguard Worker        "transitive_shared_libs": "File references to transitive .so libs produced by the CC targets and should be included in the APEX.",
29*7594170eSAndroid Build Coastguard Worker    },
30*7594170eSAndroid Build Coastguard Worker)
31*7594170eSAndroid Build Coastguard Worker
32*7594170eSAndroid Build Coastguard WorkerApexCcMkInfo = provider(
33*7594170eSAndroid Build Coastguard Worker    "AndroidMk data about CC targets in APEXes",
34*7594170eSAndroid Build Coastguard Worker    fields = {
35*7594170eSAndroid Build Coastguard Worker        "make_modules_to_install": "List of module names that should be installed into the system, along with this APEX",
36*7594170eSAndroid Build Coastguard Worker    },
37*7594170eSAndroid Build Coastguard Worker)
38*7594170eSAndroid Build Coastguard Worker
39*7594170eSAndroid Build Coastguard Worker# Special libraries that are installed to the bootstrap subdirectory. Bionic
40*7594170eSAndroid Build Coastguard Worker# libraries are assumed to be provided by the system, and installed automatically
41*7594170eSAndroid Build Coastguard Worker# as a symlink to the runtime APEX.
42*7594170eSAndroid Build Coastguard Worker#
43*7594170eSAndroid Build Coastguard Worker# This list is from https://cs.android.com/android/platform/superproject/+/master:build/soong/cc/cc.go;l=1439-1452;drc=9c667416ded33b93a44c5f1894ea23cae6699a17
44*7594170eSAndroid Build Coastguard Worker#
45*7594170eSAndroid Build Coastguard Worker# NOTE: Keep this list in sync with the Soong list.
46*7594170eSAndroid Build Coastguard Worker#
47*7594170eSAndroid Build Coastguard Worker# See cc/binary.go#install for more information.
48*7594170eSAndroid Build Coastguard Workerdef _installed_to_bootstrap(label):
49*7594170eSAndroid Build Coastguard Worker    label = str(label)
50*7594170eSAndroid Build Coastguard Worker
51*7594170eSAndroid Build Coastguard Worker    # hwasan
52*7594170eSAndroid Build Coastguard Worker    if label == "@//prebuilts/clang/host/linux-x86:libclang_rt.hwasan":
53*7594170eSAndroid Build Coastguard Worker        return True
54*7594170eSAndroid Build Coastguard Worker
55*7594170eSAndroid Build Coastguard Worker    # bionic libs
56*7594170eSAndroid Build Coastguard Worker    if label in [
57*7594170eSAndroid Build Coastguard Worker        "@//bionic/libc:libc",
58*7594170eSAndroid Build Coastguard Worker        "@//bionic/libc:libc_hwasan",  # For completeness, but no one should be depending on this.
59*7594170eSAndroid Build Coastguard Worker        "@//bionic/libm:libm",
60*7594170eSAndroid Build Coastguard Worker        "@//bionic/libdl:libdl",
61*7594170eSAndroid Build Coastguard Worker        "@//bionic/libdl_android:libdl_android",
62*7594170eSAndroid Build Coastguard Worker        "@//bionic/linker:linker",
63*7594170eSAndroid Build Coastguard Worker    ]:
64*7594170eSAndroid Build Coastguard Worker        return True
65*7594170eSAndroid Build Coastguard Worker
66*7594170eSAndroid Build Coastguard Worker    return False
67*7594170eSAndroid Build Coastguard Worker
68*7594170eSAndroid Build Coastguard Workerdef has_cc_stubs(target):
69*7594170eSAndroid Build Coastguard Worker    """
70*7594170eSAndroid Build Coastguard Worker    Return True if this target provides stubs.
71*7594170eSAndroid Build Coastguard Worker
72*7594170eSAndroid Build Coastguard Worker    There is no need to check versions of stubs any more, see aosp/1609533.
73*7594170eSAndroid Build Coastguard Worker
74*7594170eSAndroid Build Coastguard Worker    These stable ABI libraries are intentionally omitted from APEXes as they are
75*7594170eSAndroid Build Coastguard Worker    provided from another APEX or the platform.  By omitting them from APEXes, we
76*7594170eSAndroid Build Coastguard Worker    ensure that there are no multiple copies of such libraries on a device.
77*7594170eSAndroid Build Coastguard Worker
78*7594170eSAndroid Build Coastguard Worker    Args:
79*7594170eSAndroid Build Coastguard Worker      target: The target to check for stubs on.
80*7594170eSAndroid Build Coastguard Worker    Returns:
81*7594170eSAndroid Build Coastguard Worker      If the target has cc stubs
82*7594170eSAndroid Build Coastguard Worker    """
83*7594170eSAndroid Build Coastguard Worker    if CcStubLibrarySharedInfo in target:
84*7594170eSAndroid Build Coastguard Worker        # This is a stub lib (direct or transitive).
85*7594170eSAndroid Build Coastguard Worker        return True
86*7594170eSAndroid Build Coastguard Worker
87*7594170eSAndroid Build Coastguard Worker    if CcStubLibrariesInfo in target and target[CcStubLibrariesInfo].has_stubs:
88*7594170eSAndroid Build Coastguard Worker        # Direct deps of the apex. The apex would depend on the source lib, not stub lib,
89*7594170eSAndroid Build Coastguard Worker        # so check for CcStubLibrariesInfo.has_stubs.
90*7594170eSAndroid Build Coastguard Worker        return True
91*7594170eSAndroid Build Coastguard Worker
92*7594170eSAndroid Build Coastguard Worker    return False
93*7594170eSAndroid Build Coastguard Worker
94*7594170eSAndroid Build Coastguard Worker# Check if this target is specified as a direct dependency of the APEX,
95*7594170eSAndroid Build Coastguard Worker# as opposed to a transitive dependency, as the transitivity impacts
96*7594170eSAndroid Build Coastguard Worker# the files that go into an APEX.
97*7594170eSAndroid Build Coastguard Workerdef is_apex_direct_dep(label, ctx):
98*7594170eSAndroid Build Coastguard Worker    apex_direct_deps = ctx.attr._apex_direct_deps[BuildSettingInfo].value
99*7594170eSAndroid Build Coastguard Worker    return str(label) in apex_direct_deps
100*7594170eSAndroid Build Coastguard Worker
101*7594170eSAndroid Build Coastguard WorkerMinSdkVersionInfo = provider(
102*7594170eSAndroid Build Coastguard Worker    "MinSdkVersionInfo provides metadata about the min_sdk_version attribute of a target",
103*7594170eSAndroid Build Coastguard Worker    fields = {
104*7594170eSAndroid Build Coastguard Worker        "apex_inherit": "true if min_sdk_version: \"apex_inherit\" is present on the module",
105*7594170eSAndroid Build Coastguard Worker        "min_sdk_version": "value of min_sdk_version",
106*7594170eSAndroid Build Coastguard Worker    },
107*7594170eSAndroid Build Coastguard Worker)
108*7594170eSAndroid Build Coastguard Worker
109*7594170eSAndroid Build Coastguard Workerdef get_min_sdk_version(ctx):
110*7594170eSAndroid Build Coastguard Worker    """get_min_sdk_version returns the min_sdk_version for the existing target
111*7594170eSAndroid Build Coastguard Worker
112*7594170eSAndroid Build Coastguard Worker    Args:
113*7594170eSAndroid Build Coastguard Worker        ctx (rule context): a rule context
114*7594170eSAndroid Build Coastguard Worker    Returns:
115*7594170eSAndroid Build Coastguard Worker        MinSdkVersionInfo
116*7594170eSAndroid Build Coastguard Worker    """
117*7594170eSAndroid Build Coastguard Worker    min_sdk_version = None
118*7594170eSAndroid Build Coastguard Worker    apex_inherit = False
119*7594170eSAndroid Build Coastguard Worker    if hasattr(ctx.rule.attr, "min_sdk_version"):
120*7594170eSAndroid Build Coastguard Worker        if ctx.rule.attr.min_sdk_version == "apex_inherit":
121*7594170eSAndroid Build Coastguard Worker            apex_inherit = True
122*7594170eSAndroid Build Coastguard Worker        elif ctx.rule.attr.min_sdk_version:
123*7594170eSAndroid Build Coastguard Worker            min_sdk_version = parse_apex_sdk_version(ctx.rule.attr.min_sdk_version)
124*7594170eSAndroid Build Coastguard Worker    else:
125*7594170eSAndroid Build Coastguard Worker        # min_sdk_version in cc targets are represented as features
126*7594170eSAndroid Build Coastguard Worker        for f in ctx.rule.attr.features:
127*7594170eSAndroid Build Coastguard Worker            if f.startswith("sdk_version_"):
128*7594170eSAndroid Build Coastguard Worker                # e.g. sdk_version_29 or sdk_version_10000 or sdk_version_apex_inherit
129*7594170eSAndroid Build Coastguard Worker                sdk_version = f.removeprefix("sdk_version_")
130*7594170eSAndroid Build Coastguard Worker                if sdk_version == "apex_inherit":
131*7594170eSAndroid Build Coastguard Worker                    apex_inherit = True
132*7594170eSAndroid Build Coastguard Worker                elif min_sdk_version == None:
133*7594170eSAndroid Build Coastguard Worker                    min_sdk_version = int(sdk_version)
134*7594170eSAndroid Build Coastguard Worker                else:
135*7594170eSAndroid Build Coastguard Worker                    fail(
136*7594170eSAndroid Build Coastguard Worker                        "found more than one sdk_version feature on {target}; features = {features}",
137*7594170eSAndroid Build Coastguard Worker                        target = ctx.label,
138*7594170eSAndroid Build Coastguard Worker                        features = ctx.rule.attr.features,
139*7594170eSAndroid Build Coastguard Worker                    )
140*7594170eSAndroid Build Coastguard Worker    return MinSdkVersionInfo(
141*7594170eSAndroid Build Coastguard Worker        min_sdk_version = min_sdk_version,
142*7594170eSAndroid Build Coastguard Worker        apex_inherit = apex_inherit,
143*7594170eSAndroid Build Coastguard Worker    )
144*7594170eSAndroid Build Coastguard Worker
145*7594170eSAndroid Build Coastguard Workerdef _validate_min_sdk_version(ctx):
146*7594170eSAndroid Build Coastguard Worker    dep_min_version = get_min_sdk_version(ctx).min_sdk_version
147*7594170eSAndroid Build Coastguard Worker    apex_min_version = parse_apex_sdk_version(ctx.attr._min_sdk_version[BuildSettingInfo].value)
148*7594170eSAndroid Build Coastguard Worker    if dep_min_version and apex_min_version < dep_min_version:
149*7594170eSAndroid Build Coastguard Worker        fail("The apex %s's min_sdk_version %s cannot be lower than the dep's min_sdk_version %s" %
150*7594170eSAndroid Build Coastguard Worker             (ctx.attr._apex_name[BuildSettingInfo].value, apex_min_version, dep_min_version))
151*7594170eSAndroid Build Coastguard Worker
152*7594170eSAndroid Build Coastguard Workerdef _apex_cc_aspect_impl(target, ctx):
153*7594170eSAndroid Build Coastguard Worker    # Ensure that dependencies are compatible with this apex's min_sdk_level
154*7594170eSAndroid Build Coastguard Worker    if not ctx.attr.testonly:
155*7594170eSAndroid Build Coastguard Worker        _validate_min_sdk_version(ctx)
156*7594170eSAndroid Build Coastguard Worker
157*7594170eSAndroid Build Coastguard Worker    # Whether this dep is a direct dep of an APEX or makes a difference in dependency
158*7594170eSAndroid Build Coastguard Worker    # traversal, and aggregation of libs that are required from the platform/other APEXes,
159*7594170eSAndroid Build Coastguard Worker    # and libs that this APEX will provide to others.
160*7594170eSAndroid Build Coastguard Worker    is_direct_dep = is_apex_direct_dep(target.label, ctx)
161*7594170eSAndroid Build Coastguard Worker
162*7594170eSAndroid Build Coastguard Worker    provides = []
163*7594170eSAndroid Build Coastguard Worker    requires = []
164*7594170eSAndroid Build Coastguard Worker    make_modules_to_install = []
165*7594170eSAndroid Build Coastguard Worker
166*7594170eSAndroid Build Coastguard Worker    # The APEX manifest records the stub-providing libs (ABI-stable) in its
167*7594170eSAndroid Build Coastguard Worker    # direct and transitive deps.
168*7594170eSAndroid Build Coastguard Worker    #
169*7594170eSAndroid Build Coastguard Worker    # If a stub-providing lib is in the direct deps of an apex, then the apex
170*7594170eSAndroid Build Coastguard Worker    # provides the symbols.
171*7594170eSAndroid Build Coastguard Worker    #
172*7594170eSAndroid Build Coastguard Worker    # If a stub-providing lib is in the transitive deps of an apex, then the
173*7594170eSAndroid Build Coastguard Worker    # apex requires the symbols from the platform or other apexes.
174*7594170eSAndroid Build Coastguard Worker    if has_cc_stubs(target):
175*7594170eSAndroid Build Coastguard Worker        if is_direct_dep:
176*7594170eSAndroid Build Coastguard Worker            # Mark this target as "stub-providing" exports of this APEX,
177*7594170eSAndroid Build Coastguard Worker            # which the system and other APEXes can depend on, and propagate
178*7594170eSAndroid Build Coastguard Worker            # this list.
179*7594170eSAndroid Build Coastguard Worker            provides.append(target.label)
180*7594170eSAndroid Build Coastguard Worker        else:
181*7594170eSAndroid Build Coastguard Worker            # If this is not a direct dep and the build is in not unbundled mode,
182*7594170eSAndroid Build Coastguard Worker            # and stubs are available, don't propagate the libraries.
183*7594170eSAndroid Build Coastguard Worker
184*7594170eSAndroid Build Coastguard Worker            # Mark this target as required from the system either via
185*7594170eSAndroid Build Coastguard Worker            # the system partition, or another APEX, and propagate this list.
186*7594170eSAndroid Build Coastguard Worker            if CcStubLibrarySharedInfo not in target:
187*7594170eSAndroid Build Coastguard Worker                fail("Analysis of target: %s in apex: %s failed. This target does not provide CcStubLibrarySharedInfo. \
188*7594170eSAndroid Build Coastguard WorkerThis apex should likely use stubs of the target instead." % (target, ctx.attr._apex_name[BuildSettingInfo].value))
189*7594170eSAndroid Build Coastguard Worker            source_library_label = target[CcStubLibrarySharedInfo].source_library_label
190*7594170eSAndroid Build Coastguard Worker
191*7594170eSAndroid Build Coastguard Worker            # If a stub library is in the "provides" of the apex, it doesn't need to be in the "requires"
192*7594170eSAndroid Build Coastguard Worker            if not is_apex_direct_dep(source_library_label, ctx):
193*7594170eSAndroid Build Coastguard Worker                requires.append(source_library_label)
194*7594170eSAndroid Build Coastguard Worker                if not ctx.attr._unbundled_build[BuildSettingInfo].value and not _installed_to_bootstrap(source_library_label):
195*7594170eSAndroid Build Coastguard Worker                    # It's sufficient to pass the make module name, not the fully qualified bazel label.
196*7594170eSAndroid Build Coastguard Worker                    make_modules_to_install.append(source_library_label.name)
197*7594170eSAndroid Build Coastguard Worker
198*7594170eSAndroid Build Coastguard Worker            return [
199*7594170eSAndroid Build Coastguard Worker                ApexCcInfo(
200*7594170eSAndroid Build Coastguard Worker                    transitive_shared_libs = depset(),
201*7594170eSAndroid Build Coastguard Worker                    requires_native_libs = depset(direct = requires),
202*7594170eSAndroid Build Coastguard Worker                    provides_native_libs = depset(direct = provides),
203*7594170eSAndroid Build Coastguard Worker                ),
204*7594170eSAndroid Build Coastguard Worker                ApexCcMkInfo(
205*7594170eSAndroid Build Coastguard Worker                    make_modules_to_install = depset(direct = make_modules_to_install),
206*7594170eSAndroid Build Coastguard Worker                ),
207*7594170eSAndroid Build Coastguard Worker            ]
208*7594170eSAndroid Build Coastguard Worker
209*7594170eSAndroid Build Coastguard Worker    shared_object_files = []
210*7594170eSAndroid Build Coastguard Worker
211*7594170eSAndroid Build Coastguard Worker    # Transitive deps containing shared libraries to be propagated the apex.
212*7594170eSAndroid Build Coastguard Worker    transitive_deps = []
213*7594170eSAndroid Build Coastguard Worker    rules_propagate_src = [
214*7594170eSAndroid Build Coastguard Worker        "_bssl_hash_injection",
215*7594170eSAndroid Build Coastguard Worker        "stripped_shared_library",
216*7594170eSAndroid Build Coastguard Worker        "versioned_shared_library",
217*7594170eSAndroid Build Coastguard Worker        "stripped_binary",
218*7594170eSAndroid Build Coastguard Worker        "versioned_binary",
219*7594170eSAndroid Build Coastguard Worker    ]
220*7594170eSAndroid Build Coastguard Worker
221*7594170eSAndroid Build Coastguard Worker    # Exclude the stripped and unstripped so files
222*7594170eSAndroid Build Coastguard Worker    if ctx.rule.kind == "_cc_library_shared_proxy":
223*7594170eSAndroid Build Coastguard Worker        shared_object_files.append(struct(
224*7594170eSAndroid Build Coastguard Worker            stripped = target[CcSharedLibraryOutputInfo].output_file,
225*7594170eSAndroid Build Coastguard Worker            unstripped = target[CcUnstrippedInfo].unstripped,
226*7594170eSAndroid Build Coastguard Worker            metadata_file = target[MetadataFileInfo].metadata_file,
227*7594170eSAndroid Build Coastguard Worker            generating_rule_owner = target[CcSharedLibraryOutputInfo].output_file.owner,
228*7594170eSAndroid Build Coastguard Worker        ))
229*7594170eSAndroid Build Coastguard Worker        if hasattr(ctx.rule.attr, "shared"):
230*7594170eSAndroid Build Coastguard Worker            transitive_deps.append(ctx.rule.attr.shared[0])
231*7594170eSAndroid Build Coastguard Worker    elif ctx.rule.kind == "cc_prebuilt_library_shared":
232*7594170eSAndroid Build Coastguard Worker        files = target[DefaultInfo].files.to_list()
233*7594170eSAndroid Build Coastguard Worker        if len(files) != 1:
234*7594170eSAndroid Build Coastguard Worker            fail("expected only 1 file in %s[DefaultInfo].files, but got %d" % (target.label, len(files)))
235*7594170eSAndroid Build Coastguard Worker        shared_object_files.append(struct(
236*7594170eSAndroid Build Coastguard Worker            # TODO: This file needs to actually be stripped.
237*7594170eSAndroid Build Coastguard Worker            stripped = files[0],
238*7594170eSAndroid Build Coastguard Worker            unstripped = files[0],
239*7594170eSAndroid Build Coastguard Worker            metadata_file = None,
240*7594170eSAndroid Build Coastguard Worker            # Normally the generating_rule_owner is the owner of the stripped
241*7594170eSAndroid Build Coastguard Worker            # output file, but the owner of files[0] has slashes in its name,
242*7594170eSAndroid Build Coastguard Worker            # and the APEX's make_module_name must not contain a slash.
243*7594170eSAndroid Build Coastguard Worker            generating_rule_owner = target.label,
244*7594170eSAndroid Build Coastguard Worker        ))
245*7594170eSAndroid Build Coastguard Worker    elif ctx.rule.kind in ["cc_shared_library", "cc_binary"]:
246*7594170eSAndroid Build Coastguard Worker        # Propagate along the dynamic_deps edges for binaries and shared libs
247*7594170eSAndroid Build Coastguard Worker        if hasattr(ctx.rule.attr, "dynamic_deps"):
248*7594170eSAndroid Build Coastguard Worker            for dep in ctx.rule.attr.dynamic_deps:
249*7594170eSAndroid Build Coastguard Worker                transitive_deps.append(dep)
250*7594170eSAndroid Build Coastguard Worker    elif ctx.rule.kind in rules_propagate_src and hasattr(ctx.rule.attr, "src"):
251*7594170eSAndroid Build Coastguard Worker        # Propagate along the src edge
252*7594170eSAndroid Build Coastguard Worker        if ctx.rule.kind == "stripped_binary":
253*7594170eSAndroid Build Coastguard Worker            transitive_deps.append(ctx.rule.attr.src[0])
254*7594170eSAndroid Build Coastguard Worker        else:
255*7594170eSAndroid Build Coastguard Worker            transitive_deps.append(ctx.rule.attr.src)
256*7594170eSAndroid Build Coastguard Worker
257*7594170eSAndroid Build Coastguard Worker    # We only collect runtime dependencies from binaries and shared libraries,
258*7594170eSAndroid Build Coastguard Worker    # we _explicitly_ omit static libraries (kind = _cc_library_combiner)
259*7594170eSAndroid Build Coastguard Worker    if ctx.rule.kind in ["stripped_binary", "_cc_library_shared_proxy"] and hasattr(ctx.rule.attr, "runtime_deps"):
260*7594170eSAndroid Build Coastguard Worker        for dep in ctx.rule.attr.runtime_deps:
261*7594170eSAndroid Build Coastguard Worker            unstripped = None
262*7594170eSAndroid Build Coastguard Worker            if CcUnstrippedInfo in dep:
263*7594170eSAndroid Build Coastguard Worker                unstripped = dep[CcUnstrippedInfo].unstripped
264*7594170eSAndroid Build Coastguard Worker            for output_file in dep[DefaultInfo].files.to_list():
265*7594170eSAndroid Build Coastguard Worker                if output_file.extension == "so":
266*7594170eSAndroid Build Coastguard Worker                    shared_object_files.append(struct(
267*7594170eSAndroid Build Coastguard Worker                        stripped = output_file,
268*7594170eSAndroid Build Coastguard Worker                        unstripped = unstripped,
269*7594170eSAndroid Build Coastguard Worker                        metadata_file = dep[MetadataFileInfo].metadata_file,
270*7594170eSAndroid Build Coastguard Worker                        generating_rule_owner = output_file.owner,
271*7594170eSAndroid Build Coastguard Worker                    ))
272*7594170eSAndroid Build Coastguard Worker            transitive_deps.append(dep)
273*7594170eSAndroid Build Coastguard Worker
274*7594170eSAndroid Build Coastguard Worker    return [
275*7594170eSAndroid Build Coastguard Worker        ApexCcInfo(
276*7594170eSAndroid Build Coastguard Worker            transitive_shared_libs = depset(
277*7594170eSAndroid Build Coastguard Worker                shared_object_files,
278*7594170eSAndroid Build Coastguard Worker                transitive = [info[ApexCcInfo].transitive_shared_libs for info in transitive_deps],
279*7594170eSAndroid Build Coastguard Worker            ),
280*7594170eSAndroid Build Coastguard Worker            requires_native_libs = depset(
281*7594170eSAndroid Build Coastguard Worker                [],
282*7594170eSAndroid Build Coastguard Worker                transitive = [info[ApexCcInfo].requires_native_libs for info in transitive_deps],
283*7594170eSAndroid Build Coastguard Worker            ),
284*7594170eSAndroid Build Coastguard Worker            provides_native_libs = depset(
285*7594170eSAndroid Build Coastguard Worker                provides,
286*7594170eSAndroid Build Coastguard Worker                transitive = [info[ApexCcInfo].provides_native_libs for info in transitive_deps],
287*7594170eSAndroid Build Coastguard Worker            ),
288*7594170eSAndroid Build Coastguard Worker        ),
289*7594170eSAndroid Build Coastguard Worker        ApexCcMkInfo(
290*7594170eSAndroid Build Coastguard Worker            make_modules_to_install = depset(
291*7594170eSAndroid Build Coastguard Worker                [],
292*7594170eSAndroid Build Coastguard Worker                transitive = [info[ApexCcMkInfo].make_modules_to_install for info in transitive_deps],
293*7594170eSAndroid Build Coastguard Worker            ),
294*7594170eSAndroid Build Coastguard Worker        ),
295*7594170eSAndroid Build Coastguard Worker    ]
296*7594170eSAndroid Build Coastguard Worker
297*7594170eSAndroid Build Coastguard Worker# The list of attributes in a cc dep graph where this aspect will traverse on.
298*7594170eSAndroid Build Coastguard WorkerCC_ATTR_ASPECTS = [
299*7594170eSAndroid Build Coastguard Worker    "dynamic_deps",
300*7594170eSAndroid Build Coastguard Worker    "deps",
301*7594170eSAndroid Build Coastguard Worker    "shared",
302*7594170eSAndroid Build Coastguard Worker    "src",
303*7594170eSAndroid Build Coastguard Worker    "runtime_deps",
304*7594170eSAndroid Build Coastguard Worker    "static_deps",
305*7594170eSAndroid Build Coastguard Worker    "whole_archive_deps",
306*7594170eSAndroid Build Coastguard Worker]
307*7594170eSAndroid Build Coastguard Worker
308*7594170eSAndroid Build Coastguard Worker# This aspect is intended to be applied on a apex.native_shared_libs attribute
309*7594170eSAndroid Build Coastguard Workerapex_cc_aspect = aspect(
310*7594170eSAndroid Build Coastguard Worker    implementation = _apex_cc_aspect_impl,
311*7594170eSAndroid Build Coastguard Worker    provides = [ApexCcInfo, ApexCcMkInfo],
312*7594170eSAndroid Build Coastguard Worker    attrs = {
313*7594170eSAndroid Build Coastguard Worker        # This is propagated from the apex
314*7594170eSAndroid Build Coastguard Worker        "testonly": attr.bool(default = False),
315*7594170eSAndroid Build Coastguard Worker        "_apex_direct_deps": attr.label(default = "//build/bazel/rules/apex:apex_direct_deps"),
316*7594170eSAndroid Build Coastguard Worker        "_apex_name": attr.label(default = "//build/bazel/rules/apex:apex_name"),
317*7594170eSAndroid Build Coastguard Worker        "_min_sdk_version": attr.label(default = "//build/bazel/rules/apex:min_sdk_version"),
318*7594170eSAndroid Build Coastguard Worker        "_unbundled_build": attr.label(default = "//build/bazel/product_config:unbundled_build"),
319*7594170eSAndroid Build Coastguard Worker    },
320*7594170eSAndroid Build Coastguard Worker    attr_aspects = CC_ATTR_ASPECTS,
321*7594170eSAndroid Build Coastguard Worker    requires = [license_aspect],
322*7594170eSAndroid Build Coastguard Worker    # TODO: Have this aspect also propagate along attributes of native_shared_libs?
323*7594170eSAndroid Build Coastguard Worker)
324