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