• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Copyright (C) 2022 The Android Open Source Project
2#
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7#     http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
14
15load("@bazel_skylib//lib:new_sets.bzl", "sets")
16load("@bazel_skylib//lib:unittest.bzl", "analysistest", "asserts")
17load(":stl.bzl", "stl_info_from_attr")
18
19_ANDROID_STATIC_DEPS = ["//external/libcxxabi:libc++demangle"]
20_STATIC_DEP = ["//external/libcxx:libc++_static"]
21_ANDROID_BINARY_STATIC_DEP = ["//prebuilts/clang/host/linux-x86:libunwind"]
22_SHARED_DEP = ["//external/libcxx:libc++"]
23
24_ANDROID_CPPFLAGS = []
25_ANDROID_LINKOPTS = []
26_LINUX_CPPFLAGS = ["-nostdinc++"]
27_LINUX_LINKOPTS = ["-nostdlib++"]
28_LINUX_BIONIC_CPPFLAGS = []
29_LINUX_BIONIC_LINKOPTS = []
30_DARWIN_CPPFLAGS = [
31    "-nostdinc++",
32    "-D_LIBCPP_DISABLE_AVAILABILITY",
33]
34_DARWIN_CPPFLAGS_STL_NONE = ["-nostdinc++"]
35_DARWIN_LINKOPTS = ["-nostdlib++"]
36_WINDOWS_CPPFLAGS = [
37    "-nostdinc++",
38    "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
39    "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
40    "-D_LIBCPP_HAS_THREAD_API_WIN32",
41]
42_WINDOWS_CPPFLAGS_STL_NONE = ["-nostdinc++"]
43_WINDOWS_LINKOPTS = ["-nostdlib++"]
44
45_StlInfo = provider(fields = ["static", "shared"])
46
47def _stl_impl(ctx):
48    return [
49        _StlInfo(
50            static = ctx.attr.static,
51            shared = ctx.attr.shared,
52        ),
53    ]
54
55_stl = rule(
56    implementation = _stl_impl,
57    attrs = {
58        "shared": attr.string_list(),
59        "static": attr.string_list(),
60    },
61)
62
63_StlFlagsInfo = provider(fields = ["cppflags", "linkopts"])
64
65def _stl_flags_impl(ctx):
66    return [
67        _StlFlagsInfo(
68            cppflags = ctx.attr.cppflags,
69            linkopts = ctx.attr.linkopts,
70        ),
71    ]
72
73_stl_flags = rule(
74    implementation = _stl_flags_impl,
75    attrs = {
76        "cppflags": attr.string_list(),
77        "linkopts": attr.string_list(),
78    },
79)
80
81def _test_stl(
82        stl,
83        is_shared,
84        is_binary,
85        android_deps,
86        non_android_deps,
87        android_flags,
88        linux_flags,
89        linux_bionic_flags,
90        darwin_flags,
91        windows_flags):
92    target_name = _stl_deps_target(stl, is_shared, is_binary)
93    flags_target_name = _stl_flags_target(stl, is_shared, is_binary)
94    android_test_name = target_name + "_android_test"
95    non_android_test_name = target_name + "_non_android_test"
96    android_flags_test_name = target_name + "_android_flags_test"
97    linux_flags_test_name = target_name + "_linux_flags_test"
98    linux_bionic_flags_test_name = target_name + "_linux_bionic_flags_test"
99    darwin_flags_test_name = target_name + "_darwin_flags_test"
100    windows_flags_test_name = target_name + "_windows_flags_test"
101
102    _stl_deps_android_test(
103        name = android_test_name,
104        static = android_deps.static,
105        shared = android_deps.shared,
106        target_under_test = target_name,
107    )
108
109    _stl_deps_non_android_test(
110        name = non_android_test_name,
111        static = non_android_deps.static,
112        shared = non_android_deps.shared,
113        target_under_test = target_name,
114    )
115
116    _stl_flags_android_test(
117        name = android_flags_test_name,
118        cppflags = android_flags.cppflags,
119        linkopts = android_flags.linkopts,
120        target_under_test = flags_target_name,
121    )
122
123    _stl_flags_linux_test(
124        name = linux_flags_test_name,
125        cppflags = linux_flags.cppflags,
126        linkopts = linux_flags.linkopts,
127        target_under_test = flags_target_name,
128    )
129
130    _stl_flags_linux_bionic_test(
131        name = linux_bionic_flags_test_name,
132        cppflags = linux_bionic_flags.cppflags,
133        linkopts = linux_bionic_flags.linkopts,
134        target_under_test = flags_target_name,
135    )
136
137    _stl_flags_darwin_test(
138        name = darwin_flags_test_name,
139        cppflags = darwin_flags.cppflags,
140        linkopts = darwin_flags.linkopts,
141        target_under_test = flags_target_name,
142    )
143
144    _stl_flags_windows_test(
145        name = windows_flags_test_name,
146        cppflags = windows_flags.cppflags,
147        linkopts = windows_flags.linkopts,
148        target_under_test = flags_target_name,
149    )
150
151    return [
152        android_test_name,
153        non_android_test_name,
154        android_flags_test_name,
155        linux_flags_test_name,
156        linux_bionic_flags_test_name,
157        darwin_flags_test_name,
158        windows_flags_test_name,
159    ]
160
161def _stl_deps_target(name, is_shared, is_binary):
162    target_name = name if name else "empty"
163    target_name += "_shared" if is_shared else "_static"
164    target_name += "_bin" if is_binary else "_lib"
165    info = stl_info_from_attr(name, is_shared, is_binary)
166
167    _stl(
168        name = target_name,
169        shared = info.shared_deps,
170        static = info.static_deps,
171        tags = ["manual"],
172    )
173
174    return target_name
175
176def _stl_deps_test_impl(ctx):
177    env = analysistest.begin(ctx)
178
179    stl_info = analysistest.target_under_test(env)[_StlInfo]
180
181    expected_static = sets.make(ctx.attr.static)
182    actual_static = sets.make(stl_info.static)
183    asserts.set_equals(
184        env,
185        expected = expected_static,
186        actual = actual_static,
187    )
188
189    expected_shared = sets.make(ctx.attr.shared)
190    actual_shared = sets.make(stl_info.shared)
191    asserts.set_equals(
192        env,
193        expected = expected_shared,
194        actual = actual_shared,
195    )
196
197    return analysistest.end(env)
198
199def _stl_flags_target(name, is_shared, is_binary):
200    target_name = name if name else "empty"
201    target_name += "_shared" if is_shared else "_static"
202    target_name += "_bin" if is_binary else "_lib"
203    target_name += "_flags"
204    info = stl_info_from_attr(name, is_shared)
205
206    _stl_flags(
207        name = target_name,
208        cppflags = info.cppflags,
209        linkopts = info.linkopts,
210        tags = ["manual"],
211    )
212
213    return target_name
214
215def _stl_flags_test_impl(ctx):
216    env = analysistest.begin(ctx)
217
218    stl_info = analysistest.target_under_test(env)[_StlFlagsInfo]
219
220    expected_cppflags = sets.make(ctx.attr.cppflags)
221    actual_cppflags = sets.make(stl_info.cppflags)
222    asserts.set_equals(
223        env,
224        expected = expected_cppflags,
225        actual = actual_cppflags,
226    )
227
228    expected_linkopts = sets.make(ctx.attr.linkopts)
229    actual_linkopts = sets.make(stl_info.linkopts)
230    asserts.set_equals(
231        env,
232        expected = expected_linkopts,
233        actual = actual_linkopts,
234    )
235
236    return analysistest.end(env)
237
238__stl_flags_android_test = analysistest.make(
239    impl = _stl_flags_test_impl,
240    attrs = {
241        "cppflags": attr.string_list(),
242        "linkopts": attr.string_list(),
243    },
244)
245
246def _stl_flags_android_test(**kwargs):
247    __stl_flags_android_test(
248        target_compatible_with = ["//build/bazel/platforms/os:android"],
249        **kwargs
250    )
251
252__stl_flags_linux_test = analysistest.make(
253    impl = _stl_flags_test_impl,
254    attrs = {
255        "cppflags": attr.string_list(),
256        "linkopts": attr.string_list(),
257    },
258)
259
260def _stl_flags_linux_test(**kwargs):
261    __stl_flags_linux_test(
262        target_compatible_with = ["//build/bazel/platforms/os:linux"],
263        **kwargs
264    )
265
266__stl_flags_linux_bionic_test = analysistest.make(
267    impl = _stl_flags_test_impl,
268    attrs = {
269        "cppflags": attr.string_list(),
270        "linkopts": attr.string_list(),
271    },
272)
273
274def _stl_flags_linux_bionic_test(**kwargs):
275    __stl_flags_linux_bionic_test(
276        target_compatible_with = ["//build/bazel/platforms/os:linux_bionic"],
277        **kwargs
278    )
279
280_stl_flags_windows_test = analysistest.make(
281    impl = _stl_flags_test_impl,
282    attrs = {
283        "cppflags": attr.string_list(),
284        "linkopts": attr.string_list(),
285    },
286    config_settings = {
287        "//command_line_option:platforms": "@//build/bazel/rules/cc:windows_for_testing",
288    },
289)
290
291_stl_flags_darwin_test = analysistest.make(
292    impl = _stl_flags_test_impl,
293    attrs = {
294        "cppflags": attr.string_list(),
295        "linkopts": attr.string_list(),
296    },
297    config_settings = {
298        "//command_line_option:platforms": "@//build/bazel/rules/cc:darwin_for_testing",
299    },
300)
301
302__stl_deps_android_test = analysistest.make(
303    impl = _stl_deps_test_impl,
304    attrs = {
305        "static": attr.string_list(),
306        "shared": attr.string_list(),
307    },
308)
309
310def _stl_deps_android_test(**kwargs):
311    __stl_deps_android_test(
312        target_compatible_with = ["//build/bazel/platforms/os:android"],
313        **kwargs
314    )
315
316__stl_deps_non_android_test = analysistest.make(
317    impl = _stl_deps_test_impl,
318    attrs = {
319        "static": attr.string_list(),
320        "shared": attr.string_list(),
321    },
322)
323
324def _stl_deps_non_android_test(**kwargs):
325    __stl_deps_non_android_test(
326        target_compatible_with = ["//build/bazel/platforms/os:linux"],
327        **kwargs
328    )
329
330def stl_test_suite(name):
331    native.test_suite(
332        name = name,
333        tests =
334            _test_stl(
335                stl = "",
336                is_shared = True,
337                is_binary = False,
338                android_deps = struct(
339                    static = _ANDROID_STATIC_DEPS,
340                    shared = _SHARED_DEP,
341                ),
342                non_android_deps = struct(
343                    static = None,
344                    shared = _SHARED_DEP,
345                ),
346                android_flags = struct(
347                    cppflags = _ANDROID_CPPFLAGS,
348                    linkopts = _ANDROID_LINKOPTS,
349                ),
350                linux_flags = struct(
351                    cppflags = _LINUX_CPPFLAGS,
352                    linkopts = _LINUX_LINKOPTS,
353                ),
354                linux_bionic_flags = struct(
355                    cppflags = _LINUX_BIONIC_CPPFLAGS,
356                    linkopts = _LINUX_BIONIC_LINKOPTS,
357                ),
358                darwin_flags = struct(
359                    cppflags = _DARWIN_CPPFLAGS,
360                    linkopts = _DARWIN_LINKOPTS,
361                ),
362                windows_flags = struct(
363                    cppflags = _WINDOWS_CPPFLAGS,
364                    linkopts = _WINDOWS_LINKOPTS,
365                ),
366            ) +
367            _test_stl(
368                stl = "system",
369                is_shared = True,
370                is_binary = False,
371                android_deps = struct(
372                    static = _ANDROID_STATIC_DEPS,
373                    shared = _SHARED_DEP,
374                ),
375                non_android_deps = struct(
376                    static = None,
377                    shared = _SHARED_DEP,
378                ),
379                android_flags = struct(
380                    cppflags = _ANDROID_CPPFLAGS,
381                    linkopts = _ANDROID_LINKOPTS,
382                ),
383                linux_flags = struct(
384                    cppflags = _LINUX_CPPFLAGS,
385                    linkopts = _LINUX_LINKOPTS,
386                ),
387                linux_bionic_flags = struct(
388                    cppflags = _LINUX_BIONIC_CPPFLAGS,
389                    linkopts = _LINUX_BIONIC_LINKOPTS,
390                ),
391                darwin_flags = struct(
392                    cppflags = _DARWIN_CPPFLAGS,
393                    linkopts = _DARWIN_LINKOPTS,
394                ),
395                windows_flags = struct(
396                    cppflags = _WINDOWS_CPPFLAGS,
397                    linkopts = _WINDOWS_LINKOPTS,
398                ),
399            ) +
400            _test_stl(
401                stl = "libc++",
402                is_shared = True,
403                is_binary = False,
404                android_deps = struct(
405                    static = _ANDROID_STATIC_DEPS,
406                    shared = _SHARED_DEP,
407                ),
408                non_android_deps = struct(
409                    static = None,
410                    shared = _SHARED_DEP,
411                ),
412                android_flags = struct(
413                    cppflags = _ANDROID_CPPFLAGS,
414                    linkopts = _ANDROID_LINKOPTS,
415                ),
416                linux_flags = struct(
417                    cppflags = _LINUX_CPPFLAGS,
418                    linkopts = _LINUX_LINKOPTS,
419                ),
420                linux_bionic_flags = struct(
421                    cppflags = _LINUX_BIONIC_CPPFLAGS,
422                    linkopts = _LINUX_BIONIC_LINKOPTS,
423                ),
424                darwin_flags = struct(
425                    cppflags = _DARWIN_CPPFLAGS,
426                    linkopts = _DARWIN_LINKOPTS,
427                ),
428                windows_flags = struct(
429                    cppflags = _WINDOWS_CPPFLAGS,
430                    linkopts = _WINDOWS_LINKOPTS,
431                ),
432            ) +
433            _test_stl(
434                stl = "libc++_static",
435                is_shared = True,
436                is_binary = False,
437                android_deps = struct(
438                    static = _ANDROID_STATIC_DEPS + _STATIC_DEP,
439                    shared = None,
440                ),
441                non_android_deps = struct(
442                    static = _STATIC_DEP,
443                    shared = None,
444                ),
445                android_flags = struct(
446                    cppflags = _ANDROID_CPPFLAGS,
447                    linkopts = _ANDROID_LINKOPTS,
448                ),
449                linux_flags = struct(
450                    cppflags = _LINUX_CPPFLAGS,
451                    linkopts = _LINUX_LINKOPTS,
452                ),
453                linux_bionic_flags = struct(
454                    cppflags = _LINUX_BIONIC_CPPFLAGS,
455                    linkopts = _LINUX_BIONIC_LINKOPTS,
456                ),
457                darwin_flags = struct(
458                    cppflags = _DARWIN_CPPFLAGS,
459                    linkopts = _DARWIN_LINKOPTS,
460                ),
461                windows_flags = struct(
462                    cppflags = _WINDOWS_CPPFLAGS,
463                    linkopts = _WINDOWS_LINKOPTS,
464                ),
465            ) +
466            _test_stl(
467                stl = "none",
468                is_shared = True,
469                is_binary = False,
470                android_deps = struct(
471                    static = None,
472                    shared = None,
473                ),
474                non_android_deps = struct(
475                    static = None,
476                    shared = None,
477                ),
478                android_flags = struct(
479                    cppflags = _ANDROID_CPPFLAGS,
480                    linkopts = _ANDROID_LINKOPTS,
481                ),
482                linux_flags = struct(
483                    cppflags = _LINUX_CPPFLAGS,
484                    linkopts = _LINUX_LINKOPTS,
485                ),
486                linux_bionic_flags = struct(
487                    cppflags = _LINUX_BIONIC_CPPFLAGS,
488                    linkopts = _LINUX_BIONIC_LINKOPTS,
489                ),
490                darwin_flags = struct(
491                    cppflags = _DARWIN_CPPFLAGS_STL_NONE,
492                    linkopts = _DARWIN_LINKOPTS,
493                ),
494                windows_flags = struct(
495                    cppflags = _WINDOWS_CPPFLAGS_STL_NONE,
496                    linkopts = _WINDOWS_LINKOPTS,
497                ),
498            ) +
499            _test_stl(
500                stl = "",
501                is_shared = False,
502                is_binary = False,
503                android_deps = struct(
504                    static = _ANDROID_STATIC_DEPS + _STATIC_DEP,
505                    shared = None,
506                ),
507                non_android_deps = struct(
508                    static = _STATIC_DEP,
509                    shared = None,
510                ),
511                android_flags = struct(
512                    cppflags = _ANDROID_CPPFLAGS,
513                    linkopts = _ANDROID_LINKOPTS,
514                ),
515                linux_flags = struct(
516                    cppflags = _LINUX_CPPFLAGS,
517                    linkopts = _LINUX_LINKOPTS,
518                ),
519                linux_bionic_flags = struct(
520                    cppflags = _LINUX_BIONIC_CPPFLAGS,
521                    linkopts = _LINUX_BIONIC_LINKOPTS,
522                ),
523                darwin_flags = struct(
524                    cppflags = _DARWIN_CPPFLAGS,
525                    linkopts = _DARWIN_LINKOPTS,
526                ),
527                windows_flags = struct(
528                    cppflags = _WINDOWS_CPPFLAGS,
529                    linkopts = _WINDOWS_LINKOPTS,
530                ),
531            ) +
532            _test_stl(
533                stl = "system",
534                is_shared = False,
535                is_binary = False,
536                android_deps = struct(
537                    static = _ANDROID_STATIC_DEPS + _STATIC_DEP,
538                    shared = None,
539                ),
540                non_android_deps = struct(
541                    static = _STATIC_DEP,
542                    shared = None,
543                ),
544                android_flags = struct(
545                    cppflags = _ANDROID_CPPFLAGS,
546                    linkopts = _ANDROID_LINKOPTS,
547                ),
548                linux_flags = struct(
549                    cppflags = _LINUX_CPPFLAGS,
550                    linkopts = _LINUX_LINKOPTS,
551                ),
552                linux_bionic_flags = struct(
553                    cppflags = _LINUX_BIONIC_CPPFLAGS,
554                    linkopts = _LINUX_BIONIC_LINKOPTS,
555                ),
556                darwin_flags = struct(
557                    cppflags = _DARWIN_CPPFLAGS,
558                    linkopts = _DARWIN_LINKOPTS,
559                ),
560                windows_flags = struct(
561                    cppflags = _WINDOWS_CPPFLAGS,
562                    linkopts = _WINDOWS_LINKOPTS,
563                ),
564            ) +
565            _test_stl(
566                stl = "libc++",
567                is_shared = False,
568                is_binary = False,
569                android_deps = struct(
570                    static = _ANDROID_STATIC_DEPS,
571                    shared = _SHARED_DEP,
572                ),
573                non_android_deps = struct(
574                    static = None,
575                    shared = _SHARED_DEP,
576                ),
577                android_flags = struct(
578                    cppflags = _ANDROID_CPPFLAGS,
579                    linkopts = _ANDROID_LINKOPTS,
580                ),
581                linux_flags = struct(
582                    cppflags = _LINUX_CPPFLAGS,
583                    linkopts = _LINUX_LINKOPTS,
584                ),
585                linux_bionic_flags = struct(
586                    cppflags = _LINUX_BIONIC_CPPFLAGS,
587                    linkopts = _LINUX_BIONIC_LINKOPTS,
588                ),
589                darwin_flags = struct(
590                    cppflags = _DARWIN_CPPFLAGS,
591                    linkopts = _DARWIN_LINKOPTS,
592                ),
593                windows_flags = struct(
594                    cppflags = _WINDOWS_CPPFLAGS,
595                    linkopts = _WINDOWS_LINKOPTS,
596                ),
597            ) +
598            _test_stl(
599                stl = "libc++_static",
600                is_shared = False,
601                is_binary = False,
602                android_deps = struct(
603                    static = _ANDROID_STATIC_DEPS + _STATIC_DEP,
604                    shared = None,
605                ),
606                non_android_deps = struct(
607                    static = _STATIC_DEP,
608                    shared = None,
609                ),
610                android_flags = struct(
611                    cppflags = _ANDROID_CPPFLAGS,
612                    linkopts = _ANDROID_LINKOPTS,
613                ),
614                linux_flags = struct(
615                    cppflags = _LINUX_CPPFLAGS,
616                    linkopts = _LINUX_LINKOPTS,
617                ),
618                linux_bionic_flags = struct(
619                    cppflags = _LINUX_BIONIC_CPPFLAGS,
620                    linkopts = _LINUX_BIONIC_LINKOPTS,
621                ),
622                darwin_flags = struct(
623                    cppflags = _DARWIN_CPPFLAGS,
624                    linkopts = _DARWIN_LINKOPTS,
625                ),
626                windows_flags = struct(
627                    cppflags = _WINDOWS_CPPFLAGS,
628                    linkopts = _WINDOWS_LINKOPTS,
629                ),
630            ) +
631            _test_stl(
632                stl = "none",
633                is_shared = False,
634                is_binary = False,
635                android_deps = struct(
636                    static = None,
637                    shared = None,
638                ),
639                non_android_deps = struct(
640                    static = None,
641                    shared = None,
642                ),
643                android_flags = struct(
644                    cppflags = _ANDROID_CPPFLAGS,
645                    linkopts = _ANDROID_LINKOPTS,
646                ),
647                linux_flags = struct(
648                    cppflags = _LINUX_CPPFLAGS,
649                    linkopts = _LINUX_LINKOPTS,
650                ),
651                linux_bionic_flags = struct(
652                    cppflags = _LINUX_BIONIC_CPPFLAGS,
653                    linkopts = _LINUX_BIONIC_LINKOPTS,
654                ),
655                darwin_flags = struct(
656                    cppflags = _DARWIN_CPPFLAGS_STL_NONE,
657                    linkopts = _DARWIN_LINKOPTS,
658                ),
659                windows_flags = struct(
660                    cppflags = _WINDOWS_CPPFLAGS_STL_NONE,
661                    linkopts = _WINDOWS_LINKOPTS,
662                ),
663            ) +
664            _test_stl(
665                stl = "",
666                is_shared = True,
667                is_binary = True,
668                android_deps = struct(
669                    static = _ANDROID_STATIC_DEPS + _ANDROID_BINARY_STATIC_DEP,
670                    shared = _SHARED_DEP,
671                ),
672                non_android_deps = struct(
673                    static = None,
674                    shared = _SHARED_DEP,
675                ),
676                android_flags = struct(
677                    cppflags = _ANDROID_CPPFLAGS,
678                    linkopts = _ANDROID_LINKOPTS,
679                ),
680                linux_flags = struct(
681                    cppflags = _LINUX_CPPFLAGS,
682                    linkopts = _LINUX_LINKOPTS,
683                ),
684                linux_bionic_flags = struct(
685                    cppflags = _LINUX_BIONIC_CPPFLAGS,
686                    linkopts = _LINUX_BIONIC_LINKOPTS,
687                ),
688                darwin_flags = struct(
689                    cppflags = _DARWIN_CPPFLAGS,
690                    linkopts = _DARWIN_LINKOPTS,
691                ),
692                windows_flags = struct(
693                    cppflags = _WINDOWS_CPPFLAGS,
694                    linkopts = _WINDOWS_LINKOPTS,
695                ),
696            ) +
697            _test_stl(
698                stl = "system",
699                is_shared = True,
700                is_binary = True,
701                android_deps = struct(
702                    static = _ANDROID_STATIC_DEPS + _ANDROID_BINARY_STATIC_DEP,
703                    shared = _SHARED_DEP,
704                ),
705                non_android_deps = struct(
706                    static = None,
707                    shared = _SHARED_DEP,
708                ),
709                android_flags = struct(
710                    cppflags = _ANDROID_CPPFLAGS,
711                    linkopts = _ANDROID_LINKOPTS,
712                ),
713                linux_flags = struct(
714                    cppflags = _LINUX_CPPFLAGS,
715                    linkopts = _LINUX_LINKOPTS,
716                ),
717                linux_bionic_flags = struct(
718                    cppflags = _LINUX_BIONIC_CPPFLAGS,
719                    linkopts = _LINUX_BIONIC_LINKOPTS,
720                ),
721                darwin_flags = struct(
722                    cppflags = _DARWIN_CPPFLAGS,
723                    linkopts = _DARWIN_LINKOPTS,
724                ),
725                windows_flags = struct(
726                    cppflags = _WINDOWS_CPPFLAGS,
727                    linkopts = _WINDOWS_LINKOPTS,
728                ),
729            ) +
730            _test_stl(
731                stl = "libc++",
732                is_shared = True,
733                is_binary = True,
734                android_deps = struct(
735                    static = _ANDROID_STATIC_DEPS + _ANDROID_BINARY_STATIC_DEP,
736                    shared = _SHARED_DEP,
737                ),
738                non_android_deps = struct(
739                    static = None,
740                    shared = _SHARED_DEP,
741                ),
742                android_flags = struct(
743                    cppflags = _ANDROID_CPPFLAGS,
744                    linkopts = _ANDROID_LINKOPTS,
745                ),
746                linux_flags = struct(
747                    cppflags = _LINUX_CPPFLAGS,
748                    linkopts = _LINUX_LINKOPTS,
749                ),
750                linux_bionic_flags = struct(
751                    cppflags = _LINUX_BIONIC_CPPFLAGS,
752                    linkopts = _LINUX_BIONIC_LINKOPTS,
753                ),
754                darwin_flags = struct(
755                    cppflags = _DARWIN_CPPFLAGS,
756                    linkopts = _DARWIN_LINKOPTS,
757                ),
758                windows_flags = struct(
759                    cppflags = _WINDOWS_CPPFLAGS,
760                    linkopts = _WINDOWS_LINKOPTS,
761                ),
762            ) +
763            _test_stl(
764                stl = "libc++_static",
765                is_shared = True,
766                is_binary = True,
767                android_deps = struct(
768                    static = _ANDROID_STATIC_DEPS + _STATIC_DEP + _ANDROID_BINARY_STATIC_DEP,
769                    shared = None,
770                ),
771                non_android_deps = struct(
772                    static = _STATIC_DEP,
773                    shared = None,
774                ),
775                android_flags = struct(
776                    cppflags = _ANDROID_CPPFLAGS,
777                    linkopts = _ANDROID_LINKOPTS,
778                ),
779                linux_flags = struct(
780                    cppflags = _LINUX_CPPFLAGS,
781                    linkopts = _LINUX_LINKOPTS,
782                ),
783                linux_bionic_flags = struct(
784                    cppflags = _LINUX_BIONIC_CPPFLAGS,
785                    linkopts = _LINUX_BIONIC_LINKOPTS,
786                ),
787                darwin_flags = struct(
788                    cppflags = _DARWIN_CPPFLAGS,
789                    linkopts = _DARWIN_LINKOPTS,
790                ),
791                windows_flags = struct(
792                    cppflags = _WINDOWS_CPPFLAGS,
793                    linkopts = _WINDOWS_LINKOPTS,
794                ),
795            ) +
796            _test_stl(
797                stl = "none",
798                is_shared = True,
799                is_binary = True,
800                android_deps = struct(
801                    static = None,
802                    shared = None,
803                ),
804                non_android_deps = struct(
805                    static = None,
806                    shared = None,
807                ),
808                android_flags = struct(
809                    cppflags = _ANDROID_CPPFLAGS,
810                    linkopts = _ANDROID_LINKOPTS,
811                ),
812                linux_flags = struct(
813                    cppflags = _LINUX_CPPFLAGS,
814                    linkopts = _LINUX_LINKOPTS,
815                ),
816                linux_bionic_flags = struct(
817                    cppflags = _LINUX_BIONIC_CPPFLAGS,
818                    linkopts = _LINUX_BIONIC_LINKOPTS,
819                ),
820                darwin_flags = struct(
821                    cppflags = _DARWIN_CPPFLAGS_STL_NONE,
822                    linkopts = _DARWIN_LINKOPTS,
823                ),
824                windows_flags = struct(
825                    cppflags = _WINDOWS_CPPFLAGS_STL_NONE,
826                    linkopts = _WINDOWS_LINKOPTS,
827                ),
828            ) +
829            _test_stl(
830                stl = "",
831                is_shared = False,
832                is_binary = True,
833                android_deps = struct(
834                    static = _ANDROID_STATIC_DEPS + _STATIC_DEP + _ANDROID_BINARY_STATIC_DEP,
835                    shared = None,
836                ),
837                non_android_deps = struct(
838                    static = _STATIC_DEP,
839                    shared = None,
840                ),
841                android_flags = struct(
842                    cppflags = _ANDROID_CPPFLAGS,
843                    linkopts = _ANDROID_LINKOPTS,
844                ),
845                linux_flags = struct(
846                    cppflags = _LINUX_CPPFLAGS,
847                    linkopts = _LINUX_LINKOPTS,
848                ),
849                linux_bionic_flags = struct(
850                    cppflags = _LINUX_BIONIC_CPPFLAGS,
851                    linkopts = _LINUX_BIONIC_LINKOPTS,
852                ),
853                darwin_flags = struct(
854                    cppflags = _DARWIN_CPPFLAGS,
855                    linkopts = _DARWIN_LINKOPTS,
856                ),
857                windows_flags = struct(
858                    cppflags = _WINDOWS_CPPFLAGS,
859                    linkopts = _WINDOWS_LINKOPTS,
860                ),
861            ) +
862            _test_stl(
863                stl = "system",
864                is_shared = False,
865                is_binary = True,
866                android_deps = struct(
867                    static = _ANDROID_STATIC_DEPS + _STATIC_DEP + _ANDROID_BINARY_STATIC_DEP,
868                    shared = None,
869                ),
870                non_android_deps = struct(
871                    static = _STATIC_DEP,
872                    shared = None,
873                ),
874                android_flags = struct(
875                    cppflags = _ANDROID_CPPFLAGS,
876                    linkopts = _ANDROID_LINKOPTS,
877                ),
878                linux_flags = struct(
879                    cppflags = _LINUX_CPPFLAGS,
880                    linkopts = _LINUX_LINKOPTS,
881                ),
882                linux_bionic_flags = struct(
883                    cppflags = _LINUX_BIONIC_CPPFLAGS,
884                    linkopts = _LINUX_BIONIC_LINKOPTS,
885                ),
886                darwin_flags = struct(
887                    cppflags = _DARWIN_CPPFLAGS,
888                    linkopts = _DARWIN_LINKOPTS,
889                ),
890                windows_flags = struct(
891                    cppflags = _WINDOWS_CPPFLAGS,
892                    linkopts = _WINDOWS_LINKOPTS,
893                ),
894            ) +
895            _test_stl(
896                stl = "libc++",
897                is_shared = False,
898                is_binary = True,
899                android_deps = struct(
900                    static = _ANDROID_STATIC_DEPS + _ANDROID_BINARY_STATIC_DEP,
901                    shared = _SHARED_DEP,
902                ),
903                non_android_deps = struct(
904                    static = None,
905                    shared = _SHARED_DEP,
906                ),
907                android_flags = struct(
908                    cppflags = _ANDROID_CPPFLAGS,
909                    linkopts = _ANDROID_LINKOPTS,
910                ),
911                linux_flags = struct(
912                    cppflags = _LINUX_CPPFLAGS,
913                    linkopts = _LINUX_LINKOPTS,
914                ),
915                linux_bionic_flags = struct(
916                    cppflags = _LINUX_BIONIC_CPPFLAGS,
917                    linkopts = _LINUX_BIONIC_LINKOPTS,
918                ),
919                darwin_flags = struct(
920                    cppflags = _DARWIN_CPPFLAGS,
921                    linkopts = _DARWIN_LINKOPTS,
922                ),
923                windows_flags = struct(
924                    cppflags = _WINDOWS_CPPFLAGS,
925                    linkopts = _WINDOWS_LINKOPTS,
926                ),
927            ) +
928            _test_stl(
929                stl = "libc++_static",
930                is_shared = False,
931                is_binary = True,
932                android_deps = struct(
933                    static = _ANDROID_STATIC_DEPS + _STATIC_DEP + _ANDROID_BINARY_STATIC_DEP,
934                    shared = None,
935                ),
936                non_android_deps = struct(
937                    static = _STATIC_DEP,
938                    shared = None,
939                ),
940                android_flags = struct(
941                    cppflags = _ANDROID_CPPFLAGS,
942                    linkopts = _ANDROID_LINKOPTS,
943                ),
944                linux_flags = struct(
945                    cppflags = _LINUX_CPPFLAGS,
946                    linkopts = _LINUX_LINKOPTS,
947                ),
948                linux_bionic_flags = struct(
949                    cppflags = _LINUX_BIONIC_CPPFLAGS,
950                    linkopts = _LINUX_BIONIC_LINKOPTS,
951                ),
952                darwin_flags = struct(
953                    cppflags = _DARWIN_CPPFLAGS,
954                    linkopts = _DARWIN_LINKOPTS,
955                ),
956                windows_flags = struct(
957                    cppflags = _WINDOWS_CPPFLAGS,
958                    linkopts = _WINDOWS_LINKOPTS,
959                ),
960            ) +
961            _test_stl(
962                stl = "none",
963                is_shared = False,
964                is_binary = True,
965                android_deps = struct(
966                    static = None,
967                    shared = None,
968                ),
969                non_android_deps = struct(
970                    static = None,
971                    shared = None,
972                ),
973                android_flags = struct(
974                    cppflags = _ANDROID_CPPFLAGS,
975                    linkopts = _ANDROID_LINKOPTS,
976                ),
977                linux_flags = struct(
978                    cppflags = _LINUX_CPPFLAGS,
979                    linkopts = _LINUX_LINKOPTS,
980                ),
981                linux_bionic_flags = struct(
982                    cppflags = _LINUX_BIONIC_CPPFLAGS,
983                    linkopts = _LINUX_BIONIC_LINKOPTS,
984                ),
985                darwin_flags = struct(
986                    cppflags = _DARWIN_CPPFLAGS_STL_NONE,
987                    linkopts = _DARWIN_LINKOPTS,
988                ),
989                windows_flags = struct(
990                    cppflags = _WINDOWS_CPPFLAGS_STL_NONE,
991                    linkopts = _WINDOWS_LINKOPTS,
992                ),
993            ),
994    )
995