xref: /aosp_15_r20/build/bazel/rules/cc/cc_library_static.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_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