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_skylib//rules:common_settings.bzl", "BuildSettingInfo") 17*7594170eSAndroid Build Coastguard Workerload("@bazel_tools//tools/build_defs/cc:action_names.bzl", "ACTION_NAMES") 18*7594170eSAndroid Build Coastguard Workerload("@bazel_tools//tools/cpp:toolchain_utils.bzl", "find_cpp_toolchain") 19*7594170eSAndroid Build Coastguard Workerload("@soong_injection//cc_toolchain:config_constants.bzl", config_constants = "constants") 20*7594170eSAndroid Build Coastguard Workerload("//build/bazel/rules:common.bzl", "get_dep_targets") 21*7594170eSAndroid Build Coastguard Workerload( 22*7594170eSAndroid Build Coastguard Worker ":cc_library_common.bzl", 23*7594170eSAndroid Build Coastguard Worker "CPP_EXTENSIONS", 24*7594170eSAndroid Build Coastguard Worker "C_EXTENSIONS", 25*7594170eSAndroid Build Coastguard Worker "CcAndroidMkInfo", 26*7594170eSAndroid Build Coastguard Worker "check_absolute_include_dirs_disabled", 27*7594170eSAndroid Build Coastguard Worker "create_cc_androidmk_provider", 28*7594170eSAndroid Build Coastguard Worker "create_ccinfo_for_includes", 29*7594170eSAndroid Build Coastguard Worker "get_non_header_srcs", 30*7594170eSAndroid Build Coastguard Worker "get_sanitizer_lib_info", 31*7594170eSAndroid Build Coastguard Worker "is_external_directory", 32*7594170eSAndroid Build Coastguard Worker "parse_sdk_version", 33*7594170eSAndroid Build Coastguard Worker "system_dynamic_deps_defaults", 34*7594170eSAndroid Build Coastguard Worker) 35*7594170eSAndroid Build Coastguard Workerload(":clang_tidy.bzl", "ClangTidyInfo", "clang_tidy_for_dir", "generate_clang_tidy_actions") 36*7594170eSAndroid Build Coastguard Worker 37*7594170eSAndroid Build Coastguard Worker# TODO: b/294868620 - Change this back to lto_deps_transition when completing 38*7594170eSAndroid Build Coastguard Worker# the bug 39*7594170eSAndroid Build Coastguard Workerload(":composed_transitions.bzl", "lto_and_sanitizer_static_transition") 40*7594170eSAndroid Build Coastguard Worker 41*7594170eSAndroid Build Coastguard Worker# TODO: b/294868620 - Remove when completing the bug 42*7594170eSAndroid Build Coastguard Workerload( 43*7594170eSAndroid Build Coastguard Worker ":sanitizer_enablement_transition.bzl", 44*7594170eSAndroid Build Coastguard Worker "drop_sanitizer_enablement_transition", 45*7594170eSAndroid Build Coastguard Worker) 46*7594170eSAndroid Build Coastguard Workerload(":stl.bzl", "stl_info_from_attr") 47*7594170eSAndroid Build Coastguard Worker 48*7594170eSAndroid Build Coastguard Worker_ALLOWED_MANUAL_INTERFACE_PATHS = [ 49*7594170eSAndroid Build Coastguard Worker "vendor/", 50*7594170eSAndroid Build Coastguard Worker "hardware/", 51*7594170eSAndroid Build Coastguard Worker # for testing 52*7594170eSAndroid Build Coastguard Worker "build/bazel/rules/cc", 53*7594170eSAndroid Build Coastguard Worker] 54*7594170eSAndroid Build Coastguard Worker 55*7594170eSAndroid Build Coastguard WorkerCcStaticLibraryInfo = provider(fields = ["root_static_archive", "objects"]) 56*7594170eSAndroid Build Coastguard Worker 57*7594170eSAndroid Build Coastguard Workerdef cc_library_static( 58*7594170eSAndroid Build Coastguard Worker name, 59*7594170eSAndroid Build Coastguard Worker shared_linking = False, 60*7594170eSAndroid Build Coastguard Worker deps = [], 61*7594170eSAndroid Build Coastguard Worker implementation_deps = [], 62*7594170eSAndroid Build Coastguard Worker dynamic_deps = [], 63*7594170eSAndroid Build Coastguard Worker implementation_dynamic_deps = [], 64*7594170eSAndroid Build Coastguard Worker whole_archive_deps = [], 65*7594170eSAndroid Build Coastguard Worker implementation_whole_archive_deps = [], 66*7594170eSAndroid Build Coastguard Worker system_dynamic_deps = None, 67*7594170eSAndroid Build Coastguard Worker runtime_deps = [], 68*7594170eSAndroid Build Coastguard Worker export_absolute_includes = [], 69*7594170eSAndroid Build Coastguard Worker export_includes = [], 70*7594170eSAndroid Build Coastguard Worker export_system_includes = [], 71*7594170eSAndroid Build Coastguard Worker local_includes = [], 72*7594170eSAndroid Build Coastguard Worker absolute_includes = [], 73*7594170eSAndroid Build Coastguard Worker hdrs = [], 74*7594170eSAndroid Build Coastguard Worker native_bridge_supported = False, # TODO: not supported yet. @unused 75*7594170eSAndroid Build Coastguard Worker rtti = False, 76*7594170eSAndroid Build Coastguard Worker stl = "", 77*7594170eSAndroid Build Coastguard Worker cpp_std = "", 78*7594170eSAndroid Build Coastguard Worker c_std = "", 79*7594170eSAndroid Build Coastguard Worker # Flags for C and C++ 80*7594170eSAndroid Build Coastguard Worker copts = [], 81*7594170eSAndroid Build Coastguard Worker # C++ attributes 82*7594170eSAndroid Build Coastguard Worker srcs = [], 83*7594170eSAndroid Build Coastguard Worker cppflags = [], 84*7594170eSAndroid Build Coastguard Worker # C attributes 85*7594170eSAndroid Build Coastguard Worker srcs_c = [], 86*7594170eSAndroid Build Coastguard Worker conlyflags = [], 87*7594170eSAndroid Build Coastguard Worker # asm attributes 88*7594170eSAndroid Build Coastguard Worker srcs_as = [], 89*7594170eSAndroid Build Coastguard Worker asflags = [], 90*7594170eSAndroid Build Coastguard Worker features = [], 91*7594170eSAndroid Build Coastguard Worker linkopts = [], 92*7594170eSAndroid Build Coastguard Worker alwayslink = None, 93*7594170eSAndroid Build Coastguard Worker target_compatible_with = [], 94*7594170eSAndroid Build Coastguard Worker # TODO(b/202299295): Handle data attribute. 95*7594170eSAndroid Build Coastguard Worker data = [], # @unused 96*7594170eSAndroid Build Coastguard Worker sdk_version = "", # @unused 97*7594170eSAndroid Build Coastguard Worker min_sdk_version = "", 98*7594170eSAndroid Build Coastguard Worker tags = [], 99*7594170eSAndroid Build Coastguard Worker tidy = None, 100*7594170eSAndroid Build Coastguard Worker tidy_checks = None, 101*7594170eSAndroid Build Coastguard Worker tidy_checks_as_errors = None, 102*7594170eSAndroid Build Coastguard Worker tidy_flags = None, 103*7594170eSAndroid Build Coastguard Worker tidy_disabled_srcs = None, 104*7594170eSAndroid Build Coastguard Worker tidy_timeout_srcs = None, 105*7594170eSAndroid Build Coastguard Worker tidy_gen_header_filter = None, 106*7594170eSAndroid Build Coastguard Worker native_coverage = True, 107*7594170eSAndroid Build Coastguard Worker additional_compiler_inputs = [], 108*7594170eSAndroid Build Coastguard Worker applicable_licenses = []): 109*7594170eSAndroid Build Coastguard Worker "Bazel macro to correspond with the cc_library_static Soong module." 110*7594170eSAndroid Build Coastguard Worker 111*7594170eSAndroid Build Coastguard Worker exports_name = "%s_exports" % name 112*7594170eSAndroid Build Coastguard Worker locals_name = "%s_locals" % name 113*7594170eSAndroid Build Coastguard Worker cpp_name = "%s_cpp" % name 114*7594170eSAndroid Build Coastguard Worker c_name = "%s_c" % name 115*7594170eSAndroid Build Coastguard Worker asm_name = "%s_asm" % name 116*7594170eSAndroid Build Coastguard Worker 117*7594170eSAndroid Build Coastguard Worker toolchain_features = [] 118*7594170eSAndroid Build Coastguard Worker 119*7594170eSAndroid Build Coastguard Worker toolchain_features.append("pic") 120*7594170eSAndroid Build Coastguard Worker 121*7594170eSAndroid Build Coastguard Worker if is_external_directory(native.package_name()): 122*7594170eSAndroid Build Coastguard Worker toolchain_features += [ 123*7594170eSAndroid Build Coastguard Worker "-non_external_compiler_flags", 124*7594170eSAndroid Build Coastguard Worker "external_compiler_flags", 125*7594170eSAndroid Build Coastguard Worker ] 126*7594170eSAndroid Build Coastguard Worker else: 127*7594170eSAndroid Build Coastguard Worker toolchain_features += [ 128*7594170eSAndroid Build Coastguard Worker "non_external_compiler_flags", 129*7594170eSAndroid Build Coastguard Worker "-external_compiler_flags", 130*7594170eSAndroid Build Coastguard Worker ] 131*7594170eSAndroid Build Coastguard Worker 132*7594170eSAndroid Build Coastguard Worker for allowed_project in config_constants.WarningAllowedProjects: 133*7594170eSAndroid Build Coastguard Worker if native.package_name().startswith(allowed_project): 134*7594170eSAndroid Build Coastguard Worker toolchain_features.append("-warnings_as_errors") 135*7594170eSAndroid Build Coastguard Worker break 136*7594170eSAndroid Build Coastguard Worker 137*7594170eSAndroid Build Coastguard Worker if rtti: 138*7594170eSAndroid Build Coastguard Worker toolchain_features.append("rtti") 139*7594170eSAndroid Build Coastguard Worker if cpp_std: 140*7594170eSAndroid Build Coastguard Worker toolchain_features += [cpp_std, "-cpp_std_default"] 141*7594170eSAndroid Build Coastguard Worker if c_std: 142*7594170eSAndroid Build Coastguard Worker toolchain_features += [c_std, "-c_std_default"] 143*7594170eSAndroid Build Coastguard Worker 144*7594170eSAndroid Build Coastguard Worker for path in _ALLOWED_MANUAL_INTERFACE_PATHS: 145*7594170eSAndroid Build Coastguard Worker if native.package_name().startswith(path): 146*7594170eSAndroid Build Coastguard Worker toolchain_features.append("do_not_check_manual_binder_interfaces") 147*7594170eSAndroid Build Coastguard Worker break 148*7594170eSAndroid Build Coastguard Worker 149*7594170eSAndroid Build Coastguard Worker if min_sdk_version: 150*7594170eSAndroid Build Coastguard Worker toolchain_features += parse_sdk_version(min_sdk_version) + ["-sdk_version_default"] 151*7594170eSAndroid Build Coastguard Worker toolchain_features += features 152*7594170eSAndroid Build Coastguard Worker 153*7594170eSAndroid Build Coastguard Worker if not native_coverage: 154*7594170eSAndroid Build Coastguard Worker toolchain_features += ["-coverage"] # buildifier: disable=list-append This could be a select, not a list 155*7594170eSAndroid Build Coastguard Worker 156*7594170eSAndroid Build Coastguard Worker if system_dynamic_deps == None: 157*7594170eSAndroid Build Coastguard Worker system_dynamic_deps = system_dynamic_deps_defaults 158*7594170eSAndroid Build Coastguard Worker 159*7594170eSAndroid Build Coastguard Worker _cc_includes( 160*7594170eSAndroid Build Coastguard Worker name = exports_name, 161*7594170eSAndroid Build Coastguard Worker includes = export_includes, 162*7594170eSAndroid Build Coastguard Worker absolute_includes = export_absolute_includes, 163*7594170eSAndroid Build Coastguard Worker system_includes = export_system_includes, 164*7594170eSAndroid Build Coastguard Worker # whole archive deps always re-export their includes, etc 165*7594170eSAndroid Build Coastguard Worker deps = deps + whole_archive_deps + dynamic_deps, 166*7594170eSAndroid Build Coastguard Worker target_compatible_with = target_compatible_with, 167*7594170eSAndroid Build Coastguard Worker applicable_licenses = applicable_licenses, 168*7594170eSAndroid Build Coastguard Worker tags = ["manual"], 169*7594170eSAndroid Build Coastguard Worker ) 170*7594170eSAndroid Build Coastguard Worker 171*7594170eSAndroid Build Coastguard Worker stl_info = stl_info_from_attr(stl, False) 172*7594170eSAndroid Build Coastguard Worker linkopts = linkopts + stl_info.linkopts 173*7594170eSAndroid Build Coastguard Worker copts = copts + stl_info.cppflags 174*7594170eSAndroid Build Coastguard Worker 175*7594170eSAndroid Build Coastguard Worker _cc_includes( 176*7594170eSAndroid Build Coastguard Worker name = locals_name, 177*7594170eSAndroid Build Coastguard Worker includes = local_includes, 178*7594170eSAndroid Build Coastguard Worker absolute_includes = absolute_includes, 179*7594170eSAndroid Build Coastguard Worker deps = ( 180*7594170eSAndroid Build Coastguard Worker implementation_deps + 181*7594170eSAndroid Build Coastguard Worker implementation_dynamic_deps + 182*7594170eSAndroid Build Coastguard Worker system_dynamic_deps + 183*7594170eSAndroid Build Coastguard Worker stl_info.deps + 184*7594170eSAndroid Build Coastguard Worker stl_info.static_deps + 185*7594170eSAndroid Build Coastguard Worker stl_info.shared_deps + 186*7594170eSAndroid Build Coastguard Worker implementation_whole_archive_deps 187*7594170eSAndroid Build Coastguard Worker ), 188*7594170eSAndroid Build Coastguard Worker target_compatible_with = target_compatible_with, 189*7594170eSAndroid Build Coastguard Worker applicable_licenses = applicable_licenses, 190*7594170eSAndroid Build Coastguard Worker tags = ["manual"], 191*7594170eSAndroid Build Coastguard Worker ) 192*7594170eSAndroid Build Coastguard Worker 193*7594170eSAndroid Build Coastguard Worker # Silently drop these attributes for now: 194*7594170eSAndroid Build Coastguard Worker # - native_bridge_supported 195*7594170eSAndroid Build Coastguard Worker common_attrs = dict( 196*7594170eSAndroid Build Coastguard Worker [ 197*7594170eSAndroid Build Coastguard Worker # TODO(b/199917423): This may be superfluous. Investigate and possibly remove. 198*7594170eSAndroid Build Coastguard Worker ("linkstatic", True), 199*7594170eSAndroid Build Coastguard Worker ("hdrs", hdrs), 200*7594170eSAndroid Build Coastguard Worker # Add dynamic_deps to implementation_deps, as the include paths from the 201*7594170eSAndroid Build Coastguard Worker # dynamic_deps are also needed. 202*7594170eSAndroid Build Coastguard Worker ("implementation_deps", [locals_name]), 203*7594170eSAndroid Build Coastguard Worker ("deps", [exports_name]), 204*7594170eSAndroid Build Coastguard Worker ("features", toolchain_features), 205*7594170eSAndroid Build Coastguard Worker ("toolchains", ["//build/bazel/product_config:product_variables_for_attributes"]), 206*7594170eSAndroid Build Coastguard Worker ("target_compatible_with", target_compatible_with), 207*7594170eSAndroid Build Coastguard Worker ("linkopts", linkopts), 208*7594170eSAndroid Build Coastguard Worker ("applicable_licenses", applicable_licenses), 209*7594170eSAndroid Build Coastguard Worker ], 210*7594170eSAndroid Build Coastguard Worker ) 211*7594170eSAndroid Build Coastguard Worker 212*7594170eSAndroid Build Coastguard Worker # TODO(b/231574899): restructure this to handle other images 213*7594170eSAndroid Build Coastguard Worker copts += select({ 214*7594170eSAndroid Build Coastguard Worker "//build/bazel/rules/apex:non_apex": [], 215*7594170eSAndroid Build Coastguard Worker "//conditions:default": [ 216*7594170eSAndroid Build Coastguard Worker "-D__ANDROID_APEX__", 217*7594170eSAndroid Build Coastguard Worker ], 218*7594170eSAndroid Build Coastguard Worker }) 219*7594170eSAndroid Build Coastguard Worker 220*7594170eSAndroid Build Coastguard Worker native.cc_library( 221*7594170eSAndroid Build Coastguard Worker name = cpp_name, 222*7594170eSAndroid Build Coastguard Worker srcs = srcs, 223*7594170eSAndroid Build Coastguard Worker copts = copts + cppflags, 224*7594170eSAndroid Build Coastguard Worker additional_compiler_inputs = additional_compiler_inputs, 225*7594170eSAndroid Build Coastguard Worker tags = ["manual"], 226*7594170eSAndroid Build Coastguard Worker alwayslink = True, 227*7594170eSAndroid Build Coastguard Worker **common_attrs 228*7594170eSAndroid Build Coastguard Worker ) 229*7594170eSAndroid Build Coastguard Worker native.cc_library( 230*7594170eSAndroid Build Coastguard Worker name = c_name, 231*7594170eSAndroid Build Coastguard Worker srcs = srcs_c, 232*7594170eSAndroid Build Coastguard Worker copts = copts + conlyflags, 233*7594170eSAndroid Build Coastguard Worker additional_compiler_inputs = additional_compiler_inputs, 234*7594170eSAndroid Build Coastguard Worker tags = ["manual"], 235*7594170eSAndroid Build Coastguard Worker alwayslink = True, 236*7594170eSAndroid Build Coastguard Worker **common_attrs 237*7594170eSAndroid Build Coastguard Worker ) 238*7594170eSAndroid Build Coastguard Worker native.cc_library( 239*7594170eSAndroid Build Coastguard Worker name = asm_name, 240*7594170eSAndroid Build Coastguard Worker srcs = srcs_as, 241*7594170eSAndroid Build Coastguard Worker copts = asflags, 242*7594170eSAndroid Build Coastguard Worker tags = ["manual"], 243*7594170eSAndroid Build Coastguard Worker alwayslink = True, 244*7594170eSAndroid Build Coastguard Worker **common_attrs 245*7594170eSAndroid Build Coastguard Worker ) 246*7594170eSAndroid Build Coastguard Worker 247*7594170eSAndroid Build Coastguard Worker tidy_providing_deps = [] 248*7594170eSAndroid Build Coastguard Worker if shared_linking: 249*7594170eSAndroid Build Coastguard Worker tidy_providing_deps = ( 250*7594170eSAndroid Build Coastguard Worker deps + 251*7594170eSAndroid Build Coastguard Worker implementation_deps + 252*7594170eSAndroid Build Coastguard Worker whole_archive_deps + 253*7594170eSAndroid Build Coastguard Worker implementation_whole_archive_deps + 254*7594170eSAndroid Build Coastguard Worker runtime_deps + 255*7594170eSAndroid Build Coastguard Worker dynamic_deps + 256*7594170eSAndroid Build Coastguard Worker implementation_dynamic_deps 257*7594170eSAndroid Build Coastguard Worker ) 258*7594170eSAndroid Build Coastguard Worker else: 259*7594170eSAndroid Build Coastguard Worker # We should only be running tidy actions for object files on which 260*7594170eSAndroid Build Coastguard Worker # we depend. For static libraries, only whole_archive_deps actually 261*7594170eSAndroid Build Coastguard Worker # create a linking dependency; other dependencies are header-only, 262*7594170eSAndroid Build Coastguard Worker # so we shouldn't try to run their tidy actions. 263*7594170eSAndroid Build Coastguard Worker tidy_providing_deps = whole_archive_deps + implementation_whole_archive_deps 264*7594170eSAndroid Build Coastguard Worker 265*7594170eSAndroid Build Coastguard Worker # Root target to handle combining of the providers of the language-specific targets. 266*7594170eSAndroid Build Coastguard Worker _cc_library_combiner( 267*7594170eSAndroid Build Coastguard Worker name = name, 268*7594170eSAndroid Build Coastguard Worker shared_linking = shared_linking, 269*7594170eSAndroid Build Coastguard Worker roots = [cpp_name, c_name, asm_name], 270*7594170eSAndroid Build Coastguard Worker deps = whole_archive_deps + implementation_whole_archive_deps, 271*7594170eSAndroid Build Coastguard Worker additional_sanitizer_deps = ( 272*7594170eSAndroid Build Coastguard Worker deps + 273*7594170eSAndroid Build Coastguard Worker stl_info.deps + 274*7594170eSAndroid Build Coastguard Worker stl_info.static_deps + 275*7594170eSAndroid Build Coastguard Worker implementation_deps 276*7594170eSAndroid Build Coastguard Worker ), 277*7594170eSAndroid Build Coastguard Worker runtime_deps = runtime_deps, 278*7594170eSAndroid Build Coastguard Worker target_compatible_with = target_compatible_with, 279*7594170eSAndroid Build Coastguard Worker alwayslink = alwayslink, 280*7594170eSAndroid Build Coastguard Worker static_deps = deps + implementation_deps + whole_archive_deps + implementation_whole_archive_deps, 281*7594170eSAndroid Build Coastguard Worker androidmk_static_deps = deps + implementation_deps + stl_info.static_deps, 282*7594170eSAndroid Build Coastguard Worker androidmk_whole_archive_deps = whole_archive_deps + implementation_whole_archive_deps, 283*7594170eSAndroid Build Coastguard Worker androidmk_dynamic_deps = dynamic_deps + implementation_dynamic_deps + system_dynamic_deps + stl_info.shared_deps, 284*7594170eSAndroid Build Coastguard Worker exports = exports_name, 285*7594170eSAndroid Build Coastguard Worker applicable_licenses = applicable_licenses, 286*7594170eSAndroid Build Coastguard Worker tags = tags, 287*7594170eSAndroid Build Coastguard Worker features = toolchain_features, 288*7594170eSAndroid Build Coastguard Worker 289*7594170eSAndroid Build Coastguard Worker # clang-tidy attributes 290*7594170eSAndroid Build Coastguard Worker tidy = tidy, 291*7594170eSAndroid Build Coastguard Worker srcs_cpp = srcs, 292*7594170eSAndroid Build Coastguard Worker srcs_c = srcs_c, 293*7594170eSAndroid Build Coastguard Worker copts_cpp = copts + cppflags, 294*7594170eSAndroid Build Coastguard Worker copts_c = copts + conlyflags, 295*7594170eSAndroid Build Coastguard Worker hdrs = hdrs, 296*7594170eSAndroid Build Coastguard Worker includes = [locals_name, exports_name], 297*7594170eSAndroid Build Coastguard Worker tidy_flags = tidy_flags, 298*7594170eSAndroid Build Coastguard Worker tidy_checks = tidy_checks, 299*7594170eSAndroid Build Coastguard Worker tidy_checks_as_errors = tidy_checks_as_errors, 300*7594170eSAndroid Build Coastguard Worker tidy_disabled_srcs = tidy_disabled_srcs, 301*7594170eSAndroid Build Coastguard Worker tidy_timeout_srcs = tidy_timeout_srcs, 302*7594170eSAndroid Build Coastguard Worker tidy_gen_header_filter = tidy_gen_header_filter, 303*7594170eSAndroid Build Coastguard Worker tidy_providing_deps = tidy_providing_deps, 304*7594170eSAndroid Build Coastguard Worker ) 305*7594170eSAndroid Build Coastguard Worker 306*7594170eSAndroid Build Coastguard Workerdef _generate_tidy_files(ctx): 307*7594170eSAndroid Build Coastguard Worker disabled_srcs = [] + ctx.files.tidy_disabled_srcs 308*7594170eSAndroid Build Coastguard Worker tidy_timeout = ctx.attr._tidy_timeout[BuildSettingInfo].value 309*7594170eSAndroid Build Coastguard Worker if tidy_timeout != "": 310*7594170eSAndroid Build Coastguard Worker disabled_srcs.extend(ctx.attr.tidy_timeout_srcs) 311*7594170eSAndroid Build Coastguard Worker 312*7594170eSAndroid Build Coastguard Worker if ctx.attr.tidy_gen_header_filter: 313*7594170eSAndroid Build Coastguard Worker if ctx.attr.tidy_flags: 314*7594170eSAndroid Build Coastguard Worker fail("tidy_flags cannot be set when also using tidy_gen_header_filter") 315*7594170eSAndroid Build Coastguard Worker tidy_flags = ["-header-filter=" + paths.join(ctx.genfiles_dir.path, ctx.label.package) + ".*"] 316*7594170eSAndroid Build Coastguard Worker else: 317*7594170eSAndroid Build Coastguard Worker tidy_flags = ctx.attr.tidy_flags 318*7594170eSAndroid Build Coastguard Worker 319*7594170eSAndroid Build Coastguard Worker cpp_srcs, cpp_hdrs = get_non_header_srcs( 320*7594170eSAndroid Build Coastguard Worker ctx.files.srcs_cpp, 321*7594170eSAndroid Build Coastguard Worker ctx.files.tidy_disabled_srcs, 322*7594170eSAndroid Build Coastguard Worker source_extensions = CPP_EXTENSIONS, 323*7594170eSAndroid Build Coastguard Worker ) 324*7594170eSAndroid Build Coastguard Worker c_srcs, c_hdrs = get_non_header_srcs( 325*7594170eSAndroid Build Coastguard Worker ctx.files.srcs_cpp + ctx.files.srcs_c, 326*7594170eSAndroid Build Coastguard Worker ctx.files.tidy_disabled_srcs, 327*7594170eSAndroid Build Coastguard Worker source_extensions = C_EXTENSIONS, 328*7594170eSAndroid Build Coastguard Worker ) 329*7594170eSAndroid Build Coastguard Worker hdrs = ctx.files.hdrs + cpp_hdrs + c_hdrs 330*7594170eSAndroid Build Coastguard Worker cpp_tidy_outs = generate_clang_tidy_actions( 331*7594170eSAndroid Build Coastguard Worker ctx, 332*7594170eSAndroid Build Coastguard Worker ctx.attr.copts_cpp, 333*7594170eSAndroid Build Coastguard Worker ctx.attr.deps + ctx.attr.includes, 334*7594170eSAndroid Build Coastguard Worker cpp_srcs, 335*7594170eSAndroid Build Coastguard Worker hdrs, 336*7594170eSAndroid Build Coastguard Worker "c++", 337*7594170eSAndroid Build Coastguard Worker tidy_flags, 338*7594170eSAndroid Build Coastguard Worker ctx.attr.tidy_checks, 339*7594170eSAndroid Build Coastguard Worker ctx.attr.tidy_checks_as_errors, 340*7594170eSAndroid Build Coastguard Worker tidy_timeout, 341*7594170eSAndroid Build Coastguard Worker ) 342*7594170eSAndroid Build Coastguard Worker c_tidy_outs = generate_clang_tidy_actions( 343*7594170eSAndroid Build Coastguard Worker ctx, 344*7594170eSAndroid Build Coastguard Worker ctx.attr.copts_c, 345*7594170eSAndroid Build Coastguard Worker ctx.attr.deps + ctx.attr.includes, 346*7594170eSAndroid Build Coastguard Worker c_srcs, 347*7594170eSAndroid Build Coastguard Worker hdrs, 348*7594170eSAndroid Build Coastguard Worker "c", 349*7594170eSAndroid Build Coastguard Worker tidy_flags, 350*7594170eSAndroid Build Coastguard Worker ctx.attr.tidy_checks, 351*7594170eSAndroid Build Coastguard Worker ctx.attr.tidy_checks_as_errors, 352*7594170eSAndroid Build Coastguard Worker tidy_timeout, 353*7594170eSAndroid Build Coastguard Worker ) 354*7594170eSAndroid Build Coastguard Worker return cpp_tidy_outs + c_tidy_outs 355*7594170eSAndroid Build Coastguard Worker 356*7594170eSAndroid Build Coastguard Workerdef _generate_tidy_actions(ctx): 357*7594170eSAndroid Build Coastguard Worker transitive_tidy_files = [] 358*7594170eSAndroid Build Coastguard Worker for attr, attr_targets in get_dep_targets(ctx.attr, predicate = lambda t: ClangTidyInfo in t).items(): 359*7594170eSAndroid Build Coastguard Worker if attr == "tidy_providing_deps": 360*7594170eSAndroid Build Coastguard Worker for t in attr_targets: 361*7594170eSAndroid Build Coastguard Worker transitive_tidy_files.append(t[ClangTidyInfo].transitive_tidy_files) 362*7594170eSAndroid Build Coastguard Worker 363*7594170eSAndroid Build Coastguard Worker with_tidy = ctx.attr._with_tidy[BuildSettingInfo].value 364*7594170eSAndroid Build Coastguard Worker allow_local_tidy_true = ctx.attr._allow_local_tidy_true[BuildSettingInfo].value 365*7594170eSAndroid Build Coastguard Worker tidy_external_vendor = ctx.attr._tidy_external_vendor[BuildSettingInfo].value 366*7594170eSAndroid Build Coastguard Worker tidy_enabled = (with_tidy and ctx.attr.tidy != "never") or (allow_local_tidy_true and ctx.attr.tidy == "local") 367*7594170eSAndroid Build Coastguard Worker should_run_for_current_package = clang_tidy_for_dir(tidy_external_vendor, ctx.label.package) 368*7594170eSAndroid Build Coastguard Worker if tidy_enabled and should_run_for_current_package: 369*7594170eSAndroid Build Coastguard Worker direct_tidy_files = _generate_tidy_files(ctx) 370*7594170eSAndroid Build Coastguard Worker else: 371*7594170eSAndroid Build Coastguard Worker direct_tidy_files = None 372*7594170eSAndroid Build Coastguard Worker 373*7594170eSAndroid Build Coastguard Worker tidy_files = depset( 374*7594170eSAndroid Build Coastguard Worker direct = direct_tidy_files, 375*7594170eSAndroid Build Coastguard Worker ) 376*7594170eSAndroid Build Coastguard Worker transitive_tidy_files = depset( 377*7594170eSAndroid Build Coastguard Worker direct = direct_tidy_files, 378*7594170eSAndroid Build Coastguard Worker transitive = transitive_tidy_files, 379*7594170eSAndroid Build Coastguard Worker ) 380*7594170eSAndroid Build Coastguard Worker return [ 381*7594170eSAndroid Build Coastguard Worker OutputGroupInfo( 382*7594170eSAndroid Build Coastguard Worker _validation = tidy_files, 383*7594170eSAndroid Build Coastguard Worker ), 384*7594170eSAndroid Build Coastguard Worker ClangTidyInfo( 385*7594170eSAndroid Build Coastguard Worker tidy_files = tidy_files, 386*7594170eSAndroid Build Coastguard Worker transitive_tidy_files = transitive_tidy_files, 387*7594170eSAndroid Build Coastguard Worker ), 388*7594170eSAndroid Build Coastguard Worker ] 389*7594170eSAndroid Build Coastguard Worker 390*7594170eSAndroid Build Coastguard Workerdef _archive_with_prebuilt_libs(ctx, prebuilt_deps, linking_outputs, cc_toolchain): 391*7594170eSAndroid Build Coastguard Worker linking_output = linking_outputs.library_to_link.static_library 392*7594170eSAndroid Build Coastguard Worker if not prebuilt_deps: 393*7594170eSAndroid Build Coastguard Worker return linking_output 394*7594170eSAndroid Build Coastguard Worker 395*7594170eSAndroid Build Coastguard Worker feature_configuration = cc_common.configure_features( 396*7594170eSAndroid Build Coastguard Worker ctx = ctx, 397*7594170eSAndroid Build Coastguard Worker cc_toolchain = cc_toolchain, 398*7594170eSAndroid Build Coastguard Worker requested_features = ctx.features + ["archive_with_prebuilt_flags"], 399*7594170eSAndroid Build Coastguard Worker unsupported_features = ctx.disabled_features + ["linker_flags", "archiver_flags"], 400*7594170eSAndroid Build Coastguard Worker ) 401*7594170eSAndroid Build Coastguard Worker 402*7594170eSAndroid Build Coastguard Worker output_file = ctx.actions.declare_file("lib" + ctx.label.name + ".a") 403*7594170eSAndroid Build Coastguard Worker 404*7594170eSAndroid Build Coastguard Worker archiver_path = cc_common.get_tool_for_action( 405*7594170eSAndroid Build Coastguard Worker feature_configuration = feature_configuration, 406*7594170eSAndroid Build Coastguard Worker action_name = ACTION_NAMES.cpp_link_static_library, 407*7594170eSAndroid Build Coastguard Worker ) 408*7594170eSAndroid Build Coastguard Worker archiver_variables = cc_common.create_link_variables( 409*7594170eSAndroid Build Coastguard Worker feature_configuration = feature_configuration, 410*7594170eSAndroid Build Coastguard Worker cc_toolchain = cc_toolchain, 411*7594170eSAndroid Build Coastguard Worker output_file = output_file.path, 412*7594170eSAndroid Build Coastguard Worker is_using_linker = False, 413*7594170eSAndroid Build Coastguard Worker ) 414*7594170eSAndroid Build Coastguard Worker command_line = cc_common.get_memory_inefficient_command_line( 415*7594170eSAndroid Build Coastguard Worker feature_configuration = feature_configuration, 416*7594170eSAndroid Build Coastguard Worker action_name = ACTION_NAMES.cpp_link_static_library, 417*7594170eSAndroid Build Coastguard Worker variables = archiver_variables, 418*7594170eSAndroid Build Coastguard Worker ) 419*7594170eSAndroid Build Coastguard Worker args = ctx.actions.args() 420*7594170eSAndroid Build Coastguard Worker args.add_all(command_line) 421*7594170eSAndroid Build Coastguard Worker args.add(linking_output) 422*7594170eSAndroid Build Coastguard Worker args.add_all(prebuilt_deps) 423*7594170eSAndroid Build Coastguard Worker 424*7594170eSAndroid Build Coastguard Worker ctx.actions.run( 425*7594170eSAndroid Build Coastguard Worker executable = archiver_path, 426*7594170eSAndroid Build Coastguard Worker arguments = [args], 427*7594170eSAndroid Build Coastguard Worker inputs = depset( 428*7594170eSAndroid Build Coastguard Worker direct = [linking_output] + prebuilt_deps, 429*7594170eSAndroid Build Coastguard Worker transitive = [ 430*7594170eSAndroid Build Coastguard Worker cc_toolchain.all_files, 431*7594170eSAndroid Build Coastguard Worker ], 432*7594170eSAndroid Build Coastguard Worker ), 433*7594170eSAndroid Build Coastguard Worker outputs = [output_file], 434*7594170eSAndroid Build Coastguard Worker mnemonic = "CppArchive", 435*7594170eSAndroid Build Coastguard Worker ) 436*7594170eSAndroid Build Coastguard Worker 437*7594170eSAndroid Build Coastguard Worker return output_file 438*7594170eSAndroid Build Coastguard Worker 439*7594170eSAndroid Build Coastguard Worker# Returns a CcInfo object which combines one or more CcInfo objects, except that all 440*7594170eSAndroid Build Coastguard Worker# linker inputs owned by owners in `old_owner_labels` are relinked and owned by the current target. 441*7594170eSAndroid Build Coastguard Worker# 442*7594170eSAndroid Build Coastguard Worker# This is useful in the "macro with proxy rule" pattern, as some rules upstream 443*7594170eSAndroid Build Coastguard Worker# may expect they are depending directly on a target which generates linker inputs, 444*7594170eSAndroid Build Coastguard Worker# as opposed to a proxy target which is a level of indirection to such a target. 445*7594170eSAndroid Build Coastguard Workerdef _cc_library_combiner_impl(ctx): 446*7594170eSAndroid Build Coastguard Worker sanitizer_lib_info = get_sanitizer_lib_info(ctx.attr.features, ctx.attr.deps + ctx.attr.additional_sanitizer_deps) 447*7594170eSAndroid Build Coastguard Worker 448*7594170eSAndroid Build Coastguard Worker old_owner_labels = [] 449*7594170eSAndroid Build Coastguard Worker cc_infos = [] 450*7594170eSAndroid Build Coastguard Worker 451*7594170eSAndroid Build Coastguard Worker # Soong links whole archive deps of a static lib differently, all the .o files 452*7594170eSAndroid Build Coastguard Worker # from the whole archive deps will be loaded into the static lib. This is 453*7594170eSAndroid Build Coastguard Worker # different from when linking from a shared lib, in which case the whole 454*7594170eSAndroid Build Coastguard Worker # archive deps will be linked separately. 455*7594170eSAndroid Build Coastguard Worker if not ctx.attr.shared_linking: 456*7594170eSAndroid Build Coastguard Worker for dep in ctx.attr.deps: 457*7594170eSAndroid Build Coastguard Worker old_owner_labels.append(dep.label) 458*7594170eSAndroid Build Coastguard Worker cc_info = dep[CcInfo] 459*7594170eSAndroid Build Coastguard Worker 460*7594170eSAndroid Build Coastguard Worker # do not propagate includes, hdrs, etc, already handled by roots 461*7594170eSAndroid Build Coastguard Worker cc_infos.append(CcInfo(linking_context = cc_info.linking_context)) 462*7594170eSAndroid Build Coastguard Worker 463*7594170eSAndroid Build Coastguard Worker # we handle roots after deps to mimic Soong handling objects from whole archive deps prior to objects from the target itself 464*7594170eSAndroid Build Coastguard Worker for dep in ctx.attr.roots: 465*7594170eSAndroid Build Coastguard Worker old_owner_labels.append(dep.label) 466*7594170eSAndroid Build Coastguard Worker cc_infos.append(dep[CcInfo]) 467*7594170eSAndroid Build Coastguard Worker 468*7594170eSAndroid Build Coastguard Worker direct_owner_labels = [] 469*7594170eSAndroid Build Coastguard Worker if ctx.attr.shared_linking: 470*7594170eSAndroid Build Coastguard Worker for dep in ctx.attr.static_deps: 471*7594170eSAndroid Build Coastguard Worker if dep.label in old_owner_labels: 472*7594170eSAndroid Build Coastguard Worker continue 473*7594170eSAndroid Build Coastguard Worker direct_owner_labels.append(dep.label) 474*7594170eSAndroid Build Coastguard Worker cc_info = dep[CcInfo] 475*7594170eSAndroid Build Coastguard Worker 476*7594170eSAndroid Build Coastguard Worker # do not propagate includes, hdrs, etc, already handled by roots 477*7594170eSAndroid Build Coastguard Worker cc_infos.append(CcInfo(linking_context = cc_info.linking_context)) 478*7594170eSAndroid Build Coastguard Worker if sanitizer_lib_info.propagate_ubsan_deps: 479*7594170eSAndroid Build Coastguard Worker direct_owner_labels.append(ctx.attr._ubsan_library.label) 480*7594170eSAndroid Build Coastguard Worker cc_infos.append(CcInfo(linking_context = ctx.attr._ubsan_library[CcInfo].linking_context)) 481*7594170eSAndroid Build Coastguard Worker 482*7594170eSAndroid Build Coastguard Worker combined_info = cc_common.merge_cc_infos(cc_infos = cc_infos) 483*7594170eSAndroid Build Coastguard Worker 484*7594170eSAndroid Build Coastguard Worker objects_to_link = [] 485*7594170eSAndroid Build Coastguard Worker extra_linker_inputs = [] 486*7594170eSAndroid Build Coastguard Worker 487*7594170eSAndroid Build Coastguard Worker prebuilt_deps = [] 488*7594170eSAndroid Build Coastguard Worker 489*7594170eSAndroid Build Coastguard Worker # This is not ideal, as it flattens a depset. 490*7594170eSAndroid Build Coastguard Worker for old_linker_input in combined_info.linking_context.linker_inputs.to_list(): 491*7594170eSAndroid Build Coastguard Worker if old_linker_input.owner in old_owner_labels: 492*7594170eSAndroid Build Coastguard Worker for lib in old_linker_input.libraries: 493*7594170eSAndroid Build Coastguard Worker # These objects will be recombined into the root archive. 494*7594170eSAndroid Build Coastguard Worker objects_to_link.extend(lib.objects) 495*7594170eSAndroid Build Coastguard Worker 496*7594170eSAndroid Build Coastguard Worker # This is a prebuilt library, we have to handle it separately 497*7594170eSAndroid Build Coastguard Worker if not lib.objects and lib.static_library: 498*7594170eSAndroid Build Coastguard Worker prebuilt_deps.append(lib.static_library) 499*7594170eSAndroid Build Coastguard Worker elif ctx.attr.shared_linking: 500*7594170eSAndroid Build Coastguard Worker if old_linker_input.owner in direct_owner_labels: 501*7594170eSAndroid Build Coastguard Worker extra_linker_inputs.append(old_linker_input) 502*7594170eSAndroid Build Coastguard Worker else: 503*7594170eSAndroid Build Coastguard Worker # Android macros don't handle transitive linker dependencies because 504*7594170eSAndroid Build Coastguard Worker # it's unsupported in legacy. We may want to change this going forward, 505*7594170eSAndroid Build Coastguard Worker # but for now it's good to validate that this invariant remains. 506*7594170eSAndroid Build Coastguard Worker fail("cc_static_library %s given transitive linker dependency from %s %s" % (ctx.label, old_linker_input.owner, old_owner_labels)) 507*7594170eSAndroid Build Coastguard Worker 508*7594170eSAndroid Build Coastguard Worker cc_toolchain = find_cpp_toolchain(ctx) 509*7594170eSAndroid Build Coastguard Worker 510*7594170eSAndroid Build Coastguard Worker feature_configuration = cc_common.configure_features( 511*7594170eSAndroid Build Coastguard Worker ctx = ctx, 512*7594170eSAndroid Build Coastguard Worker cc_toolchain = cc_toolchain, 513*7594170eSAndroid Build Coastguard Worker requested_features = ctx.features + ["archiver_flags"], 514*7594170eSAndroid Build Coastguard Worker unsupported_features = ctx.disabled_features + ["linker_flags"], 515*7594170eSAndroid Build Coastguard Worker ) 516*7594170eSAndroid Build Coastguard Worker 517*7594170eSAndroid Build Coastguard Worker out_name = ctx.label.name 518*7594170eSAndroid Build Coastguard Worker if prebuilt_deps: 519*7594170eSAndroid Build Coastguard Worker out_name += "_objs_only" 520*7594170eSAndroid Build Coastguard Worker linking_context, linking_outputs = cc_common.create_linking_context_from_compilation_outputs( 521*7594170eSAndroid Build Coastguard Worker actions = ctx.actions, 522*7594170eSAndroid Build Coastguard Worker name = out_name, 523*7594170eSAndroid Build Coastguard Worker feature_configuration = feature_configuration, 524*7594170eSAndroid Build Coastguard Worker cc_toolchain = cc_toolchain, 525*7594170eSAndroid Build Coastguard Worker alwayslink = ctx.attr.alwayslink, 526*7594170eSAndroid Build Coastguard Worker disallow_dynamic_library = True, 527*7594170eSAndroid Build Coastguard Worker compilation_outputs = cc_common.create_compilation_outputs(objects = depset(direct = objects_to_link)), 528*7594170eSAndroid Build Coastguard Worker ) 529*7594170eSAndroid Build Coastguard Worker 530*7594170eSAndroid Build Coastguard Worker output_file = _archive_with_prebuilt_libs(ctx, prebuilt_deps, linking_outputs, cc_toolchain) 531*7594170eSAndroid Build Coastguard Worker linker_input = cc_common.create_linker_input( 532*7594170eSAndroid Build Coastguard Worker owner = ctx.label, 533*7594170eSAndroid Build Coastguard Worker libraries = depset( 534*7594170eSAndroid Build Coastguard Worker direct = [ 535*7594170eSAndroid Build Coastguard Worker cc_common.create_library_to_link( 536*7594170eSAndroid Build Coastguard Worker actions = ctx.actions, 537*7594170eSAndroid Build Coastguard Worker feature_configuration = feature_configuration, 538*7594170eSAndroid Build Coastguard Worker cc_toolchain = cc_toolchain, 539*7594170eSAndroid Build Coastguard Worker static_library = output_file, 540*7594170eSAndroid Build Coastguard Worker objects = objects_to_link, 541*7594170eSAndroid Build Coastguard Worker alwayslink = ctx.attr.alwayslink, 542*7594170eSAndroid Build Coastguard Worker ), 543*7594170eSAndroid Build Coastguard Worker ], 544*7594170eSAndroid Build Coastguard Worker ), 545*7594170eSAndroid Build Coastguard Worker ) 546*7594170eSAndroid Build Coastguard Worker linking_context = cc_common.create_linking_context( 547*7594170eSAndroid Build Coastguard Worker linker_inputs = depset( 548*7594170eSAndroid Build Coastguard Worker direct = [linker_input], 549*7594170eSAndroid Build Coastguard Worker transitive = [depset(direct = extra_linker_inputs)], 550*7594170eSAndroid Build Coastguard Worker ), 551*7594170eSAndroid Build Coastguard Worker ) 552*7594170eSAndroid Build Coastguard Worker 553*7594170eSAndroid Build Coastguard Worker providers = [ 554*7594170eSAndroid Build Coastguard Worker DefaultInfo(files = depset(direct = [output_file]), data_runfiles = ctx.runfiles(files = [output_file])), 555*7594170eSAndroid Build Coastguard Worker CcInfo(compilation_context = combined_info.compilation_context, linking_context = linking_context), 556*7594170eSAndroid Build Coastguard Worker CcStaticLibraryInfo(root_static_archive = output_file, objects = objects_to_link), 557*7594170eSAndroid Build Coastguard Worker sanitizer_lib_info, 558*7594170eSAndroid Build Coastguard Worker create_cc_androidmk_provider( 559*7594170eSAndroid Build Coastguard Worker static_deps = ctx.attr.androidmk_static_deps, 560*7594170eSAndroid Build Coastguard Worker whole_archive_deps = ctx.attr.androidmk_whole_archive_deps, 561*7594170eSAndroid Build Coastguard Worker dynamic_deps = ctx.attr.androidmk_dynamic_deps, 562*7594170eSAndroid Build Coastguard Worker ), 563*7594170eSAndroid Build Coastguard Worker ] 564*7594170eSAndroid Build Coastguard Worker providers.extend(_generate_tidy_actions(ctx)) 565*7594170eSAndroid Build Coastguard Worker if ctx.attr.shared_linking: 566*7594170eSAndroid Build Coastguard Worker providers.append( 567*7594170eSAndroid Build Coastguard Worker # cc_shared_library only needs to traverse some attrs of the root library 568*7594170eSAndroid Build Coastguard Worker cc_common.CcSharedLibraryHintInfo( 569*7594170eSAndroid Build Coastguard Worker attributes = [ 570*7594170eSAndroid Build Coastguard Worker "roots", 571*7594170eSAndroid Build Coastguard Worker "deps", 572*7594170eSAndroid Build Coastguard Worker "static_deps", 573*7594170eSAndroid Build Coastguard Worker "_ubsan_library", 574*7594170eSAndroid Build Coastguard Worker ], 575*7594170eSAndroid Build Coastguard Worker ), 576*7594170eSAndroid Build Coastguard Worker ) 577*7594170eSAndroid Build Coastguard Worker else: 578*7594170eSAndroid Build Coastguard Worker providers.append(cc_common.CcSharedLibraryHintInfo( 579*7594170eSAndroid Build Coastguard Worker # cc_shared_library only needs to traverse some attrs of a static library 580*7594170eSAndroid Build Coastguard Worker attributes = [], 581*7594170eSAndroid Build Coastguard Worker )) 582*7594170eSAndroid Build Coastguard Worker 583*7594170eSAndroid Build Coastguard Worker return providers 584*7594170eSAndroid Build Coastguard Worker 585*7594170eSAndroid Build Coastguard Worker# A rule which combines objects of oen or more cc_library targets into a single 586*7594170eSAndroid Build Coastguard Worker# static linker input. This outputs a single archive file combining the objects 587*7594170eSAndroid Build Coastguard Worker# of its direct deps, and propagates Cc providers describing that these objects 588*7594170eSAndroid Build Coastguard Worker# should be linked for linking rules upstream. 589*7594170eSAndroid Build Coastguard Worker# This rule is useful for maintaining the illusion that the target's deps are 590*7594170eSAndroid Build Coastguard Worker# comprised by a single consistent rule: 591*7594170eSAndroid Build Coastguard Worker# - A single archive file is always output by this rule. 592*7594170eSAndroid Build Coastguard Worker# - A single linker input struct is always output by this rule, and it is 'owned' 593*7594170eSAndroid Build Coastguard Worker# by this rule. 594*7594170eSAndroid Build Coastguard Worker_cc_library_combiner = rule( 595*7594170eSAndroid Build Coastguard Worker implementation = _cc_library_combiner_impl, 596*7594170eSAndroid Build Coastguard Worker cfg = drop_sanitizer_enablement_transition, 597*7594170eSAndroid Build Coastguard Worker attrs = { 598*7594170eSAndroid Build Coastguard Worker "roots": attr.label_list( 599*7594170eSAndroid Build Coastguard Worker providers = [CcInfo], 600*7594170eSAndroid Build Coastguard Worker cfg = lto_and_sanitizer_static_transition, 601*7594170eSAndroid Build Coastguard Worker ), 602*7594170eSAndroid Build Coastguard Worker "deps": attr.label_list( 603*7594170eSAndroid Build Coastguard Worker providers = [CcInfo], 604*7594170eSAndroid Build Coastguard Worker cfg = lto_and_sanitizer_static_transition, 605*7594170eSAndroid Build Coastguard Worker ), 606*7594170eSAndroid Build Coastguard Worker "shared_linking": attr.bool( 607*7594170eSAndroid Build Coastguard Worker doc = "Whether to link as needed for shared libraries, rather than as needed for a static libraries.", 608*7594170eSAndroid Build Coastguard Worker default = False, 609*7594170eSAndroid Build Coastguard Worker ), 610*7594170eSAndroid Build Coastguard Worker "additional_sanitizer_deps": attr.label_list( 611*7594170eSAndroid Build Coastguard Worker providers = [CcInfo], 612*7594170eSAndroid Build Coastguard Worker cfg = lto_and_sanitizer_static_transition, 613*7594170eSAndroid Build Coastguard Worker doc = "Deps used only to check for sanitizer enablement", 614*7594170eSAndroid Build Coastguard Worker ), 615*7594170eSAndroid Build Coastguard Worker "runtime_deps": attr.label_list( 616*7594170eSAndroid Build Coastguard Worker providers = [CcInfo], 617*7594170eSAndroid Build Coastguard Worker doc = "Deps that should be installed along with this target. Read by the apex cc aspect.", 618*7594170eSAndroid Build Coastguard Worker ), 619*7594170eSAndroid Build Coastguard Worker "static_deps": attr.label_list( 620*7594170eSAndroid Build Coastguard Worker providers = [CcInfo], 621*7594170eSAndroid Build Coastguard Worker doc = "All the static deps of the lib. This is used by" + 622*7594170eSAndroid Build Coastguard Worker " abi_dump_aspect to travel along the static_deps edges" + 623*7594170eSAndroid Build Coastguard Worker " to create abi dump files.", 624*7594170eSAndroid Build Coastguard Worker ), 625*7594170eSAndroid Build Coastguard Worker "_ubsan_library": attr.label( 626*7594170eSAndroid Build Coastguard Worker default = "//prebuilts/clang/host/linux-x86:libclang_rt.ubsan_minimal", 627*7594170eSAndroid Build Coastguard Worker doc = "The library target corresponding to the undefined " + 628*7594170eSAndroid Build Coastguard Worker "behavior sanitizer library to be used", 629*7594170eSAndroid Build Coastguard Worker ), 630*7594170eSAndroid Build Coastguard Worker "androidmk_static_deps": attr.label_list( 631*7594170eSAndroid Build Coastguard Worker providers = [CcInfo], 632*7594170eSAndroid Build Coastguard Worker doc = "All the whole archive deps of the lib. This is used to propagate" + 633*7594170eSAndroid Build Coastguard Worker " information to AndroidMk about LOCAL_STATIC_LIBRARIES.", 634*7594170eSAndroid Build Coastguard Worker ), 635*7594170eSAndroid Build Coastguard Worker "androidmk_whole_archive_deps": attr.label_list( 636*7594170eSAndroid Build Coastguard Worker providers = [CcInfo], 637*7594170eSAndroid Build Coastguard Worker doc = "All the whole archive deps of the lib. This is used to propagate" + 638*7594170eSAndroid Build Coastguard Worker " information to AndroidMk about LOCAL_WHOLE_STATIC_LIBRARIES.", 639*7594170eSAndroid Build Coastguard Worker ), 640*7594170eSAndroid Build Coastguard Worker "androidmk_dynamic_deps": attr.label_list( 641*7594170eSAndroid Build Coastguard Worker providers = [CcInfo], 642*7594170eSAndroid Build Coastguard Worker doc = "All the dynamic deps of the lib. This is used to propagate" + 643*7594170eSAndroid Build Coastguard Worker " information to AndroidMk about LOCAL_SHARED_LIBRARIES." + 644*7594170eSAndroid Build Coastguard Worker " The attribute name is prefixed with androidmk to avoid" + 645*7594170eSAndroid Build Coastguard Worker " collision with the dynamic_deps attribute used in APEX" + 646*7594170eSAndroid Build Coastguard Worker " aspects' propagation.", 647*7594170eSAndroid Build Coastguard Worker ), 648*7594170eSAndroid Build Coastguard Worker "exports": attr.label( 649*7594170eSAndroid Build Coastguard Worker providers = [CcInfo], 650*7594170eSAndroid Build Coastguard Worker cfg = lto_and_sanitizer_static_transition, 651*7594170eSAndroid Build Coastguard Worker ), 652*7594170eSAndroid Build Coastguard Worker "_cc_toolchain": attr.label( 653*7594170eSAndroid Build Coastguard Worker default = Label("@local_config_cc//:toolchain"), 654*7594170eSAndroid Build Coastguard Worker providers = [cc_common.CcToolchainInfo], 655*7594170eSAndroid Build Coastguard Worker doc = "The exported includes used by abi_dump_aspect to retrieve" + 656*7594170eSAndroid Build Coastguard Worker " and use as the inputs of abi dumper binary.", 657*7594170eSAndroid Build Coastguard Worker ), 658*7594170eSAndroid Build Coastguard Worker "alwayslink": attr.bool( 659*7594170eSAndroid Build Coastguard Worker doc = """At link time, whether these libraries should be wrapped in 660*7594170eSAndroid Build Coastguard Worker the --whole_archive block. This causes all libraries in the static 661*7594170eSAndroid Build Coastguard Worker archive to be unconditionally linked, regardless of whether the 662*7594170eSAndroid Build Coastguard Worker symbols in these object files are being searched by the linker.""", 663*7594170eSAndroid Build Coastguard Worker default = False, 664*7594170eSAndroid Build Coastguard Worker ), 665*7594170eSAndroid Build Coastguard Worker 666*7594170eSAndroid Build Coastguard Worker # Clang-tidy attributes 667*7594170eSAndroid Build Coastguard Worker "tidy": attr.string(values = ["", "local", "never"]), 668*7594170eSAndroid Build Coastguard Worker "srcs_cpp": attr.label_list(allow_files = True), 669*7594170eSAndroid Build Coastguard Worker "srcs_c": attr.label_list(allow_files = True), 670*7594170eSAndroid Build Coastguard Worker "copts_cpp": attr.string_list(), 671*7594170eSAndroid Build Coastguard Worker "copts_c": attr.string_list(), 672*7594170eSAndroid Build Coastguard Worker "hdrs": attr.label_list(allow_files = True), 673*7594170eSAndroid Build Coastguard Worker "includes": attr.label_list(cfg = lto_and_sanitizer_static_transition), 674*7594170eSAndroid Build Coastguard Worker "tidy_checks": attr.string_list(), 675*7594170eSAndroid Build Coastguard Worker "tidy_checks_as_errors": attr.string_list(), 676*7594170eSAndroid Build Coastguard Worker "tidy_flags": attr.string_list(), 677*7594170eSAndroid Build Coastguard Worker "tidy_disabled_srcs": attr.label_list(allow_files = True), 678*7594170eSAndroid Build Coastguard Worker "tidy_timeout_srcs": attr.label_list(allow_files = True), 679*7594170eSAndroid Build Coastguard Worker "tidy_gen_header_filter": attr.bool(), 680*7594170eSAndroid Build Coastguard Worker "tidy_providing_deps": attr.label_list(), 681*7594170eSAndroid Build Coastguard Worker "_clang_tidy_sh": attr.label( 682*7594170eSAndroid Build Coastguard Worker default = Label("@//prebuilts/clang/host/linux-x86:clang-tidy.sh"), 683*7594170eSAndroid Build Coastguard Worker allow_single_file = True, 684*7594170eSAndroid Build Coastguard Worker executable = True, 685*7594170eSAndroid Build Coastguard Worker cfg = "exec", 686*7594170eSAndroid Build Coastguard Worker doc = "The clang tidy shell wrapper", 687*7594170eSAndroid Build Coastguard Worker ), 688*7594170eSAndroid Build Coastguard Worker "_clang_tidy": attr.label( 689*7594170eSAndroid Build Coastguard Worker default = Label("@//prebuilts/clang/host/linux-x86:clang-tidy"), 690*7594170eSAndroid Build Coastguard Worker allow_single_file = True, 691*7594170eSAndroid Build Coastguard Worker executable = True, 692*7594170eSAndroid Build Coastguard Worker cfg = "exec", 693*7594170eSAndroid Build Coastguard Worker doc = "The clang tidy executable", 694*7594170eSAndroid Build Coastguard Worker ), 695*7594170eSAndroid Build Coastguard Worker "_clang_tidy_real": attr.label( 696*7594170eSAndroid Build Coastguard Worker default = Label("@//prebuilts/clang/host/linux-x86:clang-tidy.real"), 697*7594170eSAndroid Build Coastguard Worker allow_single_file = True, 698*7594170eSAndroid Build Coastguard Worker executable = True, 699*7594170eSAndroid Build Coastguard Worker cfg = "exec", 700*7594170eSAndroid Build Coastguard Worker ), 701*7594170eSAndroid Build Coastguard Worker "_with_tidy": attr.label( 702*7594170eSAndroid Build Coastguard Worker default = "//build/bazel/flags/cc/tidy:with_tidy", 703*7594170eSAndroid Build Coastguard Worker ), 704*7594170eSAndroid Build Coastguard Worker "_allow_local_tidy_true": attr.label( 705*7594170eSAndroid Build Coastguard Worker default = "//build/bazel/flags/cc/tidy:allow_local_tidy_true", 706*7594170eSAndroid Build Coastguard Worker ), 707*7594170eSAndroid Build Coastguard Worker "_with_tidy_flags": attr.label( 708*7594170eSAndroid Build Coastguard Worker default = "//build/bazel/flags/cc/tidy:with_tidy_flags", 709*7594170eSAndroid Build Coastguard Worker ), 710*7594170eSAndroid Build Coastguard Worker "_default_tidy_header_dirs": attr.label( 711*7594170eSAndroid Build Coastguard Worker default = "//build/bazel/flags/cc/tidy:default_tidy_header_dirs", 712*7594170eSAndroid Build Coastguard Worker ), 713*7594170eSAndroid Build Coastguard Worker "_tidy_timeout": attr.label( 714*7594170eSAndroid Build Coastguard Worker default = "//build/bazel/flags/cc/tidy:tidy_timeout", 715*7594170eSAndroid Build Coastguard Worker ), 716*7594170eSAndroid Build Coastguard Worker "_tidy_external_vendor": attr.label( 717*7594170eSAndroid Build Coastguard Worker default = "//build/bazel/flags/cc/tidy:tidy_external_vendor", 718*7594170eSAndroid Build Coastguard Worker ), 719*7594170eSAndroid Build Coastguard Worker "_allowlist_function_transition": attr.label( 720*7594170eSAndroid Build Coastguard Worker default = "@bazel_tools//tools/allowlists/function_transition_allowlist", 721*7594170eSAndroid Build Coastguard Worker ), 722*7594170eSAndroid Build Coastguard Worker "_tidy_checks": attr.label( 723*7594170eSAndroid Build Coastguard Worker default = "//build/bazel/product_config:tidy_checks", 724*7594170eSAndroid Build Coastguard Worker ), 725*7594170eSAndroid Build Coastguard Worker }, 726*7594170eSAndroid Build Coastguard Worker toolchains = ["@bazel_tools//tools/cpp:toolchain_type"], 727*7594170eSAndroid Build Coastguard Worker provides = [ 728*7594170eSAndroid Build Coastguard Worker CcInfo, 729*7594170eSAndroid Build Coastguard Worker CcAndroidMkInfo, 730*7594170eSAndroid Build Coastguard Worker cc_common.CcSharedLibraryHintInfo, 731*7594170eSAndroid Build Coastguard Worker ], 732*7594170eSAndroid Build Coastguard Worker fragments = ["cpp"], 733*7594170eSAndroid Build Coastguard Worker) 734*7594170eSAndroid Build Coastguard Worker 735*7594170eSAndroid Build Coastguard Workerdef _cc_includes_impl(ctx): 736*7594170eSAndroid Build Coastguard Worker check_absolute_include_dirs_disabled( 737*7594170eSAndroid Build Coastguard Worker ctx.label.package, 738*7594170eSAndroid Build Coastguard Worker ctx.attr.absolute_includes, 739*7594170eSAndroid Build Coastguard Worker ) 740*7594170eSAndroid Build Coastguard Worker 741*7594170eSAndroid Build Coastguard Worker return [ 742*7594170eSAndroid Build Coastguard Worker create_ccinfo_for_includes( 743*7594170eSAndroid Build Coastguard Worker ctx, 744*7594170eSAndroid Build Coastguard Worker includes = ctx.attr.includes, 745*7594170eSAndroid Build Coastguard Worker absolute_includes = ctx.attr.absolute_includes, 746*7594170eSAndroid Build Coastguard Worker system_includes = ctx.attr.system_includes, 747*7594170eSAndroid Build Coastguard Worker deps = ctx.attr.deps, 748*7594170eSAndroid Build Coastguard Worker ), 749*7594170eSAndroid Build Coastguard Worker cc_common.CcSharedLibraryHintInfo( 750*7594170eSAndroid Build Coastguard Worker # cc_shared_library shouldn't ever traverse into deps of includes 751*7594170eSAndroid Build Coastguard Worker attributes = [], 752*7594170eSAndroid Build Coastguard Worker ), 753*7594170eSAndroid Build Coastguard Worker ] 754*7594170eSAndroid Build Coastguard Worker 755*7594170eSAndroid Build Coastguard Worker# Bazel's native cc_library rule supports specifying include paths two ways: 756*7594170eSAndroid Build Coastguard Worker# 1. non-exported includes can be specified via copts attribute 757*7594170eSAndroid Build Coastguard Worker# 2. exported -isystem includes can be specified via includes attribute 758*7594170eSAndroid Build Coastguard Worker# 759*7594170eSAndroid Build Coastguard Worker# In order to guarantee a correct inclusion search order, we need to export 760*7594170eSAndroid Build Coastguard Worker# includes paths for both -I and -isystem; however, there is no native Bazel 761*7594170eSAndroid Build Coastguard Worker# support to export both of these, this rule provides a CcInfo to propagate the 762*7594170eSAndroid Build Coastguard Worker# given package-relative include/system include paths as exec root relative 763*7594170eSAndroid Build Coastguard Worker# include/system include paths. 764*7594170eSAndroid Build Coastguard Worker_cc_includes = rule( 765*7594170eSAndroid Build Coastguard Worker implementation = _cc_includes_impl, 766*7594170eSAndroid Build Coastguard Worker attrs = { 767*7594170eSAndroid Build Coastguard Worker "absolute_includes": attr.string_list(doc = "List of exec-root relative or absolute search paths for headers, usually passed with -I"), 768*7594170eSAndroid Build Coastguard Worker "includes": attr.string_list(doc = "Package-relative list of search paths for headers, usually passed with -I"), 769*7594170eSAndroid Build Coastguard Worker "system_includes": attr.string_list(doc = "Package-relative list of search paths for headers, usually passed with -isystem"), 770*7594170eSAndroid Build Coastguard Worker "deps": attr.label_list(doc = "Re-propagates the includes obtained from these dependencies.", providers = [CcInfo]), 771*7594170eSAndroid Build Coastguard Worker }, 772*7594170eSAndroid Build Coastguard Worker toolchains = ["@bazel_tools//tools/cpp:toolchain_type"], 773*7594170eSAndroid Build Coastguard Worker fragments = ["cpp"], 774*7594170eSAndroid Build Coastguard Worker provides = [CcInfo, cc_common.CcSharedLibraryHintInfo], 775*7594170eSAndroid Build Coastguard Worker) 776