xref: /aosp_15_r20/external/boringssl/src/util/util.bzl (revision 8fb009dc861624b67b6cdb62ea21f0f22d0c584b)
1*8fb009dcSAndroid Build Coastguard Worker# Copyright (c) 2024, Google Inc.
2*8fb009dcSAndroid Build Coastguard Worker#
3*8fb009dcSAndroid Build Coastguard Worker# Permission to use, copy, modify, and/or distribute this software for any
4*8fb009dcSAndroid Build Coastguard Worker# purpose with or without fee is hereby granted, provided that the above
5*8fb009dcSAndroid Build Coastguard Worker# copyright notice and this permission notice appear in all copies.
6*8fb009dcSAndroid Build Coastguard Worker#
7*8fb009dcSAndroid Build Coastguard Worker# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
8*8fb009dcSAndroid Build Coastguard Worker# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
9*8fb009dcSAndroid Build Coastguard Worker# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
10*8fb009dcSAndroid Build Coastguard Worker# SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
11*8fb009dcSAndroid Build Coastguard Worker# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
12*8fb009dcSAndroid Build Coastguard Worker# OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
13*8fb009dcSAndroid Build Coastguard Worker# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
14*8fb009dcSAndroid Build Coastguard Worker
15*8fb009dcSAndroid Build Coastguard Workerload("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library", "cc_test")
16*8fb009dcSAndroid Build Coastguard Worker
17*8fb009dcSAndroid Build Coastguard Worker# Configure C, C++, and common flags for GCC-compatible toolchains.
18*8fb009dcSAndroid Build Coastguard Worker#
19*8fb009dcSAndroid Build Coastguard Worker# TODO(davidben): Can we remove some of these? In Bazel, are warnings the
20*8fb009dcSAndroid Build Coastguard Worker# toolchain or project's responsibility? -fno-common did not become default
21*8fb009dcSAndroid Build Coastguard Worker# until https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85678.
22*8fb009dcSAndroid Build Coastguard Workergcc_copts = [
23*8fb009dcSAndroid Build Coastguard Worker    # This list of warnings should match those in the top-level CMakeLists.txt.
24*8fb009dcSAndroid Build Coastguard Worker    "-Wall",
25*8fb009dcSAndroid Build Coastguard Worker    "-Werror",
26*8fb009dcSAndroid Build Coastguard Worker    "-Wformat=2",
27*8fb009dcSAndroid Build Coastguard Worker    "-Wsign-compare",
28*8fb009dcSAndroid Build Coastguard Worker    "-Wmissing-field-initializers",
29*8fb009dcSAndroid Build Coastguard Worker    "-Wwrite-strings",
30*8fb009dcSAndroid Build Coastguard Worker    "-Wshadow",
31*8fb009dcSAndroid Build Coastguard Worker    "-fno-common",
32*8fb009dcSAndroid Build Coastguard Worker]
33*8fb009dcSAndroid Build Coastguard Worker
34*8fb009dcSAndroid Build Coastguard Workergcc_copts_cxx = [
35*8fb009dcSAndroid Build Coastguard Worker    "-Wmissing-declarations",
36*8fb009dcSAndroid Build Coastguard Worker]
37*8fb009dcSAndroid Build Coastguard Worker
38*8fb009dcSAndroid Build Coastguard Workergcc_copts_c = [
39*8fb009dcSAndroid Build Coastguard Worker    "-Wmissing-prototypes",
40*8fb009dcSAndroid Build Coastguard Worker    "-Wold-style-definition",
41*8fb009dcSAndroid Build Coastguard Worker    "-Wstrict-prototypes",
42*8fb009dcSAndroid Build Coastguard Worker]
43*8fb009dcSAndroid Build Coastguard Worker
44*8fb009dcSAndroid Build Coastguard Workerboringssl_copts_common = select({
45*8fb009dcSAndroid Build Coastguard Worker    # This condition and the asm_srcs_used one below must be kept in sync.
46*8fb009dcSAndroid Build Coastguard Worker    "@platforms//os:windows": ["-DOPENSSL_NO_ASM"],
47*8fb009dcSAndroid Build Coastguard Worker    "//conditions:default": [],
48*8fb009dcSAndroid Build Coastguard Worker}) + select({
49*8fb009dcSAndroid Build Coastguard Worker    # We assume that non-Windows builds use a GCC-compatible toolchain and that
50*8fb009dcSAndroid Build Coastguard Worker    # Windows builds do not.
51*8fb009dcSAndroid Build Coastguard Worker    #
52*8fb009dcSAndroid Build Coastguard Worker    # TODO(davidben): Should these be querying something in @bazel_tools?
53*8fb009dcSAndroid Build Coastguard Worker    # Unfortunately, @bazel_tools is undocumented. See
54*8fb009dcSAndroid Build Coastguard Worker    # https://github.com/bazelbuild/bazel/issues/14914
55*8fb009dcSAndroid Build Coastguard Worker    "@platforms//os:windows": [],
56*8fb009dcSAndroid Build Coastguard Worker    "//conditions:default": gcc_copts,
57*8fb009dcSAndroid Build Coastguard Worker}) + select({
58*8fb009dcSAndroid Build Coastguard Worker    # This is needed on glibc systems to get rwlock in pthreads, but it should
59*8fb009dcSAndroid Build Coastguard Worker    # not be set on Apple platforms or FreeBSD, where it instead disables APIs
60*8fb009dcSAndroid Build Coastguard Worker    # we use.
61*8fb009dcSAndroid Build Coastguard Worker    # See compat(5), sys/cdefs.h, and https://crbug.com/boringssl/471
62*8fb009dcSAndroid Build Coastguard Worker    "@platforms//os:linux": ["-D_XOPEN_SOURCE=700"],
63*8fb009dcSAndroid Build Coastguard Worker    # Without WIN32_LEAN_AND_MEAN, <windows.h> pulls in wincrypt.h, which
64*8fb009dcSAndroid Build Coastguard Worker    # conflicts with our <openssl/x509.h>.
65*8fb009dcSAndroid Build Coastguard Worker    "@platforms//os:windows": ["-DWIN32_LEAN_AND_MEAN", "-utf-8"],
66*8fb009dcSAndroid Build Coastguard Worker    "//conditions:default": [],
67*8fb009dcSAndroid Build Coastguard Worker})
68*8fb009dcSAndroid Build Coastguard Worker
69*8fb009dcSAndroid Build Coastguard Worker# We do not specify the C++ version here because Bazel expects C++ version
70*8fb009dcSAndroid Build Coastguard Worker# to come from the top-level toolchain. The concern is that different C++
71*8fb009dcSAndroid Build Coastguard Worker# versions may cause ABIs, notably Abseil's, to change.
72*8fb009dcSAndroid Build Coastguard Workerboringssl_copts_cxx = boringssl_copts_common + select({
73*8fb009dcSAndroid Build Coastguard Worker    "@platforms//os:windows": [],
74*8fb009dcSAndroid Build Coastguard Worker    "//conditions:default": gcc_copts_cxx,
75*8fb009dcSAndroid Build Coastguard Worker})
76*8fb009dcSAndroid Build Coastguard Worker
77*8fb009dcSAndroid Build Coastguard Worker# We specify the C version because Bazel projects often do not remember to
78*8fb009dcSAndroid Build Coastguard Worker# specify the C version. We do not expect ABIs to vary by C versions, at least
79*8fb009dcSAndroid Build Coastguard Worker# for our code or the headers we include, so configure the C version inside the
80*8fb009dcSAndroid Build Coastguard Worker# library. If Bazel's C/C++ version handling improves, we may reconsider this.
81*8fb009dcSAndroid Build Coastguard Workerboringssl_copts_c = boringssl_copts_common + select({
82*8fb009dcSAndroid Build Coastguard Worker    "@platforms//os:windows": ["/std:c11"],
83*8fb009dcSAndroid Build Coastguard Worker    "//conditions:default": ["-std=c11"] + gcc_copts_c,
84*8fb009dcSAndroid Build Coastguard Worker})
85*8fb009dcSAndroid Build Coastguard Worker
86*8fb009dcSAndroid Build Coastguard Workerdef handle_mixed_c_cxx(
87*8fb009dcSAndroid Build Coastguard Worker        name,
88*8fb009dcSAndroid Build Coastguard Worker        copts,
89*8fb009dcSAndroid Build Coastguard Worker        deps,
90*8fb009dcSAndroid Build Coastguard Worker        internal_hdrs,
91*8fb009dcSAndroid Build Coastguard Worker        includes,
92*8fb009dcSAndroid Build Coastguard Worker        linkopts,
93*8fb009dcSAndroid Build Coastguard Worker        srcs,
94*8fb009dcSAndroid Build Coastguard Worker        testonly):
95*8fb009dcSAndroid Build Coastguard Worker    """
96*8fb009dcSAndroid Build Coastguard Worker    Works around https://github.com/bazelbuild/bazel/issues/22041. Determines
97*8fb009dcSAndroid Build Coastguard Worker    whether a target contains C, C++, or both. If the target is multi-language,
98*8fb009dcSAndroid Build Coastguard Worker    the C sources are split into a separate library. Returns a tuple of updated
99*8fb009dcSAndroid Build Coastguard Worker    (copts, deps, srcs) to apply.
100*8fb009dcSAndroid Build Coastguard Worker    """
101*8fb009dcSAndroid Build Coastguard Worker    has_c, has_cxx = False, False
102*8fb009dcSAndroid Build Coastguard Worker    for src in srcs:
103*8fb009dcSAndroid Build Coastguard Worker        if src.endswith(".c"):
104*8fb009dcSAndroid Build Coastguard Worker            has_c = True
105*8fb009dcSAndroid Build Coastguard Worker        elif src.endswith(".cc"):
106*8fb009dcSAndroid Build Coastguard Worker            has_cxx = True
107*8fb009dcSAndroid Build Coastguard Worker
108*8fb009dcSAndroid Build Coastguard Worker    # If a target has both C and C++, we need to split it in two.
109*8fb009dcSAndroid Build Coastguard Worker    if has_c and has_cxx:
110*8fb009dcSAndroid Build Coastguard Worker        srcs_c = [src for src in srcs if src.endswith(".c") or src.endswith(".h")]
111*8fb009dcSAndroid Build Coastguard Worker        name_c = name + "_c"
112*8fb009dcSAndroid Build Coastguard Worker        cc_library(
113*8fb009dcSAndroid Build Coastguard Worker            name = name_c,
114*8fb009dcSAndroid Build Coastguard Worker            srcs = srcs_c + internal_hdrs,
115*8fb009dcSAndroid Build Coastguard Worker            copts = copts + boringssl_copts_c,
116*8fb009dcSAndroid Build Coastguard Worker            includes = includes,
117*8fb009dcSAndroid Build Coastguard Worker            # This target only exists to be linked into the main library, so
118*8fb009dcSAndroid Build Coastguard Worker            # always link it statically.
119*8fb009dcSAndroid Build Coastguard Worker            linkstatic = True,
120*8fb009dcSAndroid Build Coastguard Worker            linkopts = linkopts,
121*8fb009dcSAndroid Build Coastguard Worker            deps = deps,
122*8fb009dcSAndroid Build Coastguard Worker            testonly = testonly,
123*8fb009dcSAndroid Build Coastguard Worker        )
124*8fb009dcSAndroid Build Coastguard Worker
125*8fb009dcSAndroid Build Coastguard Worker        # Build the remainder as a C++-only target.
126*8fb009dcSAndroid Build Coastguard Worker        deps += [":" + name_c]
127*8fb009dcSAndroid Build Coastguard Worker        srcs = [src for src in srcs if not src.endswith(".c")]
128*8fb009dcSAndroid Build Coastguard Worker        has_c = False
129*8fb009dcSAndroid Build Coastguard Worker
130*8fb009dcSAndroid Build Coastguard Worker    if has_c:
131*8fb009dcSAndroid Build Coastguard Worker        copts += boringssl_copts_c
132*8fb009dcSAndroid Build Coastguard Worker    else:
133*8fb009dcSAndroid Build Coastguard Worker        copts += boringssl_copts_cxx
134*8fb009dcSAndroid Build Coastguard Worker
135*8fb009dcSAndroid Build Coastguard Worker    return copts, deps, srcs
136*8fb009dcSAndroid Build Coastguard Worker
137*8fb009dcSAndroid Build Coastguard Workerdef handle_asm_srcs(asm_srcs):
138*8fb009dcSAndroid Build Coastguard Worker    if not asm_srcs:
139*8fb009dcSAndroid Build Coastguard Worker        return []
140*8fb009dcSAndroid Build Coastguard Worker
141*8fb009dcSAndroid Build Coastguard Worker    # By default, the C files will expect assembly files, if any, to be linked
142*8fb009dcSAndroid Build Coastguard Worker    # in with the build. This default can be flipped with -DOPENSSL_NO_ASM. If
143*8fb009dcSAndroid Build Coastguard Worker    # building in a configuration where we have no assembly optimizations,
144*8fb009dcSAndroid Build Coastguard Worker    # -DOPENSSL_NO_ASM has no effect, and either value is fine.
145*8fb009dcSAndroid Build Coastguard Worker    #
146*8fb009dcSAndroid Build Coastguard Worker    # Like C files, assembly files are wrapped in #ifdef (or NASM equivalent),
147*8fb009dcSAndroid Build Coastguard Worker    # so it is safe to include a file for the wrong platform in the build. It
148*8fb009dcSAndroid Build Coastguard Worker    # will just output an empty object file. However, we need some platform
149*8fb009dcSAndroid Build Coastguard Worker    # selectors to distinguish between gas or NASM syntax.
150*8fb009dcSAndroid Build Coastguard Worker    #
151*8fb009dcSAndroid Build Coastguard Worker    # For all non-Windows platforms, we use gas assembly syntax and can assume
152*8fb009dcSAndroid Build Coastguard Worker    # any GCC-compatible toolchain includes a gas-compatible assembler.
153*8fb009dcSAndroid Build Coastguard Worker    #
154*8fb009dcSAndroid Build Coastguard Worker    # For Windows, we use NASM on x86 and x86_64 and gas, specifically
155*8fb009dcSAndroid Build Coastguard Worker    # clang-assembler, on aarch64. We have not yet added NASM support to this
156*8fb009dcSAndroid Build Coastguard Worker    # build, and would need to detect MSVC vs clang-cl for aarch64 so, for now,
157*8fb009dcSAndroid Build Coastguard Worker    # we just disable assembly on Windows across the board.
158*8fb009dcSAndroid Build Coastguard Worker    #
159*8fb009dcSAndroid Build Coastguard Worker    # This select and the corresponding one in boringssl_copts_common must be
160*8fb009dcSAndroid Build Coastguard Worker    # kept in sync.
161*8fb009dcSAndroid Build Coastguard Worker    #
162*8fb009dcSAndroid Build Coastguard Worker    # TODO(https://crbug.com/boringssl/531): Enable assembly for Windows.
163*8fb009dcSAndroid Build Coastguard Worker    return select({
164*8fb009dcSAndroid Build Coastguard Worker        "@platforms//os:windows": [],
165*8fb009dcSAndroid Build Coastguard Worker        "//conditions:default": asm_srcs,
166*8fb009dcSAndroid Build Coastguard Worker    })
167*8fb009dcSAndroid Build Coastguard Worker
168*8fb009dcSAndroid Build Coastguard Workerdef linkstatic_kwargs(linkstatic):
169*8fb009dcSAndroid Build Coastguard Worker    # Although Bazel's documentation says linkstatic defaults to True or False
170*8fb009dcSAndroid Build Coastguard Worker    # for the various target types, this is not true. The defaults differ by
171*8fb009dcSAndroid Build Coastguard Worker    # platform non-Windows and True on Windows. There is now way to request the
172*8fb009dcSAndroid Build Coastguard Worker    # default except to omit the parameter, so we must use kwargs.
173*8fb009dcSAndroid Build Coastguard Worker    kwargs = {}
174*8fb009dcSAndroid Build Coastguard Worker    if linkstatic != None:
175*8fb009dcSAndroid Build Coastguard Worker        kwargs["linkstatic"] = linkstatic
176*8fb009dcSAndroid Build Coastguard Worker    return kwargs
177*8fb009dcSAndroid Build Coastguard Worker
178*8fb009dcSAndroid Build Coastguard Workerdef bssl_cc_library(
179*8fb009dcSAndroid Build Coastguard Worker        name,
180*8fb009dcSAndroid Build Coastguard Worker        asm_srcs = [],
181*8fb009dcSAndroid Build Coastguard Worker        copts = [],
182*8fb009dcSAndroid Build Coastguard Worker        deps = [],
183*8fb009dcSAndroid Build Coastguard Worker        hdrs = [],
184*8fb009dcSAndroid Build Coastguard Worker        includes = [],
185*8fb009dcSAndroid Build Coastguard Worker        internal_hdrs = [],
186*8fb009dcSAndroid Build Coastguard Worker        linkopts = [],
187*8fb009dcSAndroid Build Coastguard Worker        linkstatic = None,
188*8fb009dcSAndroid Build Coastguard Worker        srcs = [],
189*8fb009dcSAndroid Build Coastguard Worker        testonly = False,
190*8fb009dcSAndroid Build Coastguard Worker        visibility = []):
191*8fb009dcSAndroid Build Coastguard Worker    copts, deps, srcs = handle_mixed_c_cxx(
192*8fb009dcSAndroid Build Coastguard Worker        name = name,
193*8fb009dcSAndroid Build Coastguard Worker        copts = copts,
194*8fb009dcSAndroid Build Coastguard Worker        deps = deps,
195*8fb009dcSAndroid Build Coastguard Worker        internal_hdrs = hdrs + internal_hdrs,
196*8fb009dcSAndroid Build Coastguard Worker        includes = includes,
197*8fb009dcSAndroid Build Coastguard Worker        linkopts = linkopts,
198*8fb009dcSAndroid Build Coastguard Worker        srcs = srcs,
199*8fb009dcSAndroid Build Coastguard Worker        testonly = testonly,
200*8fb009dcSAndroid Build Coastguard Worker    )
201*8fb009dcSAndroid Build Coastguard Worker
202*8fb009dcSAndroid Build Coastguard Worker    # BoringSSL's notion of internal headers are slightly different from
203*8fb009dcSAndroid Build Coastguard Worker    # Bazel's. libcrypto's internal headers may be used by libssl, but they
204*8fb009dcSAndroid Build Coastguard Worker    # cannot be used outside the library. To express this, we make separate
205*8fb009dcSAndroid Build Coastguard Worker    # internal and external targets. This impact's Bazel's layering check.
206*8fb009dcSAndroid Build Coastguard Worker    name_internal = name
207*8fb009dcSAndroid Build Coastguard Worker    if visibility:
208*8fb009dcSAndroid Build Coastguard Worker        name_internal = name + "_internal"
209*8fb009dcSAndroid Build Coastguard Worker
210*8fb009dcSAndroid Build Coastguard Worker    cc_library(
211*8fb009dcSAndroid Build Coastguard Worker        name = name_internal,
212*8fb009dcSAndroid Build Coastguard Worker        srcs = srcs + handle_asm_srcs(asm_srcs),
213*8fb009dcSAndroid Build Coastguard Worker        hdrs = hdrs + internal_hdrs,
214*8fb009dcSAndroid Build Coastguard Worker        copts = copts,
215*8fb009dcSAndroid Build Coastguard Worker        includes = includes,
216*8fb009dcSAndroid Build Coastguard Worker        linkopts = linkopts,
217*8fb009dcSAndroid Build Coastguard Worker        deps = deps,
218*8fb009dcSAndroid Build Coastguard Worker        testonly = testonly,
219*8fb009dcSAndroid Build Coastguard Worker        **linkstatic_kwargs(linkstatic)
220*8fb009dcSAndroid Build Coastguard Worker    )
221*8fb009dcSAndroid Build Coastguard Worker
222*8fb009dcSAndroid Build Coastguard Worker    if visibility:
223*8fb009dcSAndroid Build Coastguard Worker        cc_library(
224*8fb009dcSAndroid Build Coastguard Worker            name = name,
225*8fb009dcSAndroid Build Coastguard Worker            hdrs = hdrs,
226*8fb009dcSAndroid Build Coastguard Worker            deps = [":" + name_internal],
227*8fb009dcSAndroid Build Coastguard Worker            visibility = visibility,
228*8fb009dcSAndroid Build Coastguard Worker        )
229*8fb009dcSAndroid Build Coastguard Worker
230*8fb009dcSAndroid Build Coastguard Workerdef bssl_cc_binary(
231*8fb009dcSAndroid Build Coastguard Worker        name,
232*8fb009dcSAndroid Build Coastguard Worker        srcs = [],
233*8fb009dcSAndroid Build Coastguard Worker        asm_srcs = [],
234*8fb009dcSAndroid Build Coastguard Worker        copts = [],
235*8fb009dcSAndroid Build Coastguard Worker        includes = [],
236*8fb009dcSAndroid Build Coastguard Worker        linkstatic = None,
237*8fb009dcSAndroid Build Coastguard Worker        linkopts = [],
238*8fb009dcSAndroid Build Coastguard Worker        deps = [],
239*8fb009dcSAndroid Build Coastguard Worker        testonly = False,
240*8fb009dcSAndroid Build Coastguard Worker        visibility = []):
241*8fb009dcSAndroid Build Coastguard Worker    copts, deps, srcs = handle_mixed_c_cxx(
242*8fb009dcSAndroid Build Coastguard Worker        name = name,
243*8fb009dcSAndroid Build Coastguard Worker        copts = copts,
244*8fb009dcSAndroid Build Coastguard Worker        deps = deps,
245*8fb009dcSAndroid Build Coastguard Worker        internal_hdrs = [],
246*8fb009dcSAndroid Build Coastguard Worker        includes = includes,
247*8fb009dcSAndroid Build Coastguard Worker        linkopts = linkopts,
248*8fb009dcSAndroid Build Coastguard Worker        srcs = srcs,
249*8fb009dcSAndroid Build Coastguard Worker        testonly = testonly,
250*8fb009dcSAndroid Build Coastguard Worker    )
251*8fb009dcSAndroid Build Coastguard Worker
252*8fb009dcSAndroid Build Coastguard Worker    cc_binary(
253*8fb009dcSAndroid Build Coastguard Worker        name = name,
254*8fb009dcSAndroid Build Coastguard Worker        srcs = srcs + handle_asm_srcs(asm_srcs),
255*8fb009dcSAndroid Build Coastguard Worker        copts = copts,
256*8fb009dcSAndroid Build Coastguard Worker        includes = includes,
257*8fb009dcSAndroid Build Coastguard Worker        linkopts = linkopts,
258*8fb009dcSAndroid Build Coastguard Worker        deps = deps,
259*8fb009dcSAndroid Build Coastguard Worker        testonly = testonly,
260*8fb009dcSAndroid Build Coastguard Worker        visibility = visibility,
261*8fb009dcSAndroid Build Coastguard Worker        **linkstatic_kwargs(linkstatic)
262*8fb009dcSAndroid Build Coastguard Worker    )
263*8fb009dcSAndroid Build Coastguard Worker
264*8fb009dcSAndroid Build Coastguard Workerdef bssl_cc_test(
265*8fb009dcSAndroid Build Coastguard Worker        name,
266*8fb009dcSAndroid Build Coastguard Worker        srcs = [],
267*8fb009dcSAndroid Build Coastguard Worker        asm_srcs = [],
268*8fb009dcSAndroid Build Coastguard Worker        data = [],
269*8fb009dcSAndroid Build Coastguard Worker        size = "medium",
270*8fb009dcSAndroid Build Coastguard Worker        internal_hdrs = [],
271*8fb009dcSAndroid Build Coastguard Worker        copts = [],
272*8fb009dcSAndroid Build Coastguard Worker        includes = [],
273*8fb009dcSAndroid Build Coastguard Worker        linkopts = [],
274*8fb009dcSAndroid Build Coastguard Worker        linkstatic = None,
275*8fb009dcSAndroid Build Coastguard Worker        deps = [],
276*8fb009dcSAndroid Build Coastguard Worker        shard_count = None):
277*8fb009dcSAndroid Build Coastguard Worker    copts, deps, srcs = handle_mixed_c_cxx(
278*8fb009dcSAndroid Build Coastguard Worker        name = name,
279*8fb009dcSAndroid Build Coastguard Worker        copts = copts,
280*8fb009dcSAndroid Build Coastguard Worker        deps = deps,
281*8fb009dcSAndroid Build Coastguard Worker        internal_hdrs = [],
282*8fb009dcSAndroid Build Coastguard Worker        includes = includes,
283*8fb009dcSAndroid Build Coastguard Worker        linkopts = linkopts,
284*8fb009dcSAndroid Build Coastguard Worker        srcs = srcs,
285*8fb009dcSAndroid Build Coastguard Worker        testonly = True,
286*8fb009dcSAndroid Build Coastguard Worker    )
287*8fb009dcSAndroid Build Coastguard Worker
288*8fb009dcSAndroid Build Coastguard Worker    cc_test(
289*8fb009dcSAndroid Build Coastguard Worker        name = name,
290*8fb009dcSAndroid Build Coastguard Worker        data = data,
291*8fb009dcSAndroid Build Coastguard Worker        deps = deps,
292*8fb009dcSAndroid Build Coastguard Worker        srcs = srcs + handle_asm_srcs(asm_srcs),
293*8fb009dcSAndroid Build Coastguard Worker        copts = copts,
294*8fb009dcSAndroid Build Coastguard Worker        includes = includes,
295*8fb009dcSAndroid Build Coastguard Worker        linkopts = linkopts,
296*8fb009dcSAndroid Build Coastguard Worker        shard_count = shard_count,
297*8fb009dcSAndroid Build Coastguard Worker        size = size,
298*8fb009dcSAndroid Build Coastguard Worker        **linkstatic_kwargs(linkstatic)
299*8fb009dcSAndroid Build Coastguard Worker    )
300