xref: /aosp_15_r20/build/bazel/rules/cc/cc_library_shared.bzl (revision 7594170e27e0732bc44b93d1440d87a54b6ffe7c)
1*7594170eSAndroid Build Coastguard Worker# Copyright (C) 2021 The Android Open Source Project
2*7594170eSAndroid Build Coastguard Worker#
3*7594170eSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
4*7594170eSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
5*7594170eSAndroid Build Coastguard Worker# You may obtain a copy of the License at
6*7594170eSAndroid Build Coastguard Worker#
7*7594170eSAndroid Build Coastguard Worker#     http://www.apache.org/licenses/LICENSE-2.0
8*7594170eSAndroid Build Coastguard Worker#
9*7594170eSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
10*7594170eSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
11*7594170eSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*7594170eSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
13*7594170eSAndroid Build Coastguard Worker# limitations under the License.
14*7594170eSAndroid Build Coastguard Worker
15*7594170eSAndroid Build Coastguard Workerload("@bazel_skylib//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