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//lib:paths.bzl", "paths") 16*7594170eSAndroid Build Coastguard Workerload("@bazel_tools//tools/cpp:toolchain_utils.bzl", "find_cpp_toolchain") 17*7594170eSAndroid Build Coastguard Workerload("//build/bazel/rules/abi:abi_dump.bzl", "AbiDiffInfo", "abi_dump") 18*7594170eSAndroid Build Coastguard Workerload( 19*7594170eSAndroid Build Coastguard Worker ":cc_library_common.bzl", 20*7594170eSAndroid Build Coastguard Worker "CcAndroidMkInfo", 21*7594170eSAndroid Build Coastguard Worker "add_lists_defaulting_to_none", 22*7594170eSAndroid Build Coastguard Worker "check_valid_ldlibs", 23*7594170eSAndroid Build Coastguard Worker "parse_sdk_version", 24*7594170eSAndroid Build Coastguard Worker "system_dynamic_deps_defaults", 25*7594170eSAndroid Build Coastguard Worker) 26*7594170eSAndroid Build Coastguard Workerload(":cc_library_static.bzl", "cc_library_static") 27*7594170eSAndroid Build Coastguard Workerload(":clang_tidy.bzl", "collect_deps_clang_tidy_info") 28*7594170eSAndroid Build Coastguard Workerload( 29*7594170eSAndroid Build Coastguard Worker ":composed_transitions.bzl", 30*7594170eSAndroid Build Coastguard Worker "lto_and_fdo_profile_incoming_transition", 31*7594170eSAndroid Build Coastguard Worker "lto_and_sanitizer_deps_transition", 32*7594170eSAndroid Build Coastguard Worker) 33*7594170eSAndroid Build Coastguard Workerload( 34*7594170eSAndroid Build Coastguard Worker ":fdo_profile_transitions.bzl", 35*7594170eSAndroid Build Coastguard Worker "FDO_PROFILE_ATTR_KEY", 36*7594170eSAndroid Build Coastguard Worker) 37*7594170eSAndroid Build Coastguard Workerload(":generate_toc.bzl", "CcTocInfo", "generate_toc") 38*7594170eSAndroid Build Coastguard Workerload(":stl.bzl", "stl_info_from_attr") 39*7594170eSAndroid Build Coastguard Workerload(":stripped_cc_common.bzl", "CcUnstrippedInfo", "stripped_shared_library") 40*7594170eSAndroid Build Coastguard Workerload(":versioned_cc_common.bzl", "versioned_shared_library") 41*7594170eSAndroid Build Coastguard Worker 42*7594170eSAndroid Build Coastguard Workerdef cc_library_shared( 43*7594170eSAndroid Build Coastguard Worker name, 44*7594170eSAndroid Build Coastguard Worker stem = "", 45*7594170eSAndroid Build Coastguard Worker suffix = "", 46*7594170eSAndroid Build Coastguard Worker # Common arguments between shared_root and the shared library 47*7594170eSAndroid Build Coastguard Worker features = [], 48*7594170eSAndroid Build Coastguard Worker dynamic_deps = [], 49*7594170eSAndroid Build Coastguard Worker implementation_dynamic_deps = [], 50*7594170eSAndroid Build Coastguard Worker linkopts = [], 51*7594170eSAndroid Build Coastguard Worker target_compatible_with = [], 52*7594170eSAndroid Build Coastguard Worker # Ultimately _static arguments for shared_root production 53*7594170eSAndroid Build Coastguard Worker srcs = [], 54*7594170eSAndroid Build Coastguard Worker srcs_c = [], 55*7594170eSAndroid Build Coastguard Worker srcs_as = [], 56*7594170eSAndroid Build Coastguard Worker copts = [], 57*7594170eSAndroid Build Coastguard Worker cppflags = [], 58*7594170eSAndroid Build Coastguard Worker conlyflags = [], 59*7594170eSAndroid Build Coastguard Worker asflags = [], 60*7594170eSAndroid Build Coastguard Worker hdrs = [], 61*7594170eSAndroid Build Coastguard Worker implementation_deps = [], 62*7594170eSAndroid Build Coastguard Worker deps = [], 63*7594170eSAndroid Build Coastguard Worker whole_archive_deps = [], 64*7594170eSAndroid Build Coastguard Worker implementation_whole_archive_deps = [], 65*7594170eSAndroid Build Coastguard Worker system_dynamic_deps = None, 66*7594170eSAndroid Build Coastguard Worker runtime_deps = [], 67*7594170eSAndroid Build Coastguard Worker export_includes = [], 68*7594170eSAndroid Build Coastguard Worker export_absolute_includes = [], 69*7594170eSAndroid Build Coastguard Worker export_system_includes = [], 70*7594170eSAndroid Build Coastguard Worker local_includes = [], 71*7594170eSAndroid Build Coastguard Worker absolute_includes = [], 72*7594170eSAndroid Build Coastguard Worker rtti = False, 73*7594170eSAndroid Build Coastguard Worker stl = "", 74*7594170eSAndroid Build Coastguard Worker cpp_std = "", 75*7594170eSAndroid Build Coastguard Worker c_std = "", 76*7594170eSAndroid Build Coastguard Worker additional_linker_inputs = None, 77*7594170eSAndroid Build Coastguard Worker additional_compiler_inputs = [], 78*7594170eSAndroid Build Coastguard Worker 79*7594170eSAndroid Build Coastguard Worker # Purely _shared arguments 80*7594170eSAndroid Build Coastguard Worker strip = {}, 81*7594170eSAndroid Build Coastguard Worker 82*7594170eSAndroid Build Coastguard Worker # TODO(b/202299295): Handle data attribute. 83*7594170eSAndroid Build Coastguard Worker data = [], # @unused 84*7594170eSAndroid Build Coastguard Worker use_version_lib = False, 85*7594170eSAndroid Build Coastguard Worker stubs_symbol_file = None, 86*7594170eSAndroid Build Coastguard Worker inject_bssl_hash = False, 87*7594170eSAndroid Build Coastguard Worker sdk_version = "", # @unused 88*7594170eSAndroid Build Coastguard Worker min_sdk_version = "", 89*7594170eSAndroid Build Coastguard Worker abi_checker_enabled = None, 90*7594170eSAndroid Build Coastguard Worker abi_checker_symbol_file = None, 91*7594170eSAndroid Build Coastguard Worker abi_checker_exclude_symbol_versions = [], 92*7594170eSAndroid Build Coastguard Worker abi_checker_exclude_symbol_tags = [], 93*7594170eSAndroid Build Coastguard Worker abi_checker_check_all_apis = False, 94*7594170eSAndroid Build Coastguard Worker abi_checker_diff_flags = [], 95*7594170eSAndroid Build Coastguard Worker native_coverage = True, 96*7594170eSAndroid Build Coastguard Worker tags = [], 97*7594170eSAndroid Build Coastguard Worker fdo_profile = None, 98*7594170eSAndroid Build Coastguard Worker tidy = None, 99*7594170eSAndroid Build Coastguard Worker tidy_checks = None, 100*7594170eSAndroid Build Coastguard Worker tidy_checks_as_errors = None, 101*7594170eSAndroid Build Coastguard Worker tidy_flags = None, 102*7594170eSAndroid Build Coastguard Worker tidy_disabled_srcs = None, 103*7594170eSAndroid Build Coastguard Worker tidy_timeout_srcs = None, 104*7594170eSAndroid Build Coastguard Worker tidy_gen_header_filter = None, 105*7594170eSAndroid Build Coastguard Worker **kwargs): 106*7594170eSAndroid Build Coastguard Worker "Bazel macro to correspond with the cc_library_shared Soong module." 107*7594170eSAndroid Build Coastguard Worker 108*7594170eSAndroid Build Coastguard Worker # There exist modules named 'libtest_missing_symbol' and 109*7594170eSAndroid Build Coastguard Worker # 'libtest_missing_symbol_root'. Ensure that that the target suffixes are 110*7594170eSAndroid Build Coastguard Worker # sufficiently unique. 111*7594170eSAndroid Build Coastguard Worker shared_root_name = name + "__internal_root" 112*7594170eSAndroid Build Coastguard Worker unstripped_name = name + "_unstripped" 113*7594170eSAndroid Build Coastguard Worker stripped_name = name + "_stripped" 114*7594170eSAndroid Build Coastguard Worker 115*7594170eSAndroid Build Coastguard Worker if system_dynamic_deps == None: 116*7594170eSAndroid Build Coastguard Worker system_dynamic_deps = system_dynamic_deps_defaults 117*7594170eSAndroid Build Coastguard Worker 118*7594170eSAndroid Build Coastguard Worker if min_sdk_version: 119*7594170eSAndroid Build Coastguard Worker features = features + parse_sdk_version(min_sdk_version) + ["-sdk_version_default"] 120*7594170eSAndroid Build Coastguard Worker 121*7594170eSAndroid Build Coastguard Worker if fdo_profile != None: 122*7594170eSAndroid Build Coastguard Worker # FIXME(b/261609769): This is a temporary workaround to add link flags 123*7594170eSAndroid Build Coastguard Worker # that requires the path to fdo profile. 124*7594170eSAndroid Build Coastguard Worker # This workaround is error-prone because it assumes all the fdo_profile 125*7594170eSAndroid Build Coastguard Worker # targets are created in a specific way (e.g. fdo_profile target named foo 126*7594170eSAndroid Build Coastguard Worker # uses an afdo profile file named foo.afdo in the same folder). 127*7594170eSAndroid Build Coastguard Worker fdo_profile_file = fdo_profile + "_file" 128*7594170eSAndroid Build Coastguard Worker linkopts = linkopts + [ 129*7594170eSAndroid Build Coastguard Worker "-funique-internal-linkage-names", 130*7594170eSAndroid Build Coastguard Worker "-fprofile-sample-accurate", 131*7594170eSAndroid Build Coastguard Worker # profile-sample-use is needed to ensure symbol ordering 132*7594170eSAndroid Build Coastguard Worker "-fprofile-sample-use=$(location {})".format(fdo_profile_file), 133*7594170eSAndroid Build Coastguard Worker "-Wl,-mllvm,-no-warn-sample-unused=true", 134*7594170eSAndroid Build Coastguard Worker ] 135*7594170eSAndroid Build Coastguard Worker if additional_linker_inputs != None: 136*7594170eSAndroid Build Coastguard Worker additional_linker_inputs = additional_linker_inputs + [fdo_profile_file] 137*7594170eSAndroid Build Coastguard Worker else: 138*7594170eSAndroid Build Coastguard Worker additional_linker_inputs = [fdo_profile_file] 139*7594170eSAndroid Build Coastguard Worker 140*7594170eSAndroid Build Coastguard Worker stl_info = stl_info_from_attr(stl, True) 141*7594170eSAndroid Build Coastguard Worker linkopts = linkopts + stl_info.linkopts 142*7594170eSAndroid Build Coastguard Worker copts = copts + stl_info.cppflags 143*7594170eSAndroid Build Coastguard Worker 144*7594170eSAndroid Build Coastguard Worker if not native_coverage: 145*7594170eSAndroid Build Coastguard Worker features = features + ["-coverage"] 146*7594170eSAndroid Build Coastguard Worker else: 147*7594170eSAndroid Build Coastguard Worker features = features + select({ 148*7594170eSAndroid Build Coastguard Worker "//build/bazel/rules/cc:android_coverage_lib_flag": ["android_coverage_lib"], 149*7594170eSAndroid Build Coastguard Worker "//build/bazel/rules/cc:android_coverage_lib_flag_cfi": ["android_coverage_lib"], 150*7594170eSAndroid Build Coastguard Worker "//conditions:default": [], 151*7594170eSAndroid Build Coastguard Worker }) 152*7594170eSAndroid Build Coastguard Worker 153*7594170eSAndroid Build Coastguard Worker # TODO(b/233660582): deal with the cases where the default lib shouldn't be used 154*7594170eSAndroid Build Coastguard Worker deps = deps + select({ 155*7594170eSAndroid Build Coastguard Worker "//build/bazel/rules/cc:android_coverage_lib_flag": ["//system/extras/toolchain-extras:libprofile-clang-extras"], 156*7594170eSAndroid Build Coastguard Worker "//build/bazel/rules/cc:android_coverage_lib_flag_cfi": ["//system/extras/toolchain-extras:libprofile-clang-extras_cfi_support"], 157*7594170eSAndroid Build Coastguard Worker "//conditions:default": [], 158*7594170eSAndroid Build Coastguard Worker }) 159*7594170eSAndroid Build Coastguard Worker 160*7594170eSAndroid Build Coastguard Worker # The static library at the root of the shared library. 161*7594170eSAndroid Build Coastguard Worker # This may be distinct from the static version of the library if e.g. 162*7594170eSAndroid Build Coastguard Worker # the static-variant srcs are different than the shared-variant srcs. 163*7594170eSAndroid Build Coastguard Worker cc_library_static( 164*7594170eSAndroid Build Coastguard Worker name = shared_root_name, 165*7594170eSAndroid Build Coastguard Worker shared_linking = True, 166*7594170eSAndroid Build Coastguard Worker hdrs = hdrs, 167*7594170eSAndroid Build Coastguard Worker srcs = srcs, 168*7594170eSAndroid Build Coastguard Worker srcs_c = srcs_c, 169*7594170eSAndroid Build Coastguard Worker srcs_as = srcs_as, 170*7594170eSAndroid Build Coastguard Worker copts = copts, 171*7594170eSAndroid Build Coastguard Worker cppflags = cppflags, 172*7594170eSAndroid Build Coastguard Worker conlyflags = conlyflags, 173*7594170eSAndroid Build Coastguard Worker asflags = asflags, 174*7594170eSAndroid Build Coastguard Worker export_includes = export_includes, 175*7594170eSAndroid Build Coastguard Worker export_absolute_includes = export_absolute_includes, 176*7594170eSAndroid Build Coastguard Worker export_system_includes = export_system_includes, 177*7594170eSAndroid Build Coastguard Worker local_includes = local_includes, 178*7594170eSAndroid Build Coastguard Worker absolute_includes = absolute_includes, 179*7594170eSAndroid Build Coastguard Worker rtti = rtti, 180*7594170eSAndroid Build Coastguard Worker stl = "none", 181*7594170eSAndroid Build Coastguard Worker cpp_std = cpp_std, 182*7594170eSAndroid Build Coastguard Worker c_std = c_std, 183*7594170eSAndroid Build Coastguard Worker dynamic_deps = dynamic_deps, 184*7594170eSAndroid Build Coastguard Worker implementation_deps = implementation_deps + stl_info.static_deps, 185*7594170eSAndroid Build Coastguard Worker implementation_dynamic_deps = implementation_dynamic_deps + stl_info.shared_deps, 186*7594170eSAndroid Build Coastguard Worker implementation_whole_archive_deps = implementation_whole_archive_deps, 187*7594170eSAndroid Build Coastguard Worker system_dynamic_deps = system_dynamic_deps, 188*7594170eSAndroid Build Coastguard Worker deps = deps, 189*7594170eSAndroid Build Coastguard Worker whole_archive_deps = whole_archive_deps, 190*7594170eSAndroid Build Coastguard Worker features = features, 191*7594170eSAndroid Build Coastguard Worker target_compatible_with = target_compatible_with, 192*7594170eSAndroid Build Coastguard Worker tags = ["manual"], 193*7594170eSAndroid Build Coastguard Worker native_coverage = native_coverage, 194*7594170eSAndroid Build Coastguard Worker tidy = tidy, 195*7594170eSAndroid Build Coastguard Worker tidy_checks = tidy_checks, 196*7594170eSAndroid Build Coastguard Worker tidy_checks_as_errors = tidy_checks_as_errors, 197*7594170eSAndroid Build Coastguard Worker tidy_flags = tidy_flags, 198*7594170eSAndroid Build Coastguard Worker tidy_disabled_srcs = tidy_disabled_srcs, 199*7594170eSAndroid Build Coastguard Worker tidy_timeout_srcs = tidy_timeout_srcs, 200*7594170eSAndroid Build Coastguard Worker tidy_gen_header_filter = tidy_gen_header_filter, 201*7594170eSAndroid Build Coastguard Worker additional_compiler_inputs = additional_compiler_inputs, 202*7594170eSAndroid Build Coastguard Worker ) 203*7594170eSAndroid Build Coastguard Worker 204*7594170eSAndroid Build Coastguard Worker # dynamic deps are to be linked into the shared library via 205*7594170eSAndroid Build Coastguard Worker # --no-whole-archive. In order to do so, they need to be dependencies of a 206*7594170eSAndroid Build Coastguard Worker # "root" of the cc_shared_library, but may not be roots themselves. Below 207*7594170eSAndroid Build Coastguard Worker # we define stub roots (which themselves have no srcs) in order to 208*7594170eSAndroid Build Coastguard Worker # facilitate this. 209*7594170eSAndroid Build Coastguard Worker imp_deps_stub = name + "_implementation_deps" 210*7594170eSAndroid Build Coastguard Worker native.cc_library( 211*7594170eSAndroid Build Coastguard Worker name = imp_deps_stub, 212*7594170eSAndroid Build Coastguard Worker deps = implementation_dynamic_deps + 213*7594170eSAndroid Build Coastguard Worker system_dynamic_deps + 214*7594170eSAndroid Build Coastguard Worker stl_info.shared_deps + 215*7594170eSAndroid Build Coastguard Worker dynamic_deps, 216*7594170eSAndroid Build Coastguard Worker target_compatible_with = target_compatible_with, 217*7594170eSAndroid Build Coastguard Worker tags = ["manual"], 218*7594170eSAndroid Build Coastguard Worker ) 219*7594170eSAndroid Build Coastguard Worker 220*7594170eSAndroid Build Coastguard Worker shared_dynamic_deps = add_lists_defaulting_to_none( 221*7594170eSAndroid Build Coastguard Worker dynamic_deps, 222*7594170eSAndroid Build Coastguard Worker system_dynamic_deps, 223*7594170eSAndroid Build Coastguard Worker implementation_dynamic_deps, 224*7594170eSAndroid Build Coastguard Worker stl_info.shared_deps, 225*7594170eSAndroid Build Coastguard Worker ) 226*7594170eSAndroid Build Coastguard Worker 227*7594170eSAndroid Build Coastguard Worker filename_stem = stem or name 228*7594170eSAndroid Build Coastguard Worker soname = filename_stem + suffix + ".so" 229*7594170eSAndroid Build Coastguard Worker soname_flag = "-Wl,-soname," + soname 230*7594170eSAndroid Build Coastguard Worker 231*7594170eSAndroid Build Coastguard Worker native.cc_shared_library( 232*7594170eSAndroid Build Coastguard Worker name = unstripped_name, 233*7594170eSAndroid Build Coastguard Worker user_link_flags = linkopts + [soname_flag], 234*7594170eSAndroid Build Coastguard Worker dynamic_deps = shared_dynamic_deps, 235*7594170eSAndroid Build Coastguard Worker additional_linker_inputs = additional_linker_inputs, 236*7594170eSAndroid Build Coastguard Worker deps = [shared_root_name] + whole_archive_deps + [imp_deps_stub], 237*7594170eSAndroid Build Coastguard Worker features = features, 238*7594170eSAndroid Build Coastguard Worker target_compatible_with = target_compatible_with, 239*7594170eSAndroid Build Coastguard Worker tags = ["manual"], 240*7594170eSAndroid Build Coastguard Worker **kwargs 241*7594170eSAndroid Build Coastguard Worker ) 242*7594170eSAndroid Build Coastguard Worker 243*7594170eSAndroid Build Coastguard Worker hashed_name = name + "_hashed" 244*7594170eSAndroid Build Coastguard Worker _bssl_hash_injection( 245*7594170eSAndroid Build Coastguard Worker name = hashed_name, 246*7594170eSAndroid Build Coastguard Worker src = unstripped_name, 247*7594170eSAndroid Build Coastguard Worker inject_bssl_hash = inject_bssl_hash, 248*7594170eSAndroid Build Coastguard Worker tags = ["manual"], 249*7594170eSAndroid Build Coastguard Worker ) 250*7594170eSAndroid Build Coastguard Worker 251*7594170eSAndroid Build Coastguard Worker versioned_name = name + "_versioned" 252*7594170eSAndroid Build Coastguard Worker versioned_shared_library( 253*7594170eSAndroid Build Coastguard Worker name = versioned_name, 254*7594170eSAndroid Build Coastguard Worker src = hashed_name, 255*7594170eSAndroid Build Coastguard Worker stamp_build_number = use_version_lib, 256*7594170eSAndroid Build Coastguard Worker tags = ["manual"], 257*7594170eSAndroid Build Coastguard Worker ) 258*7594170eSAndroid Build Coastguard Worker 259*7594170eSAndroid Build Coastguard Worker stripped_shared_library( 260*7594170eSAndroid Build Coastguard Worker name = stripped_name, 261*7594170eSAndroid Build Coastguard Worker src = versioned_name, 262*7594170eSAndroid Build Coastguard Worker target_compatible_with = target_compatible_with, 263*7594170eSAndroid Build Coastguard Worker tags = ["manual"], 264*7594170eSAndroid Build Coastguard Worker **strip 265*7594170eSAndroid Build Coastguard Worker ) 266*7594170eSAndroid Build Coastguard Worker 267*7594170eSAndroid Build Coastguard Worker # The logic here is based on the shouldCreateSourceAbiDumpForLibrary() in sabi.go 268*7594170eSAndroid Build Coastguard Worker # abi_root is used to control if abi_dump aspects should be run on the static 269*7594170eSAndroid Build Coastguard Worker # deps because there is no way to control the aspects directly from the rule. 270*7594170eSAndroid Build Coastguard Worker abi_root = shared_root_name 271*7594170eSAndroid Build Coastguard Worker 272*7594170eSAndroid Build Coastguard Worker # explicitly disabled 273*7594170eSAndroid Build Coastguard Worker if abi_checker_enabled == False: 274*7594170eSAndroid Build Coastguard Worker abi_root = None 275*7594170eSAndroid Build Coastguard Worker elif abi_checker_enabled == True or stubs_symbol_file: 276*7594170eSAndroid Build Coastguard Worker # The logic comes from here: 277*7594170eSAndroid Build Coastguard Worker # https://cs.android.com/android/platform/superproject/+/master:build/soong/cc/library.go;l=2288;drc=73feba33308bf9432aea43e069ed24a2f0312f1b 278*7594170eSAndroid Build Coastguard Worker if not abi_checker_symbol_file and stubs_symbol_file: 279*7594170eSAndroid Build Coastguard Worker abi_checker_symbol_file = stubs_symbol_file 280*7594170eSAndroid Build Coastguard Worker else: 281*7594170eSAndroid Build Coastguard Worker abi_root = None 282*7594170eSAndroid Build Coastguard Worker 283*7594170eSAndroid Build Coastguard Worker abi_checker_explicitly_disabled = abi_checker_enabled == False 284*7594170eSAndroid Build Coastguard Worker 285*7594170eSAndroid Build Coastguard Worker abi_dump_name = name + "_abi_dump" 286*7594170eSAndroid Build Coastguard Worker abi_dump( 287*7594170eSAndroid Build Coastguard Worker name = abi_dump_name, 288*7594170eSAndroid Build Coastguard Worker shared = stripped_name, 289*7594170eSAndroid Build Coastguard Worker root = abi_root, 290*7594170eSAndroid Build Coastguard Worker soname = soname, 291*7594170eSAndroid Build Coastguard Worker has_stubs = stubs_symbol_file != None, 292*7594170eSAndroid Build Coastguard Worker enabled = abi_checker_enabled, 293*7594170eSAndroid Build Coastguard Worker explicitly_disabled = abi_checker_explicitly_disabled, 294*7594170eSAndroid Build Coastguard Worker symbol_file = abi_checker_symbol_file, 295*7594170eSAndroid Build Coastguard Worker exclude_symbol_versions = abi_checker_exclude_symbol_versions, 296*7594170eSAndroid Build Coastguard Worker exclude_symbol_tags = abi_checker_exclude_symbol_tags, 297*7594170eSAndroid Build Coastguard Worker check_all_apis = abi_checker_check_all_apis, 298*7594170eSAndroid Build Coastguard Worker diff_flags = abi_checker_diff_flags, 299*7594170eSAndroid Build Coastguard Worker tags = ["manual"], 300*7594170eSAndroid Build Coastguard Worker ) 301*7594170eSAndroid Build Coastguard Worker 302*7594170eSAndroid Build Coastguard Worker _cc_library_shared_proxy( 303*7594170eSAndroid Build Coastguard Worker name = name, 304*7594170eSAndroid Build Coastguard Worker shared = stripped_name, 305*7594170eSAndroid Build Coastguard Worker shared_debuginfo = unstripped_name, 306*7594170eSAndroid Build Coastguard Worker deps = [shared_root_name], 307*7594170eSAndroid Build Coastguard Worker features = features, 308*7594170eSAndroid Build Coastguard Worker output_file = paths.join(name, soname), # Prevent name collision by generating in a directory unique to the target 309*7594170eSAndroid Build Coastguard Worker target_compatible_with = target_compatible_with, 310*7594170eSAndroid Build Coastguard Worker has_stubs = stubs_symbol_file != None, 311*7594170eSAndroid Build Coastguard Worker runtime_deps = runtime_deps, 312*7594170eSAndroid Build Coastguard Worker abi_dump = abi_dump_name, 313*7594170eSAndroid Build Coastguard Worker fdo_profile = fdo_profile, 314*7594170eSAndroid Build Coastguard Worker linkopts = linkopts, 315*7594170eSAndroid Build Coastguard Worker package_name = native.package_name(), 316*7594170eSAndroid Build Coastguard Worker tags = tags, 317*7594170eSAndroid Build Coastguard Worker ) 318*7594170eSAndroid Build Coastguard Worker 319*7594170eSAndroid Build Coastguard Workerdef _create_dynamic_library_linker_input_for_file(ctx, shared_info, output): 320*7594170eSAndroid Build Coastguard Worker cc_toolchain = find_cpp_toolchain(ctx) 321*7594170eSAndroid Build Coastguard Worker feature_configuration = cc_common.configure_features( 322*7594170eSAndroid Build Coastguard Worker ctx = ctx, 323*7594170eSAndroid Build Coastguard Worker cc_toolchain = cc_toolchain, 324*7594170eSAndroid Build Coastguard Worker ) 325*7594170eSAndroid Build Coastguard Worker 326*7594170eSAndroid Build Coastguard Worker new_library_to_link = cc_common.create_library_to_link( 327*7594170eSAndroid Build Coastguard Worker actions = ctx.actions, 328*7594170eSAndroid Build Coastguard Worker dynamic_library = output, 329*7594170eSAndroid Build Coastguard Worker feature_configuration = feature_configuration, 330*7594170eSAndroid Build Coastguard Worker cc_toolchain = cc_toolchain, 331*7594170eSAndroid Build Coastguard Worker ) 332*7594170eSAndroid Build Coastguard Worker 333*7594170eSAndroid Build Coastguard Worker new_linker_input = cc_common.create_linker_input( 334*7594170eSAndroid Build Coastguard Worker owner = shared_info.linker_input.owner, 335*7594170eSAndroid Build Coastguard Worker libraries = depset([new_library_to_link]), 336*7594170eSAndroid Build Coastguard Worker ) 337*7594170eSAndroid Build Coastguard Worker return new_linker_input 338*7594170eSAndroid Build Coastguard Worker 339*7594170eSAndroid Build Coastguard Workerdef _correct_cc_shared_library_linking(ctx, shared_info, new_output): 340*7594170eSAndroid Build Coastguard Worker # we may have done some post-processing of the shared library 341*7594170eSAndroid Build Coastguard Worker # replace the linker_input that has not been post-processed with the 342*7594170eSAndroid Build Coastguard Worker # library that has been post-processed 343*7594170eSAndroid Build Coastguard Worker new_linker_input = _create_dynamic_library_linker_input_for_file(ctx, shared_info, new_output) 344*7594170eSAndroid Build Coastguard Worker 345*7594170eSAndroid Build Coastguard Worker return CcSharedLibraryInfo( 346*7594170eSAndroid Build Coastguard Worker dynamic_deps = shared_info.dynamic_deps, 347*7594170eSAndroid Build Coastguard Worker exports = shared_info.exports, 348*7594170eSAndroid Build Coastguard Worker link_once_static_libs = shared_info.link_once_static_libs, 349*7594170eSAndroid Build Coastguard Worker linker_input = new_linker_input, 350*7594170eSAndroid Build Coastguard Worker ) 351*7594170eSAndroid Build Coastguard Worker 352*7594170eSAndroid Build Coastguard WorkerCcStubLibrariesInfo = provider( 353*7594170eSAndroid Build Coastguard Worker fields = { 354*7594170eSAndroid Build Coastguard Worker "has_stubs": "If the shared library has stubs", 355*7594170eSAndroid Build Coastguard Worker }, 356*7594170eSAndroid Build Coastguard Worker) 357*7594170eSAndroid Build Coastguard Worker 358*7594170eSAndroid Build Coastguard Worker# A provider to propagate shared library output artifacts, primarily useful 359*7594170eSAndroid Build Coastguard Worker# for root level querying in Soong-Bazel mixed builds. 360*7594170eSAndroid Build Coastguard Worker# Ideally, it would be preferable to reuse the existing native 361*7594170eSAndroid Build Coastguard Worker# CcSharedLibraryInfo provider, but that provider requires that shared library 362*7594170eSAndroid Build Coastguard Worker# artifacts are wrapped in a linker input. Artifacts retrievable from this linker 363*7594170eSAndroid Build Coastguard Worker# input are symlinks to the original artifacts, which is problematic when 364*7594170eSAndroid Build Coastguard Worker# other dependencies expect a real file. 365*7594170eSAndroid Build Coastguard WorkerCcSharedLibraryOutputInfo = provider( 366*7594170eSAndroid Build Coastguard Worker fields = { 367*7594170eSAndroid Build Coastguard Worker "output_file": "A single .so file, produced by this target.", 368*7594170eSAndroid Build Coastguard Worker }, 369*7594170eSAndroid Build Coastguard Worker) 370*7594170eSAndroid Build Coastguard Worker 371*7594170eSAndroid Build Coastguard Workerdef _cc_library_shared_proxy_impl(ctx): 372*7594170eSAndroid Build Coastguard Worker check_valid_ldlibs(ctx, ctx.attr.linkopts) 373*7594170eSAndroid Build Coastguard Worker 374*7594170eSAndroid Build Coastguard Worker # Using a "deps" label_list instead of a single mandatory label attribute 375*7594170eSAndroid Build Coastguard Worker # is a hack to support aspect propagation of graph_aspect of the native 376*7594170eSAndroid Build Coastguard Worker # cc_shared_library. The aspect will only be applied and propagated along 377*7594170eSAndroid Build Coastguard Worker # a label_list attribute named "deps". 378*7594170eSAndroid Build Coastguard Worker if len(ctx.attr.deps) != 1: 379*7594170eSAndroid Build Coastguard Worker fail("Exactly one 'deps' must be specified for cc_library_shared_proxy") 380*7594170eSAndroid Build Coastguard Worker root_files = ctx.attr.deps[0][DefaultInfo].files.to_list() 381*7594170eSAndroid Build Coastguard Worker shared_files = ctx.attr.shared[0][DefaultInfo].files.to_list() 382*7594170eSAndroid Build Coastguard Worker shared_debuginfo = ctx.attr.shared_debuginfo[0][DefaultInfo].files.to_list() 383*7594170eSAndroid Build Coastguard Worker if len(shared_files) != 1 or len(shared_debuginfo) != 1: 384*7594170eSAndroid Build Coastguard Worker fail("Expected only one shared library file and one debuginfo file for it") 385*7594170eSAndroid Build Coastguard Worker 386*7594170eSAndroid Build Coastguard Worker shared_lib = shared_files[0] 387*7594170eSAndroid Build Coastguard Worker abi_diff_files = ctx.attr.abi_dump[0][AbiDiffInfo].diff_files.to_list() 388*7594170eSAndroid Build Coastguard Worker 389*7594170eSAndroid Build Coastguard Worker # Copy the output instead of symlinking. This is because this output 390*7594170eSAndroid Build Coastguard Worker # can be directly installed into a system image; this installation treats 391*7594170eSAndroid Build Coastguard Worker # symlinks differently from real files (symlinks will be preserved relative 392*7594170eSAndroid Build Coastguard Worker # to the image root). 393*7594170eSAndroid Build Coastguard Worker ctx.actions.run_shell( 394*7594170eSAndroid Build Coastguard Worker # We need to add the abi dump files to the inputs of this copy action even 395*7594170eSAndroid Build Coastguard Worker # though they are not used, otherwise not all the abi dump files will be 396*7594170eSAndroid Build Coastguard Worker # created. For example, for b build 397*7594170eSAndroid Build Coastguard Worker # packages/modules/adb/pairing_connection:libadb_pairing_server, only 398*7594170eSAndroid Build Coastguard Worker # libadb_pairing_server.so.lsdump will be created, libadb_pairing_auth.so.lsdump 399*7594170eSAndroid Build Coastguard Worker # and libadb_pairing_connection.so.lsdump will not be. The reason is that 400*7594170eSAndroid Build Coastguard Worker # even though libadb_pairing server depends on libadb_pairing_auth and 401*7594170eSAndroid Build Coastguard Worker # libadb_pairing_connection, the abi dump files are not explicitly used 402*7594170eSAndroid Build Coastguard Worker # by libadb_pairing_server, so bazel won't bother generating them. 403*7594170eSAndroid Build Coastguard Worker inputs = depset(direct = [shared_lib] + abi_diff_files), 404*7594170eSAndroid Build Coastguard Worker outputs = [ctx.outputs.output_file], 405*7594170eSAndroid Build Coastguard Worker command = "cp -f %s %s" % (shared_lib.path, ctx.outputs.output_file.path), 406*7594170eSAndroid Build Coastguard Worker mnemonic = "CopyFile", 407*7594170eSAndroid Build Coastguard Worker progress_message = "Copying files", 408*7594170eSAndroid Build Coastguard Worker use_default_shell_env = True, 409*7594170eSAndroid Build Coastguard Worker ) 410*7594170eSAndroid Build Coastguard Worker 411*7594170eSAndroid Build Coastguard Worker toc_info = generate_toc(ctx, ctx.attr.name, ctx.outputs.output_file) 412*7594170eSAndroid Build Coastguard Worker 413*7594170eSAndroid Build Coastguard Worker files = root_files + [ctx.outputs.output_file, toc_info.toc] + abi_diff_files 414*7594170eSAndroid Build Coastguard Worker 415*7594170eSAndroid Build Coastguard Worker return [ 416*7594170eSAndroid Build Coastguard Worker DefaultInfo( 417*7594170eSAndroid Build Coastguard Worker files = depset(direct = files), 418*7594170eSAndroid Build Coastguard Worker runfiles = ctx.runfiles(files = [ctx.outputs.output_file]), 419*7594170eSAndroid Build Coastguard Worker ), 420*7594170eSAndroid Build Coastguard Worker _correct_cc_shared_library_linking(ctx, ctx.attr.shared[0][CcSharedLibraryInfo], ctx.outputs.output_file), 421*7594170eSAndroid Build Coastguard Worker toc_info, 422*7594170eSAndroid Build Coastguard Worker # The _only_ linker_input is the statically linked root itself. We need to propagate this 423*7594170eSAndroid Build Coastguard Worker # as cc_shared_library identifies which libraries can be linked dynamically based on the 424*7594170eSAndroid Build Coastguard Worker # linker_inputs of the roots 425*7594170eSAndroid Build Coastguard Worker ctx.attr.deps[0][CcInfo], 426*7594170eSAndroid Build Coastguard Worker ctx.attr.deps[0][CcAndroidMkInfo], 427*7594170eSAndroid Build Coastguard Worker CcStubLibrariesInfo(has_stubs = ctx.attr.has_stubs), 428*7594170eSAndroid Build Coastguard Worker ctx.attr.shared[0][OutputGroupInfo], 429*7594170eSAndroid Build Coastguard Worker CcSharedLibraryOutputInfo(output_file = ctx.outputs.output_file), 430*7594170eSAndroid Build Coastguard Worker CcUnstrippedInfo(unstripped = shared_debuginfo[0]), 431*7594170eSAndroid Build Coastguard Worker ctx.attr.abi_dump[0][AbiDiffInfo], 432*7594170eSAndroid Build Coastguard Worker collect_deps_clang_tidy_info(ctx), 433*7594170eSAndroid Build Coastguard Worker cc_common.CcSharedLibraryHintInfo( 434*7594170eSAndroid Build Coastguard Worker # cc_shared_library doesn't need to traverse any attrs of a cc_shared_library dep 435*7594170eSAndroid Build Coastguard Worker attributes = [], 436*7594170eSAndroid Build Coastguard Worker ), 437*7594170eSAndroid Build Coastguard Worker ] 438*7594170eSAndroid Build Coastguard Worker 439*7594170eSAndroid Build Coastguard Worker_cc_library_shared_proxy = rule( 440*7594170eSAndroid Build Coastguard Worker implementation = _cc_library_shared_proxy_impl, 441*7594170eSAndroid Build Coastguard Worker # Incoming transition to override outgoing transition from rdep 442*7594170eSAndroid Build Coastguard Worker cfg = lto_and_fdo_profile_incoming_transition, 443*7594170eSAndroid Build Coastguard Worker attrs = { 444*7594170eSAndroid Build Coastguard Worker FDO_PROFILE_ATTR_KEY: attr.label(), 445*7594170eSAndroid Build Coastguard Worker "shared": attr.label( 446*7594170eSAndroid Build Coastguard Worker mandatory = True, 447*7594170eSAndroid Build Coastguard Worker providers = [CcSharedLibraryInfo], 448*7594170eSAndroid Build Coastguard Worker cfg = lto_and_sanitizer_deps_transition, 449*7594170eSAndroid Build Coastguard Worker ), 450*7594170eSAndroid Build Coastguard Worker "shared_debuginfo": attr.label( 451*7594170eSAndroid Build Coastguard Worker mandatory = True, 452*7594170eSAndroid Build Coastguard Worker cfg = lto_and_sanitizer_deps_transition, 453*7594170eSAndroid Build Coastguard Worker ), 454*7594170eSAndroid Build Coastguard Worker # "deps" should be a single element: the root target of the shared library. 455*7594170eSAndroid Build Coastguard Worker # See _cc_library_shared_proxy_impl comment for explanation. 456*7594170eSAndroid Build Coastguard Worker "deps": attr.label_list( 457*7594170eSAndroid Build Coastguard Worker mandatory = True, 458*7594170eSAndroid Build Coastguard Worker providers = [CcInfo], 459*7594170eSAndroid Build Coastguard Worker cfg = lto_and_sanitizer_deps_transition, 460*7594170eSAndroid Build Coastguard Worker ), 461*7594170eSAndroid Build Coastguard Worker "output_file": attr.output(mandatory = True), 462*7594170eSAndroid Build Coastguard Worker "has_stubs": attr.bool(default = False), 463*7594170eSAndroid Build Coastguard Worker "runtime_deps": attr.label_list( 464*7594170eSAndroid Build Coastguard Worker providers = [CcInfo], 465*7594170eSAndroid Build Coastguard Worker doc = "Deps that should be installed along with this target. Read by the apex cc aspect.", 466*7594170eSAndroid Build Coastguard Worker ), 467*7594170eSAndroid Build Coastguard Worker "abi_dump": attr.label( 468*7594170eSAndroid Build Coastguard Worker providers = [AbiDiffInfo], 469*7594170eSAndroid Build Coastguard Worker cfg = lto_and_sanitizer_deps_transition, 470*7594170eSAndroid Build Coastguard Worker ), 471*7594170eSAndroid Build Coastguard Worker "package_name": attr.string( 472*7594170eSAndroid Build Coastguard Worker mandatory = True, 473*7594170eSAndroid Build Coastguard Worker doc = "Just the path to the target package. Used by transitions.", 474*7594170eSAndroid Build Coastguard Worker ), 475*7594170eSAndroid Build Coastguard Worker "_allowlist_function_transition": attr.label( 476*7594170eSAndroid Build Coastguard Worker default = "@bazel_tools//tools/allowlists/function_transition_allowlist", 477*7594170eSAndroid Build Coastguard Worker ), 478*7594170eSAndroid Build Coastguard Worker "androidmk_static_deps": attr.label_list( 479*7594170eSAndroid Build Coastguard Worker providers = [CcInfo], 480*7594170eSAndroid Build Coastguard Worker doc = "All the whole archive deps of the lib. This is used to propagate" + 481*7594170eSAndroid Build Coastguard Worker " information to AndroidMk about LOCAL_STATIC_LIBRARIES.", 482*7594170eSAndroid Build Coastguard Worker ), 483*7594170eSAndroid Build Coastguard Worker "androidmk_whole_archive_deps": attr.label_list( 484*7594170eSAndroid Build Coastguard Worker providers = [CcInfo], 485*7594170eSAndroid Build Coastguard Worker doc = "All the whole archive deps of the lib. This is used to propagate" + 486*7594170eSAndroid Build Coastguard Worker " information to AndroidMk about LOCAL_WHOLE_STATIC_LIBRARIES.", 487*7594170eSAndroid Build Coastguard Worker ), 488*7594170eSAndroid Build Coastguard Worker "androidmk_dynamic_deps": attr.label_list( 489*7594170eSAndroid Build Coastguard Worker providers = [CcInfo], 490*7594170eSAndroid Build Coastguard Worker doc = "All the dynamic deps of the lib. This is used to propagate" + 491*7594170eSAndroid Build Coastguard Worker " information to AndroidMk about LOCAL_SHARED_LIBRARIES.", 492*7594170eSAndroid Build Coastguard Worker ), 493*7594170eSAndroid Build Coastguard Worker "_toc_script": attr.label( 494*7594170eSAndroid Build Coastguard Worker cfg = "exec", 495*7594170eSAndroid Build Coastguard Worker executable = True, 496*7594170eSAndroid Build Coastguard Worker allow_single_file = True, 497*7594170eSAndroid Build Coastguard Worker default = "//build/soong/scripts:toc.sh", 498*7594170eSAndroid Build Coastguard Worker ), 499*7594170eSAndroid Build Coastguard Worker "_readelf": attr.label( 500*7594170eSAndroid Build Coastguard Worker cfg = "exec", 501*7594170eSAndroid Build Coastguard Worker executable = True, 502*7594170eSAndroid Build Coastguard Worker allow_single_file = True, 503*7594170eSAndroid Build Coastguard Worker default = "//prebuilts/clang/host/linux-x86:llvm-readelf", 504*7594170eSAndroid Build Coastguard Worker ), 505*7594170eSAndroid Build Coastguard Worker "linkopts": attr.string_list(default = []), # Used for validation 506*7594170eSAndroid Build Coastguard Worker "_android_constraint": attr.label( 507*7594170eSAndroid Build Coastguard Worker default = Label("//build/bazel_common_rules/platforms/os:android"), 508*7594170eSAndroid Build Coastguard Worker ), 509*7594170eSAndroid Build Coastguard Worker "_darwin_constraint": attr.label( 510*7594170eSAndroid Build Coastguard Worker default = Label("//build/bazel_common_rules/platforms/os:darwin"), 511*7594170eSAndroid Build Coastguard Worker ), 512*7594170eSAndroid Build Coastguard Worker "_linux_constraint": attr.label( 513*7594170eSAndroid Build Coastguard Worker default = Label("//build/bazel_common_rules/platforms/os:linux"), 514*7594170eSAndroid Build Coastguard Worker ), 515*7594170eSAndroid Build Coastguard Worker "_windows_constraint": attr.label( 516*7594170eSAndroid Build Coastguard Worker default = Label("//build/bazel_common_rules/platforms/os:windows"), 517*7594170eSAndroid Build Coastguard Worker ), 518*7594170eSAndroid Build Coastguard Worker }, 519*7594170eSAndroid Build Coastguard Worker provides = [CcAndroidMkInfo, CcInfo, CcTocInfo, cc_common.CcSharedLibraryHintInfo], 520*7594170eSAndroid Build Coastguard Worker fragments = ["cpp"], 521*7594170eSAndroid Build Coastguard Worker toolchains = ["@bazel_tools//tools/cpp:toolchain_type"], 522*7594170eSAndroid Build Coastguard Worker) 523*7594170eSAndroid Build Coastguard Worker 524*7594170eSAndroid Build Coastguard Workerdef _bssl_hash_injection_impl(ctx): 525*7594170eSAndroid Build Coastguard Worker hashed_file = ctx.file.src 526*7594170eSAndroid Build Coastguard Worker if ctx.attr.inject_bssl_hash: 527*7594170eSAndroid Build Coastguard Worker hashed_file = ctx.actions.declare_file("lib" + ctx.attr.name + ".so") 528*7594170eSAndroid Build Coastguard Worker args = ctx.actions.args() 529*7594170eSAndroid Build Coastguard Worker args.add_all(["-in-object", ctx.files.src[0]]) 530*7594170eSAndroid Build Coastguard Worker args.add_all(["-o", hashed_file]) 531*7594170eSAndroid Build Coastguard Worker 532*7594170eSAndroid Build Coastguard Worker ctx.actions.run( 533*7594170eSAndroid Build Coastguard Worker inputs = ctx.files.src, 534*7594170eSAndroid Build Coastguard Worker outputs = [hashed_file], 535*7594170eSAndroid Build Coastguard Worker executable = ctx.executable._bssl_inject_hash, 536*7594170eSAndroid Build Coastguard Worker arguments = [args], 537*7594170eSAndroid Build Coastguard Worker tools = [ctx.executable._bssl_inject_hash], 538*7594170eSAndroid Build Coastguard Worker mnemonic = "BsslInjectHash", 539*7594170eSAndroid Build Coastguard Worker ) 540*7594170eSAndroid Build Coastguard Worker 541*7594170eSAndroid Build Coastguard Worker return [ 542*7594170eSAndroid Build Coastguard Worker DefaultInfo(files = depset([hashed_file])), 543*7594170eSAndroid Build Coastguard Worker ctx.attr.src[CcSharedLibraryInfo], 544*7594170eSAndroid Build Coastguard Worker ctx.attr.src[OutputGroupInfo], 545*7594170eSAndroid Build Coastguard Worker ] 546*7594170eSAndroid Build Coastguard Worker 547*7594170eSAndroid Build Coastguard Worker_bssl_hash_injection = rule( 548*7594170eSAndroid Build Coastguard Worker implementation = _bssl_hash_injection_impl, 549*7594170eSAndroid Build Coastguard Worker attrs = { 550*7594170eSAndroid Build Coastguard Worker "src": attr.label( 551*7594170eSAndroid Build Coastguard Worker mandatory = True, 552*7594170eSAndroid Build Coastguard Worker allow_single_file = True, 553*7594170eSAndroid Build Coastguard Worker providers = [CcSharedLibraryInfo], 554*7594170eSAndroid Build Coastguard Worker ), 555*7594170eSAndroid Build Coastguard Worker "inject_bssl_hash": attr.bool( 556*7594170eSAndroid Build Coastguard Worker default = False, 557*7594170eSAndroid Build Coastguard Worker doc = "Whether inject BSSL hash", 558*7594170eSAndroid Build Coastguard Worker ), 559*7594170eSAndroid Build Coastguard Worker "_bssl_inject_hash": attr.label( 560*7594170eSAndroid Build Coastguard Worker cfg = "exec", 561*7594170eSAndroid Build Coastguard Worker doc = "The BSSL hash injection tool.", 562*7594170eSAndroid Build Coastguard Worker executable = True, 563*7594170eSAndroid Build Coastguard Worker default = "//external/boringssl:bssl_inject_hash", 564*7594170eSAndroid Build Coastguard Worker allow_single_file = True, 565*7594170eSAndroid Build Coastguard Worker ), 566*7594170eSAndroid Build Coastguard Worker }, 567*7594170eSAndroid Build Coastguard Worker) 568