1# NOTE: THIS FILE IS EXPERIMENTAL FOR THE BAZEL MIGRATION AND NOT USED FOR
2# YOUR BUILDS CURRENTLY.
3#
4# It is not yet the source of truth for your build. If you're looking to modify
5# the build file, modify the Android.bp file instead. Do *not* modify this file
6# unless you have coordinated with the team managing the Soong to Bazel
7# migration.
8
9"""
10Toolchain config
11"""
12
13load("@bazel_skylib//rules:common_settings.bzl", "string_flag")
14load("@env//:env.bzl", "env")
15load(
16    "//build/bazel/toolchains/clang/host/linux-x86:cc_toolchain_config.bzl",
17    "CLANG_TOOLS",
18    "android_cc_toolchain",
19    "clang_tool_output_group",
20    "clang_version_info",
21    "expand_feature_flags",
22    "toolchain_definition",
23)
24load(
25    "//build/bazel/toolchains/clang/host/linux-x86:cc_toolchain_constants.bzl",
26    "arch_to_variants",
27    "arches",
28    "device_compatibility_flags_non_darwin",
29    "device_compatibility_flags_non_windows",
30    "generated_config_constants",
31    "libclang_rt_prebuilt_map",
32    "libclang_ubsan_minimal_rt_prebuilt_map",
33    "variant_name",
34    "x86_64_host_toolchains",
35    "x86_64_musl_host_toolchains",
36    "x86_host_toolchains",
37    "x86_musl_host_toolchains",
38    _bionic_crt = "bionic_crt",
39    _musl_crt = "musl_crt",
40)
41load("//build/bazel/platforms/arch/variants:constants.bzl", _arch_constants = "constants")
42
43filegroup(name = "empty")
44
45# Different clang versions are configured here.
46clang_version_info(
47    name = "clang",
48    clang_files = glob(["**/*"]),
49    clang_short_version = ":clang_short_version",
50    clang_version = ":clang_version",
51)
52
53# x86_64 toolchain definitions
54[
55    android_cc_toolchain(
56        name = "cc_toolchain_x86_64" + variant_name(variant),
57        clang_version = ":clang",
58        compiler_flags = generated_config_constants.X86_64ToolchainCflags +
59                         generated_config_constants.X86_64ArchVariantCflags[variant.arch_variant] +
60                         expand_feature_flags(
61                             variant.arch_variant,
62                             _arch_constants.AndroidArchToVariantToFeatures[arches.X86_64],
63                             generated_config_constants.X86_64ArchFeatureCflags,
64                         ) + generated_config_constants.X86_64Cflags,
65        crt = _bionic_crt,
66        libclang_rt_builtin = libclang_rt_prebuilt_map["//build/bazel_common_rules/platforms/os_arch:android_x86_64"],
67        libclang_rt_ubsan_minimal = libclang_ubsan_minimal_rt_prebuilt_map["//build/bazel_common_rules/platforms/os_arch:android_x86_64"],
68        linker_flags = generated_config_constants.X86_64ToolchainLdflags + generated_config_constants.X86_64Lldflags,
69        target_arch = arches.X86_64,
70        target_os = "android",
71        toolchain_identifier = "x86_64-toolchain",
72    )
73    for variant in arch_to_variants[arches.X86_64]
74]
75
76# x86 toolchain definitions.
77[
78    android_cc_toolchain(
79        name = "cc_toolchain_x86" + variant_name(variant),
80        clang_version = ":clang",
81        compiler_flags = generated_config_constants.X86ToolchainCflags +
82                         generated_config_constants.X86ArchVariantCflags[variant.arch_variant] +
83                         expand_feature_flags(
84                             variant.arch_variant,
85                             _arch_constants.AndroidArchToVariantToFeatures[arches.X86],
86                             generated_config_constants.X86ArchFeatureCflags,
87                         ) + generated_config_constants.X86Cflags,
88        crt = _bionic_crt,
89        libclang_rt_builtin = libclang_rt_prebuilt_map["//build/bazel_common_rules/platforms/os_arch:android_x86"],
90        libclang_rt_ubsan_minimal = libclang_ubsan_minimal_rt_prebuilt_map["//build/bazel_common_rules/platforms/os_arch:android_x86"],
91        linker_flags = generated_config_constants.X86ToolchainLdflags + generated_config_constants.X86Lldflags,
92        target_arch = arches.X86,
93        target_os = "android",
94        toolchain_identifier = "x86-toolchain",
95    )
96    for variant in arch_to_variants[arches.X86]
97]
98
99# arm64 toolchain definitions.
100[
101    android_cc_toolchain(
102        name = "cc_toolchain_arm64" + variant_name(variant),
103        clang_version = ":clang",
104        compiler_flags = generated_config_constants.Arm64Cflags +
105                         generated_config_constants.Arm64ArchVariantCflags[variant.arch_variant] +
106                         generated_config_constants.Arm64CpuVariantCflags.get(
107                             variant.cpu_variant,
108                             [],
109                         ),
110        crt = _bionic_crt,
111        libclang_rt_builtin = libclang_rt_prebuilt_map["//build/bazel_common_rules/platforms/os_arch:android_arm64"],
112        libclang_rt_ubsan_minimal = libclang_ubsan_minimal_rt_prebuilt_map["//build/bazel_common_rules/platforms/os_arch:android_arm64"],
113        linker_flags = generated_config_constants.Arm64CpuVariantLdflags.get(
114            variant.cpu_variant,
115            [],
116        ) + generated_config_constants.Arm64Lldflags,
117        target_arch = arches.Arm64,
118        target_os = "android",
119        toolchain_identifier = "arm64-toolchain",
120    )
121    for variant in arch_to_variants[arches.Arm64]
122]
123
124# arm32 toolchain definitions.
125[
126    android_cc_toolchain(
127        name = "cc_toolchain_arm" + variant_name(variant),
128        clang_version = ":clang",
129        compiler_flags = generated_config_constants.ArmCflags +
130                         generated_config_constants.ArmToolchainCflags +
131                         generated_config_constants.ArmArchVariantCflags[variant.arch_variant] +
132                         generated_config_constants.ArmCpuVariantCflags.get(
133                             variant.cpu_variant,
134                             [],
135                         ),
136        crt = _bionic_crt,
137        libclang_rt_builtin = libclang_rt_prebuilt_map["//build/bazel_common_rules/platforms/os_arch:android_arm"],
138        libclang_rt_ubsan_minimal = libclang_ubsan_minimal_rt_prebuilt_map["//build/bazel_common_rules/platforms/os_arch:android_arm"],
139        # do not pass "ld"-only flags as Bazel is only using lld. Ensure that all flags are lld-compatible.
140        linker_flags = generated_config_constants.ArmLldflags,
141        target_arch = arches.Arm,
142        target_os = "android",
143        toolchain_identifier = "arm-toolchain",
144    )
145    for variant in arch_to_variants[arches.Arm]
146]
147
148# Toolchain to compile for the linux host.
149# TODO(b/186628704): automatically generate from Soong.
150android_cc_toolchain(
151    name = "cc_toolchain_x86_64_linux_host",
152    clang_version = ":clang",
153    compiler_flags = generated_config_constants.LinuxCflags +
154                     generated_config_constants.LinuxGlibcCflags +
155                     generated_config_constants.LinuxX8664Cflags +
156    # Added by stl.go for non-bionic toolchains.
157    [
158        "-nostdinc++",
159    ],
160    crt = False,
161    gcc_toolchain = generated_config_constants.LinuxGccRoot,
162    libclang_rt_builtin = libclang_rt_prebuilt_map["//build/bazel_common_rules/platforms/os_arch:linux_glibc_x86_64"],
163    libclang_rt_ubsan_minimal = libclang_ubsan_minimal_rt_prebuilt_map["//build/bazel_common_rules/platforms/os_arch:linux_glibc_x86_64"],
164    linker_flags = generated_config_constants.LinuxGlibcLdflags +
165                   generated_config_constants.LinuxLdflags +
166                   generated_config_constants.LinuxX8664Ldflags +
167                   device_compatibility_flags_non_windows +
168                   device_compatibility_flags_non_darwin,
169    rtti_toggle = False,
170    target_arch = "x86_64",
171    target_flags = ["--target=x86_64-linux-gnu"],
172    target_os = "linux_glibc",
173    toolchain_identifier = "x86_64-toolchain",
174)
175
176# Toolchain to compile for the linux x86 target.
177android_cc_toolchain(
178    name = "cc_toolchain_x86_linux_host",
179    clang_version = ":clang",
180    compiler_flags = generated_config_constants.LinuxCflags +
181                     generated_config_constants.LinuxGlibcCflags +
182                     generated_config_constants.LinuxX86Cflags +
183    # Added by stl.go for non-bionic toolchains.
184    [
185        "-nostdinc++",
186    ],
187    crt = False,
188    gcc_toolchain = generated_config_constants.LinuxGccRoot,
189    libclang_rt_builtin = libclang_rt_prebuilt_map["//build/bazel_common_rules/platforms/os_arch:linux_glibc_x86"],
190    libclang_rt_ubsan_minimal = libclang_ubsan_minimal_rt_prebuilt_map["//build/bazel_common_rules/platforms/os_arch:linux_glibc_x86"],
191    linker_flags = generated_config_constants.LinuxGlibcLdflags +
192                   generated_config_constants.LinuxLdflags +
193                   generated_config_constants.LinuxX86Ldflags +
194                   device_compatibility_flags_non_windows +
195                   device_compatibility_flags_non_darwin,
196    rtti_toggle = False,
197    target_arch = "x86",
198    target_flags = ["--target=i686-linux-gnu"],
199    target_os = "linux_glibc",
200    toolchain_identifier = "x86-toolchain",
201)
202
203# Toolchain to compile for the linux host with musl libc.
204android_cc_toolchain(
205    name = "cc_toolchain_x86_64_linux_musl_host",
206    clang_version = ":clang",
207    compiler_flags = generated_config_constants.LinuxCflags +
208                     generated_config_constants.LinuxMuslCflags +
209                     generated_config_constants.LinuxX8664Cflags +
210    # Added by stl.go for non-bionic toolchains.
211    [
212        "-nostdinc++",
213    ],
214    crt = _musl_crt,
215    gcc_toolchain = generated_config_constants.LinuxGccRoot,
216    libclang_rt_builtin = libclang_rt_prebuilt_map["//build/bazel_common_rules/platforms/os_arch:linux_musl_x86_64"],
217    libclang_rt_ubsan_minimal = libclang_ubsan_minimal_rt_prebuilt_map["//build/bazel_common_rules/platforms/os_arch:linux_musl_x86_64"],
218    linker_flags = generated_config_constants.LinuxMuslLdflags +
219                   generated_config_constants.LinuxLdflags +
220                   generated_config_constants.LinuxX8664Ldflags,
221    rtti_toggle = False,
222    target_arch = "x86_64",
223    target_flags = ["--target=x86_64-linux-musl"],
224    target_os = "linux_musl",
225    toolchain_identifier = "x86_64-toolchain",
226)
227
228# Toolchain to compile for the linux x86 host with musl libc.
229android_cc_toolchain(
230    name = "cc_toolchain_x86_linux_musl_host",
231    clang_version = ":clang",
232    compiler_flags = generated_config_constants.LinuxCflags +
233                     generated_config_constants.LinuxMuslCflags +
234                     generated_config_constants.LinuxX86Cflags +
235    # Added by stl.go for non-bionic toolchains.
236    [
237        "-nostdinc++",
238    ],
239    crt = _musl_crt,
240    gcc_toolchain = generated_config_constants.LinuxGccRoot,
241    libclang_rt_builtin = libclang_rt_prebuilt_map["//build/bazel_common_rules/platforms/os_arch:linux_musl_x86"],
242    libclang_rt_ubsan_minimal = libclang_ubsan_minimal_rt_prebuilt_map["//build/bazel_common_rules/platforms/os_arch:linux_musl_x86"],
243    linker_flags = generated_config_constants.LinuxMuslLdflags +
244                   generated_config_constants.LinuxLdflags +
245                   generated_config_constants.LinuxX86Ldflags,
246    rtti_toggle = False,
247    target_arch = "x86",
248    target_flags = ["--target=i686-linux-musl"],
249    target_os = "linux_musl",
250    toolchain_identifier = "x86-toolchain",
251)
252
253toolchain_type(name = "nocrt_toolchain")
254
255# Device toolchains
256[
257    [
258        [
259            toolchain_definition(arch, variant, nocrt)
260            for nocrt in [
261                True,
262                False,
263            ]
264        ]
265        for variant in variants
266    ]
267    for arch, variants in arch_to_variants.items()
268]
269
270# Toolchains for linux host (x86_64) archs
271[
272    toolchain(
273        name = "%s_def" % toolchain_name,
274        exec_compatible_with = [
275            "//build/bazel_common_rules/platforms/arch:x86_64",
276            "//build/bazel_common_rules/platforms/os:linux_glibc",
277        ],
278        target_compatible_with = [
279            "//build/bazel_common_rules/platforms/arch:x86_64",
280            "//build/bazel_common_rules/platforms/os:linux_glibc",
281        ],
282        toolchain = toolchain_name,
283        toolchain_type = toolchain_type,
284    )
285    for (toolchain_name, toolchain_type) in x86_64_host_toolchains
286]
287
288# Toolchains for linux target (non-host) x86 arch
289[
290    toolchain(
291        name = "%s_def" % toolchain_name,
292        exec_compatible_with = [
293            "//build/bazel_common_rules/platforms/arch:x86_64",
294            "//build/bazel_common_rules/platforms/os:linux_glibc",
295        ],
296        target_compatible_with = [
297            "//build/bazel_common_rules/platforms/arch:x86",
298            "//build/bazel_common_rules/platforms/os:linux_glibc",
299        ],
300        toolchain = toolchain_name,
301        toolchain_type = toolchain_type,
302    )
303    for (toolchain_name, toolchain_type) in x86_host_toolchains
304]
305
306# Toolchains for linux musl host (x86_64) archs
307[
308    toolchain(
309        name = "%s_def" % toolchain_name,
310        exec_compatible_with = [
311            "//build/bazel_common_rules/platforms/arch:x86_64",
312            "//build/bazel_common_rules/platforms/os:linux_musl",
313        ],
314        target_compatible_with = [
315            "//build/bazel_common_rules/platforms/arch:x86_64",
316            "//build/bazel_common_rules/platforms/os:linux_musl",
317        ],
318        toolchain = toolchain_name,
319        toolchain_type = toolchain_type,
320    )
321    for (toolchain_name, toolchain_type) in x86_64_musl_host_toolchains
322]
323
324# Toolchains for linux musl target (non-host) x86 arch
325[
326    toolchain(
327        name = "%s_def" % toolchain_name,
328        exec_compatible_with = [
329            "//build/bazel_common_rules/platforms/arch:x86_64",
330            "//build/bazel_common_rules/platforms/os:linux_musl",
331        ],
332        target_compatible_with = [
333            "//build/bazel_common_rules/platforms/arch:x86",
334            "//build/bazel_common_rules/platforms/os:linux_musl",
335        ],
336        toolchain = toolchain_name,
337        toolchain_type = toolchain_type,
338    )
339    for (toolchain_name, toolchain_type) in x86_musl_host_toolchains
340]
341
342[
343    filegroup(
344        name = "libclang_rt_%s_%s_%s" % (prefix, os, arch),
345        srcs = [":clang"],
346        output_group = "libclang_rt_%s_%s_%s" % (prefix, os, arch),
347    )
348    for os, arches in {
349        "android": [
350            "arm",
351            "arm64",
352            "x86",
353            "x86_64",
354        ],
355        "linux": [
356            "bionic_x86_64",
357            "glibc_x86",
358            "glibc_x86_64",
359            "musl_x86",
360            "musl_x86_64",
361        ],
362    }.items()
363    for arch in arches
364    for prefix in [
365        "builtins",
366        "ubsan_minimal",
367    ]
368]
369
370cc_import(
371    name = "libclang_rt",
372    static_library = select(libclang_rt_prebuilt_map),
373)
374
375[
376    filegroup(
377        name = tool,
378        srcs = [":clang"],
379        output_group = clang_tool_output_group(tool),
380        visibility = ["//visibility:public"],
381    )
382    for tool in CLANG_TOOLS
383]
384
385# Test tools used by Bazel tests.
386filegroup(
387    name = "test_tools",
388    srcs = [":clang"],
389    output_group = "clang_test_tools",
390    visibility = ["//build/bazel/tests:__subpackages__"],
391)
392
393string_flag(
394    name = "clang_version",
395    build_setting_default = env.get(
396        "LLVM_PREBUILTS_VERSION",
397        generated_config_constants.CLANG_DEFAULT_VERSION,
398    ),
399)
400
401string_flag(
402    name = "clang_short_version",
403    build_setting_default = env.get(
404        "LLVM_RELEASE_VERSION",
405        generated_config_constants.CLANG_DEFAULT_SHORT_VERSION,
406    ),
407)
408