xref: /aosp_15_r20/bootable/libbootloader/gbl/toolchain/BUILD (revision 5225e6b173e52d2efc6bcf950c27374fd72adabc)
1*5225e6b1SAndroid Build Coastguard Worker# Copyright (C) 2023 The Android Open Source Project
2*5225e6b1SAndroid Build Coastguard Worker#
3*5225e6b1SAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
4*5225e6b1SAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
5*5225e6b1SAndroid Build Coastguard Worker# You may obtain a copy of the License at
6*5225e6b1SAndroid Build Coastguard Worker#
7*5225e6b1SAndroid Build Coastguard Worker#     http://www.apache.org/licenses/LICENSE-2.0
8*5225e6b1SAndroid Build Coastguard Worker#
9*5225e6b1SAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
10*5225e6b1SAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
11*5225e6b1SAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*5225e6b1SAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
13*5225e6b1SAndroid Build Coastguard Worker# limitations under the License.
14*5225e6b1SAndroid Build Coastguard Worker
15*5225e6b1SAndroid Build Coastguard Workerload("@bazel_skylib//rules:common_settings.bzl", "bool_setting")
16*5225e6b1SAndroid Build Coastguard Workerload(
17*5225e6b1SAndroid Build Coastguard Worker    "@gbl_llvm_prebuilts//:info.bzl",
18*5225e6b1SAndroid Build Coastguard Worker    "LINUX_SYSROOT_INCLUDES",
19*5225e6b1SAndroid Build Coastguard Worker    "LLVM_PREBUILTS_CPP_INCLUDE",
20*5225e6b1SAndroid Build Coastguard Worker    "LLVM_PREBUILTS_C_INCLUDE",
21*5225e6b1SAndroid Build Coastguard Worker    "gbl_llvm_tool_path",
22*5225e6b1SAndroid Build Coastguard Worker)
23*5225e6b1SAndroid Build Coastguard Workerload("@rules_rust//bindgen:defs.bzl", "rust_bindgen_toolchain")
24*5225e6b1SAndroid Build Coastguard Workerload(
25*5225e6b1SAndroid Build Coastguard Worker    "@rules_rust//rust:toolchain.bzl",
26*5225e6b1SAndroid Build Coastguard Worker    "rust_stdlib_filegroup",
27*5225e6b1SAndroid Build Coastguard Worker    "rust_toolchain",
28*5225e6b1SAndroid Build Coastguard Worker    "rustfmt_toolchain",
29*5225e6b1SAndroid Build Coastguard Worker)
30*5225e6b1SAndroid Build Coastguard Workerload(
31*5225e6b1SAndroid Build Coastguard Worker    ":gbl_toolchain.bzl",
32*5225e6b1SAndroid Build Coastguard Worker    "build_with_no_rust_sysroot",
33*5225e6b1SAndroid Build Coastguard Worker    "gbl_clang_cc_toolchain",
34*5225e6b1SAndroid Build Coastguard Worker    "prebuilt_binary",
35*5225e6b1SAndroid Build Coastguard Worker)
36*5225e6b1SAndroid Build Coastguard Worker
37*5225e6b1SAndroid Build Coastguard Workerpackage(
38*5225e6b1SAndroid Build Coastguard Worker    default_visibility = ["//visibility:public"],
39*5225e6b1SAndroid Build Coastguard Worker)
40*5225e6b1SAndroid Build Coastguard Worker
41*5225e6b1SAndroid Build Coastguard Worker# The following constraint/settings will be used in our newly defined
42*5225e6b1SAndroid Build Coastguard Worker# toolchains, so that they only get selected by bazel when we configure
43*5225e6b1SAndroid Build Coastguard Worker# to build GBL.
44*5225e6b1SAndroid Build Coastguard Workerconstraint_setting(name = "firmware_image_type")
45*5225e6b1SAndroid Build Coastguard Worker
46*5225e6b1SAndroid Build Coastguard Workerconstraint_value(
47*5225e6b1SAndroid Build Coastguard Worker    name = "uefi",
48*5225e6b1SAndroid Build Coastguard Worker    constraint_setting = ":firmware_image_type",
49*5225e6b1SAndroid Build Coastguard Worker)
50*5225e6b1SAndroid Build Coastguard Worker
51*5225e6b1SAndroid Build Coastguard Workerconstraint_value(
52*5225e6b1SAndroid Build Coastguard Worker    name = "elf",
53*5225e6b1SAndroid Build Coastguard Worker    constraint_setting = ":firmware_image_type",
54*5225e6b1SAndroid Build Coastguard Worker)
55*5225e6b1SAndroid Build Coastguard Worker
56*5225e6b1SAndroid Build Coastguard Workerhost_x86_64_constraint_values = [
57*5225e6b1SAndroid Build Coastguard Worker    "@platforms//os:linux",
58*5225e6b1SAndroid Build Coastguard Worker    "@platforms//cpu:x86_64",
59*5225e6b1SAndroid Build Coastguard Worker]
60*5225e6b1SAndroid Build Coastguard Worker
61*5225e6b1SAndroid Build Coastguard Workeruefi_x86_64_constraint_values = [
62*5225e6b1SAndroid Build Coastguard Worker    ":uefi",
63*5225e6b1SAndroid Build Coastguard Worker    "@platforms//os:none",
64*5225e6b1SAndroid Build Coastguard Worker    "@platforms//cpu:x86_64",
65*5225e6b1SAndroid Build Coastguard Worker]
66*5225e6b1SAndroid Build Coastguard Worker
67*5225e6b1SAndroid Build Coastguard Workeruefi_x86_32_constraint_values = [
68*5225e6b1SAndroid Build Coastguard Worker    ":uefi",
69*5225e6b1SAndroid Build Coastguard Worker    "@platforms//os:none",
70*5225e6b1SAndroid Build Coastguard Worker    "@platforms//cpu:x86_32",
71*5225e6b1SAndroid Build Coastguard Worker]
72*5225e6b1SAndroid Build Coastguard Worker
73*5225e6b1SAndroid Build Coastguard Workeruefi_aarch64_constraint_values = [
74*5225e6b1SAndroid Build Coastguard Worker    ":uefi",
75*5225e6b1SAndroid Build Coastguard Worker    "@platforms//os:none",
76*5225e6b1SAndroid Build Coastguard Worker    "@platforms//cpu:aarch64",
77*5225e6b1SAndroid Build Coastguard Worker]
78*5225e6b1SAndroid Build Coastguard Worker
79*5225e6b1SAndroid Build Coastguard Workerelf_riscv64_constraint_values = [
80*5225e6b1SAndroid Build Coastguard Worker    ":elf",
81*5225e6b1SAndroid Build Coastguard Worker    "@platforms//os:none",
82*5225e6b1SAndroid Build Coastguard Worker    "@platforms//cpu:riscv64",
83*5225e6b1SAndroid Build Coastguard Worker]
84*5225e6b1SAndroid Build Coastguard Worker
85*5225e6b1SAndroid Build Coastguard Workerconfig_setting(
86*5225e6b1SAndroid Build Coastguard Worker    name = "gbl_rust_host_x86_64",
87*5225e6b1SAndroid Build Coastguard Worker    constraint_values = host_x86_64_constraint_values,
88*5225e6b1SAndroid Build Coastguard Worker)
89*5225e6b1SAndroid Build Coastguard Worker
90*5225e6b1SAndroid Build Coastguard Workerconfig_setting(
91*5225e6b1SAndroid Build Coastguard Worker    name = "gbl_rust_uefi_x86_64",
92*5225e6b1SAndroid Build Coastguard Worker    constraint_values = uefi_x86_64_constraint_values,
93*5225e6b1SAndroid Build Coastguard Worker)
94*5225e6b1SAndroid Build Coastguard Worker
95*5225e6b1SAndroid Build Coastguard Workerconfig_setting(
96*5225e6b1SAndroid Build Coastguard Worker    name = "gbl_rust_uefi_x86_32",
97*5225e6b1SAndroid Build Coastguard Worker    constraint_values = uefi_x86_32_constraint_values,
98*5225e6b1SAndroid Build Coastguard Worker)
99*5225e6b1SAndroid Build Coastguard Worker
100*5225e6b1SAndroid Build Coastguard Workerconfig_setting(
101*5225e6b1SAndroid Build Coastguard Worker    name = "gbl_rust_uefi_aarch64",
102*5225e6b1SAndroid Build Coastguard Worker    constraint_values = uefi_aarch64_constraint_values,
103*5225e6b1SAndroid Build Coastguard Worker)
104*5225e6b1SAndroid Build Coastguard Worker
105*5225e6b1SAndroid Build Coastguard Workerconfig_setting(
106*5225e6b1SAndroid Build Coastguard Worker    name = "gbl_rust_elf_riscv64",
107*5225e6b1SAndroid Build Coastguard Worker    constraint_values = elf_riscv64_constraint_values,
108*5225e6b1SAndroid Build Coastguard Worker)
109*5225e6b1SAndroid Build Coastguard Worker
110*5225e6b1SAndroid Build Coastguard Worker# The following will be passed to "bazel build --platform=<>" argument to
111*5225e6b1SAndroid Build Coastguard Worker# configure building for specific architecture and image type.
112*5225e6b1SAndroid Build Coastguard Workerplatform(
113*5225e6b1SAndroid Build Coastguard Worker    name = "gbl_uefi_x86_64",
114*5225e6b1SAndroid Build Coastguard Worker    constraint_values = uefi_x86_64_constraint_values,
115*5225e6b1SAndroid Build Coastguard Worker)
116*5225e6b1SAndroid Build Coastguard Worker
117*5225e6b1SAndroid Build Coastguard Workerplatform(
118*5225e6b1SAndroid Build Coastguard Worker    name = "gbl_uefi_x86_32",
119*5225e6b1SAndroid Build Coastguard Worker    constraint_values = uefi_x86_32_constraint_values,
120*5225e6b1SAndroid Build Coastguard Worker)
121*5225e6b1SAndroid Build Coastguard Worker
122*5225e6b1SAndroid Build Coastguard Workerplatform(
123*5225e6b1SAndroid Build Coastguard Worker    name = "gbl_uefi_aarch64",
124*5225e6b1SAndroid Build Coastguard Worker    constraint_values = uefi_aarch64_constraint_values,
125*5225e6b1SAndroid Build Coastguard Worker)
126*5225e6b1SAndroid Build Coastguard Worker
127*5225e6b1SAndroid Build Coastguard Workerplatform(
128*5225e6b1SAndroid Build Coastguard Worker    name = "gbl_elf_riscv64",
129*5225e6b1SAndroid Build Coastguard Worker    constraint_values = elf_riscv64_constraint_values,
130*5225e6b1SAndroid Build Coastguard Worker)
131*5225e6b1SAndroid Build Coastguard Worker
132*5225e6b1SAndroid Build Coastguard Workerbool_setting(
133*5225e6b1SAndroid Build Coastguard Worker    name = "rust_no_sysroot",
134*5225e6b1SAndroid Build Coastguard Worker    build_setting_default = False,
135*5225e6b1SAndroid Build Coastguard Worker    visibility = ["//visibility:public"],
136*5225e6b1SAndroid Build Coastguard Worker)
137*5225e6b1SAndroid Build Coastguard Worker
138*5225e6b1SAndroid Build Coastguard Workerconfig_setting(
139*5225e6b1SAndroid Build Coastguard Worker    name = "rust_no_sysroot_true",
140*5225e6b1SAndroid Build Coastguard Worker    flag_values = {":rust_no_sysroot": "True"},
141*5225e6b1SAndroid Build Coastguard Worker)
142*5225e6b1SAndroid Build Coastguard Worker
143*5225e6b1SAndroid Build Coastguard Worker# Linux host LLVM toolchain.
144*5225e6b1SAndroid Build Coastguard Worker# The toolchain is mainly used for building/linking host tools, i.e. bindgen pre-processing
145*5225e6b1SAndroid Build Coastguard Workergbl_clang_cc_toolchain(
146*5225e6b1SAndroid Build Coastguard Worker    name = "x86_64-unknown-linux-gnu",
147*5225e6b1SAndroid Build Coastguard Worker    # Host LLVM toolchain has additional C++ stdlib.
148*5225e6b1SAndroid Build Coastguard Worker    builtin_includes = [
149*5225e6b1SAndroid Build Coastguard Worker        LLVM_PREBUILTS_CPP_INCLUDE,  # C++ headers must come first.
150*5225e6b1SAndroid Build Coastguard Worker        LLVM_PREBUILTS_C_INCLUDE,
151*5225e6b1SAndroid Build Coastguard Worker    ] + LINUX_SYSROOT_INCLUDES,
152*5225e6b1SAndroid Build Coastguard Worker    ld_flags = [
153*5225e6b1SAndroid Build Coastguard Worker        "-stdlib=libc++",
154*5225e6b1SAndroid Build Coastguard Worker        "-static-libstdc++",
155*5225e6b1SAndroid Build Coastguard Worker    ],
156*5225e6b1SAndroid Build Coastguard Worker    target_cpu = "x86_64",
157*5225e6b1SAndroid Build Coastguard Worker    target_system_triple = "x86_64-unknown-linux-gnu",
158*5225e6b1SAndroid Build Coastguard Worker)
159*5225e6b1SAndroid Build Coastguard Worker
160*5225e6b1SAndroid Build Coastguard Workertoolchain(
161*5225e6b1SAndroid Build Coastguard Worker    name = "x86_64-unknown-linux-gnu_toolchain",
162*5225e6b1SAndroid Build Coastguard Worker    exec_compatible_with = ["@platforms//os:linux"],
163*5225e6b1SAndroid Build Coastguard Worker    target_compatible_with = [
164*5225e6b1SAndroid Build Coastguard Worker        "@platforms//os:linux",
165*5225e6b1SAndroid Build Coastguard Worker        "@platforms//cpu:x86_64",
166*5225e6b1SAndroid Build Coastguard Worker    ],
167*5225e6b1SAndroid Build Coastguard Worker    toolchain = ":x86_64-unknown-linux-gnu",
168*5225e6b1SAndroid Build Coastguard Worker    toolchain_type = "@bazel_tools//tools/cpp:toolchain_type",
169*5225e6b1SAndroid Build Coastguard Worker)
170*5225e6b1SAndroid Build Coastguard Worker
171*5225e6b1SAndroid Build Coastguard Worker# The following defines LLVM C++ toolchains for UEFI/ELF targets. They are mostly used for the
172*5225e6b1SAndroid Build Coastguard Worker# final step of linking Rust executables, but may also be used for compiling mixed C/C++ code.
173*5225e6b1SAndroid Build Coastguard Worker
174*5225e6b1SAndroid Build Coastguard Workercc_flags_common = [
175*5225e6b1SAndroid Build Coastguard Worker    "-ffreestanding",
176*5225e6b1SAndroid Build Coastguard Worker    "-fno-common",
177*5225e6b1SAndroid Build Coastguard Worker    "-fno-exceptions",
178*5225e6b1SAndroid Build Coastguard Worker    "-fno-rtti",
179*5225e6b1SAndroid Build Coastguard Worker    # Enable optimization otherwise software AVB hash will be too slow.
180*5225e6b1SAndroid Build Coastguard Worker    "-O3",
181*5225e6b1SAndroid Build Coastguard Worker]
182*5225e6b1SAndroid Build Coastguard Worker
183*5225e6b1SAndroid Build Coastguard Worker# x86_64 UEFI targets
184*5225e6b1SAndroid Build Coastguard Workergbl_clang_cc_toolchain(
185*5225e6b1SAndroid Build Coastguard Worker    name = "x86_64_uefi_clang_cc_toolchain",
186*5225e6b1SAndroid Build Coastguard Worker    cc_flags = cc_flags_common,
187*5225e6b1SAndroid Build Coastguard Worker    target_cpu = "x86_64",
188*5225e6b1SAndroid Build Coastguard Worker    target_system_triple = "x86_64-unknown-windows-msvc",
189*5225e6b1SAndroid Build Coastguard Worker)
190*5225e6b1SAndroid Build Coastguard Worker
191*5225e6b1SAndroid Build Coastguard Workertoolchain(
192*5225e6b1SAndroid Build Coastguard Worker    name = "x86_64_uefi_clang",
193*5225e6b1SAndroid Build Coastguard Worker    exec_compatible_with = ["@platforms//os:linux"],
194*5225e6b1SAndroid Build Coastguard Worker    target_compatible_with = uefi_x86_64_constraint_values,
195*5225e6b1SAndroid Build Coastguard Worker    toolchain = ":x86_64_uefi_clang_cc_toolchain",
196*5225e6b1SAndroid Build Coastguard Worker    toolchain_type = "@bazel_tools//tools/cpp:toolchain_type",
197*5225e6b1SAndroid Build Coastguard Worker)
198*5225e6b1SAndroid Build Coastguard Worker
199*5225e6b1SAndroid Build Coastguard Worker# x86_32 UEFI targets
200*5225e6b1SAndroid Build Coastguard Workergbl_clang_cc_toolchain(
201*5225e6b1SAndroid Build Coastguard Worker    name = "x86_32_uefi_clang_cc_toolchain",
202*5225e6b1SAndroid Build Coastguard Worker    cc_flags = cc_flags_common + [
203*5225e6b1SAndroid Build Coastguard Worker        "-m32",
204*5225e6b1SAndroid Build Coastguard Worker        # Adding this prevents the compiler from generating mmx, sse instructions such as
205*5225e6b1SAndroid Build Coastguard Worker        # "movsd (%esp),%xmm0" which likely isn't enabled during the bootloader stage and causes
206*5225e6b1SAndroid Build Coastguard Worker        # crash as a result.
207*5225e6b1SAndroid Build Coastguard Worker        "-march=i686",
208*5225e6b1SAndroid Build Coastguard Worker    ],
209*5225e6b1SAndroid Build Coastguard Worker    # Safe Exception Handlers is not applicable to EFI systems.
210*5225e6b1SAndroid Build Coastguard Worker    ld_flags = ["/SAFESEH:no"],
211*5225e6b1SAndroid Build Coastguard Worker    target_cpu = "x86_32",
212*5225e6b1SAndroid Build Coastguard Worker    target_system_triple = "i686-unknown-windows-gnu",
213*5225e6b1SAndroid Build Coastguard Worker)
214*5225e6b1SAndroid Build Coastguard Worker
215*5225e6b1SAndroid Build Coastguard Workertoolchain(
216*5225e6b1SAndroid Build Coastguard Worker    name = "x86_32_uefi_clang",
217*5225e6b1SAndroid Build Coastguard Worker    exec_compatible_with = ["@platforms//os:linux"],
218*5225e6b1SAndroid Build Coastguard Worker    target_compatible_with = uefi_x86_32_constraint_values,
219*5225e6b1SAndroid Build Coastguard Worker    toolchain = ":x86_32_uefi_clang_cc_toolchain",
220*5225e6b1SAndroid Build Coastguard Worker    toolchain_type = "@bazel_tools//tools/cpp:toolchain_type",
221*5225e6b1SAndroid Build Coastguard Worker)
222*5225e6b1SAndroid Build Coastguard Worker
223*5225e6b1SAndroid Build Coastguard Worker# aarch64 UEFI targets
224*5225e6b1SAndroid Build Coastguard Workergbl_clang_cc_toolchain(
225*5225e6b1SAndroid Build Coastguard Worker    name = "aarch64_uefi_clang_cc_toolchain",
226*5225e6b1SAndroid Build Coastguard Worker    cc_flags = cc_flags_common,
227*5225e6b1SAndroid Build Coastguard Worker    target_cpu = "aarch64",
228*5225e6b1SAndroid Build Coastguard Worker    target_system_triple = "aarch64-windows-msvc",
229*5225e6b1SAndroid Build Coastguard Worker)
230*5225e6b1SAndroid Build Coastguard Worker
231*5225e6b1SAndroid Build Coastguard Workertoolchain(
232*5225e6b1SAndroid Build Coastguard Worker    name = "aarch64_uefi_clang",
233*5225e6b1SAndroid Build Coastguard Worker    exec_compatible_with = ["@platforms//os:linux"],
234*5225e6b1SAndroid Build Coastguard Worker    target_compatible_with = uefi_aarch64_constraint_values,
235*5225e6b1SAndroid Build Coastguard Worker    toolchain = ":aarch64_uefi_clang_cc_toolchain",
236*5225e6b1SAndroid Build Coastguard Worker    toolchain_type = "@bazel_tools//tools/cpp:toolchain_type",
237*5225e6b1SAndroid Build Coastguard Worker)
238*5225e6b1SAndroid Build Coastguard Worker
239*5225e6b1SAndroid Build Coastguard Worker# riscv64 ELF targets
240*5225e6b1SAndroid Build Coastguard Workergbl_clang_cc_toolchain(
241*5225e6b1SAndroid Build Coastguard Worker    name = "riscv64_elf_clang_cc_toolchain",
242*5225e6b1SAndroid Build Coastguard Worker    cc_flags = cc_flags_common + ["-fpie"],
243*5225e6b1SAndroid Build Coastguard Worker    target_cpu = "riscv64",
244*5225e6b1SAndroid Build Coastguard Worker    target_system_triple = "riscv64-unknown-linux",
245*5225e6b1SAndroid Build Coastguard Worker)
246*5225e6b1SAndroid Build Coastguard Worker
247*5225e6b1SAndroid Build Coastguard Workertoolchain(
248*5225e6b1SAndroid Build Coastguard Worker    name = "riscv64_elf_clang",
249*5225e6b1SAndroid Build Coastguard Worker    exec_compatible_with = ["@platforms//os:linux"],
250*5225e6b1SAndroid Build Coastguard Worker    target_compatible_with = elf_riscv64_constraint_values,
251*5225e6b1SAndroid Build Coastguard Worker    toolchain = ":riscv64_elf_clang_cc_toolchain",
252*5225e6b1SAndroid Build Coastguard Worker    toolchain_type = "@bazel_tools//tools/cpp:toolchain_type",
253*5225e6b1SAndroid Build Coastguard Worker)
254*5225e6b1SAndroid Build Coastguard Worker
255*5225e6b1SAndroid Build Coastguard Worker# Rust toolchains
256*5225e6b1SAndroid Build Coastguard Worker
257*5225e6b1SAndroid Build Coastguard Worker# An empty rust std file group used as placeholder when building rust sysroot.
258*5225e6b1SAndroid Build Coastguard Workerrust_stdlib_filegroup(
259*5225e6b1SAndroid Build Coastguard Worker    name = "rust_stdlib_empty",
260*5225e6b1SAndroid Build Coastguard Worker    srcs = [],
261*5225e6b1SAndroid Build Coastguard Worker)
262*5225e6b1SAndroid Build Coastguard Worker
263*5225e6b1SAndroid Build Coastguard Worker# A rule for building sysroot from source.
264*5225e6b1SAndroid Build Coastguard Workerbuild_with_no_rust_sysroot(
265*5225e6b1SAndroid Build Coastguard Worker    name = "rust_sysroot_source_build",
266*5225e6b1SAndroid Build Coastguard Worker    deps = [
267*5225e6b1SAndroid Build Coastguard Worker        "@rust_prebuilts//:liballoc",
268*5225e6b1SAndroid Build Coastguard Worker        "@rust_prebuilts//:libcompiler_builtins",
269*5225e6b1SAndroid Build Coastguard Worker        "@rust_prebuilts//:libcore",
270*5225e6b1SAndroid Build Coastguard Worker    ],
271*5225e6b1SAndroid Build Coastguard Worker)
272*5225e6b1SAndroid Build Coastguard Worker
273*5225e6b1SAndroid Build Coastguard Workerrust_stdlib_filegroup(
274*5225e6b1SAndroid Build Coastguard Worker    name = "rust_std_source_build",
275*5225e6b1SAndroid Build Coastguard Worker    srcs = [":rust_sysroot_source_build"],
276*5225e6b1SAndroid Build Coastguard Worker)
277*5225e6b1SAndroid Build Coastguard Worker
278*5225e6b1SAndroid Build Coastguard Workercommon_lint_opts = [
279*5225e6b1SAndroid Build Coastguard Worker    "-A",
280*5225e6b1SAndroid Build Coastguard Worker    "deprecated",
281*5225e6b1SAndroid Build Coastguard Worker    # external/rust/crates/spin doesn't pass this lint check and there is not a way to make an
282*5225e6b1SAndroid Build Coastguard Worker    # exemption. Disable it until upstream is fixed or we figure out a workaround.
283*5225e6b1SAndroid Build Coastguard Worker    #"-D",
284*5225e6b1SAndroid Build Coastguard Worker    #"unsafe_op_in_unsafe_fn",
285*5225e6b1SAndroid Build Coastguard Worker    "-D",
286*5225e6b1SAndroid Build Coastguard Worker    "warnings",
287*5225e6b1SAndroid Build Coastguard Worker    "-D",
288*5225e6b1SAndroid Build Coastguard Worker    "clippy::undocumented_unsafe_blocks",
289*5225e6b1SAndroid Build Coastguard Worker    "-D",
290*5225e6b1SAndroid Build Coastguard Worker    "clippy::too-many-arguments",
291*5225e6b1SAndroid Build Coastguard Worker]
292*5225e6b1SAndroid Build Coastguard Worker
293*5225e6b1SAndroid Build Coastguard Worker# Linux x86_64 Host toolchain
294*5225e6b1SAndroid Build Coastguard Workerrust_toolchain(
295*5225e6b1SAndroid Build Coastguard Worker    name = "x86_64_unknown_linux_gnu",
296*5225e6b1SAndroid Build Coastguard Worker    allocator_library = None,
297*5225e6b1SAndroid Build Coastguard Worker    binary_ext = "",
298*5225e6b1SAndroid Build Coastguard Worker    default_edition = "2021",
299*5225e6b1SAndroid Build Coastguard Worker    dylib_ext = ".so",
300*5225e6b1SAndroid Build Coastguard Worker    exec_triple = "x86_64-unknown-linux-gnu",
301*5225e6b1SAndroid Build Coastguard Worker    global_allocator_library = None,
302*5225e6b1SAndroid Build Coastguard Worker    rust_doc = "@rust_prebuilts//:bin/rustdoc",
303*5225e6b1SAndroid Build Coastguard Worker    rust_std = "@rust_prebuilts//:prebuilt_stdlibs",
304*5225e6b1SAndroid Build Coastguard Worker    rustc = "@rust_prebuilts//:bin/rustc",
305*5225e6b1SAndroid Build Coastguard Worker    staticlib_ext = ".a",
306*5225e6b1SAndroid Build Coastguard Worker    stdlib_linkflags = [],
307*5225e6b1SAndroid Build Coastguard Worker    target_triple = "x86_64-unknown-linux-gnu",
308*5225e6b1SAndroid Build Coastguard Worker)
309*5225e6b1SAndroid Build Coastguard Worker
310*5225e6b1SAndroid Build Coastguard Workertoolchain(
311*5225e6b1SAndroid Build Coastguard Worker    name = "x86_64_unknown_linux_gnu_toolchain",
312*5225e6b1SAndroid Build Coastguard Worker    exec_compatible_with = ["@platforms//os:linux"],
313*5225e6b1SAndroid Build Coastguard Worker    target_settings = [":gbl_rust_host_x86_64"],
314*5225e6b1SAndroid Build Coastguard Worker    toolchain = ":x86_64_unknown_linux_gnu",
315*5225e6b1SAndroid Build Coastguard Worker    toolchain_type = "@rules_rust//rust:toolchain",
316*5225e6b1SAndroid Build Coastguard Worker)
317*5225e6b1SAndroid Build Coastguard Worker
318*5225e6b1SAndroid Build Coastguard Worker# x86_64 UEFI toolchain
319*5225e6b1SAndroid Build Coastguard Workerrust_toolchain(
320*5225e6b1SAndroid Build Coastguard Worker    name = "x86_64-unknown-uefi",
321*5225e6b1SAndroid Build Coastguard Worker    allocator_library = None,
322*5225e6b1SAndroid Build Coastguard Worker    binary_ext = ".efi",
323*5225e6b1SAndroid Build Coastguard Worker    default_edition = "2021",
324*5225e6b1SAndroid Build Coastguard Worker    dylib_ext = ".so",
325*5225e6b1SAndroid Build Coastguard Worker    exec_triple = "x86_64-unknown-linux-gnu",
326*5225e6b1SAndroid Build Coastguard Worker    extra_rustc_flags = common_lint_opts + [
327*5225e6b1SAndroid Build Coastguard Worker        # The linker options generated by rustc assumes `lld` as the linker. For windows platforms,
328*5225e6b1SAndroid Build Coastguard Worker        # the lld args style is different than that of clang++, i.e. for library search path, lld
329*5225e6b1SAndroid Build Coastguard Worker        # uses "/L<path>" while clang++ uses "-L<path>". Thus we need to use lld directly instead
330*5225e6b1SAndroid Build Coastguard Worker        # of `clang++`.
331*5225e6b1SAndroid Build Coastguard Worker        "--codegen=linker={}".format(gbl_llvm_tool_path("lld")),
332*5225e6b1SAndroid Build Coastguard Worker        # Disable default sysroot. We'll pass sysroot explicitly via the `rust_std` field below.
333*5225e6b1SAndroid Build Coastguard Worker        "--sysroot",
334*5225e6b1SAndroid Build Coastguard Worker        "/dev/null",
335*5225e6b1SAndroid Build Coastguard Worker    ],
336*5225e6b1SAndroid Build Coastguard Worker    global_allocator_library = None,
337*5225e6b1SAndroid Build Coastguard Worker    rust_doc = "@rust_prebuilts//:bin/rustdoc",
338*5225e6b1SAndroid Build Coastguard Worker    rust_std = "@rust_prebuilts//:x86_64-unknown-uefi_prebuilt_stdlibs",
339*5225e6b1SAndroid Build Coastguard Worker    rustc = "@rust_prebuilts//:bin/rustc",
340*5225e6b1SAndroid Build Coastguard Worker    staticlib_ext = ".a",
341*5225e6b1SAndroid Build Coastguard Worker    stdlib_linkflags = [],
342*5225e6b1SAndroid Build Coastguard Worker    target_triple = "x86_64-unknown-uefi",
343*5225e6b1SAndroid Build Coastguard Worker)
344*5225e6b1SAndroid Build Coastguard Worker
345*5225e6b1SAndroid Build Coastguard Workertoolchain(
346*5225e6b1SAndroid Build Coastguard Worker    name = "x86_64-unknown-uefi_toolchain",
347*5225e6b1SAndroid Build Coastguard Worker    exec_compatible_with = ["@platforms//os:linux"],
348*5225e6b1SAndroid Build Coastguard Worker    target_settings = [":gbl_rust_uefi_x86_64"],
349*5225e6b1SAndroid Build Coastguard Worker    toolchain = ":x86_64-unknown-uefi",
350*5225e6b1SAndroid Build Coastguard Worker    toolchain_type = "@rules_rust//rust:toolchain",
351*5225e6b1SAndroid Build Coastguard Worker)
352*5225e6b1SAndroid Build Coastguard Worker
353*5225e6b1SAndroid Build Coastguard Worker# i686 UEFI toolchain
354*5225e6b1SAndroid Build Coastguard Workerrust_toolchain(
355*5225e6b1SAndroid Build Coastguard Worker    name = "i686-unknown-uefi",
356*5225e6b1SAndroid Build Coastguard Worker    allocator_library = None,
357*5225e6b1SAndroid Build Coastguard Worker    binary_ext = ".efi",
358*5225e6b1SAndroid Build Coastguard Worker    default_edition = "2021",
359*5225e6b1SAndroid Build Coastguard Worker    dylib_ext = ".so",
360*5225e6b1SAndroid Build Coastguard Worker    exec_triple = "x86_64-unknown-linux-gnu",
361*5225e6b1SAndroid Build Coastguard Worker    extra_rustc_flags = common_lint_opts + [
362*5225e6b1SAndroid Build Coastguard Worker        "--codegen=linker={}".format(gbl_llvm_tool_path("lld")),
363*5225e6b1SAndroid Build Coastguard Worker        # Disable default sysroot. We'll pass sysroot explicitly via the `rust_std` field below.
364*5225e6b1SAndroid Build Coastguard Worker        "--sysroot",
365*5225e6b1SAndroid Build Coastguard Worker        "/dev/null",
366*5225e6b1SAndroid Build Coastguard Worker    ],
367*5225e6b1SAndroid Build Coastguard Worker    global_allocator_library = None,
368*5225e6b1SAndroid Build Coastguard Worker    rust_doc = "@rust_prebuilts//:bin/rustdoc",
369*5225e6b1SAndroid Build Coastguard Worker    # Need to use our own sysroot because we have a custom patch that needs to be applied for std
370*5225e6b1SAndroid Build Coastguard Worker    # in order to enable compiler builtin for chkstk(), alloca(). Once the fix is upstreamed, we
371*5225e6b1SAndroid Build Coastguard Worker    # can use the prebuilt.
372*5225e6b1SAndroid Build Coastguard Worker    rust_std = select({
373*5225e6b1SAndroid Build Coastguard Worker        ":rust_no_sysroot_true": ":rust_stdlib_empty",
374*5225e6b1SAndroid Build Coastguard Worker        "//conditions:default": ":rust_std_source_build",
375*5225e6b1SAndroid Build Coastguard Worker    }),
376*5225e6b1SAndroid Build Coastguard Worker    #rust_std = "@rust_prebuilts//:i686-unknown-uefi_prebuilt_stdlibs",
377*5225e6b1SAndroid Build Coastguard Worker    rustc = "@rust_prebuilts//:bin/rustc",
378*5225e6b1SAndroid Build Coastguard Worker    staticlib_ext = ".a",
379*5225e6b1SAndroid Build Coastguard Worker    stdlib_linkflags = [],
380*5225e6b1SAndroid Build Coastguard Worker    target_triple = "i686-unknown-uefi",
381*5225e6b1SAndroid Build Coastguard Worker)
382*5225e6b1SAndroid Build Coastguard Worker
383*5225e6b1SAndroid Build Coastguard Workertoolchain(
384*5225e6b1SAndroid Build Coastguard Worker    name = "i686-unknown-uefi_toolchain",
385*5225e6b1SAndroid Build Coastguard Worker    exec_compatible_with = ["@platforms//os:linux"],
386*5225e6b1SAndroid Build Coastguard Worker    target_settings = [":gbl_rust_uefi_x86_32"],
387*5225e6b1SAndroid Build Coastguard Worker    toolchain = ":i686-unknown-uefi",
388*5225e6b1SAndroid Build Coastguard Worker    toolchain_type = "@rules_rust//rust:toolchain",
389*5225e6b1SAndroid Build Coastguard Worker)
390*5225e6b1SAndroid Build Coastguard Worker
391*5225e6b1SAndroid Build Coastguard Worker# aarch64 UEFI toolchain
392*5225e6b1SAndroid Build Coastguard Workerrust_toolchain(
393*5225e6b1SAndroid Build Coastguard Worker    name = "aarch64-unknown-uefi",
394*5225e6b1SAndroid Build Coastguard Worker    allocator_library = None,
395*5225e6b1SAndroid Build Coastguard Worker    binary_ext = ".efi",
396*5225e6b1SAndroid Build Coastguard Worker    default_edition = "2021",
397*5225e6b1SAndroid Build Coastguard Worker    dylib_ext = ".so",
398*5225e6b1SAndroid Build Coastguard Worker    exec_triple = "x86_64-unknown-linux-gnu",
399*5225e6b1SAndroid Build Coastguard Worker    extra_rustc_flags = common_lint_opts + [
400*5225e6b1SAndroid Build Coastguard Worker        "--codegen=linker={}".format(gbl_llvm_tool_path("lld")),
401*5225e6b1SAndroid Build Coastguard Worker        # Disable default sysroot. We'll pass sysroot explicitly via the `rust_std` field below.
402*5225e6b1SAndroid Build Coastguard Worker        "--sysroot",
403*5225e6b1SAndroid Build Coastguard Worker        "/dev/null",
404*5225e6b1SAndroid Build Coastguard Worker    ],
405*5225e6b1SAndroid Build Coastguard Worker    global_allocator_library = None,
406*5225e6b1SAndroid Build Coastguard Worker    rust_doc = "@rust_prebuilts//:bin/rustdoc",
407*5225e6b1SAndroid Build Coastguard Worker    rust_std = "@rust_prebuilts//:aarch64-unknown-uefi_prebuilt_stdlibs",
408*5225e6b1SAndroid Build Coastguard Worker    rustc = "@rust_prebuilts//:bin/rustc",
409*5225e6b1SAndroid Build Coastguard Worker    staticlib_ext = ".a",
410*5225e6b1SAndroid Build Coastguard Worker    stdlib_linkflags = [],
411*5225e6b1SAndroid Build Coastguard Worker    target_triple = "aarch64-unknown-uefi",
412*5225e6b1SAndroid Build Coastguard Worker)
413*5225e6b1SAndroid Build Coastguard Worker
414*5225e6b1SAndroid Build Coastguard Workertoolchain(
415*5225e6b1SAndroid Build Coastguard Worker    name = "aarch64-unknown-uefi_toolchain",
416*5225e6b1SAndroid Build Coastguard Worker    exec_compatible_with = ["@platforms//os:linux"],
417*5225e6b1SAndroid Build Coastguard Worker    target_settings = [":gbl_rust_uefi_aarch64"],
418*5225e6b1SAndroid Build Coastguard Worker    toolchain = ":aarch64-unknown-uefi",
419*5225e6b1SAndroid Build Coastguard Worker    toolchain_type = "@rules_rust//rust:toolchain",
420*5225e6b1SAndroid Build Coastguard Worker)
421*5225e6b1SAndroid Build Coastguard Worker
422*5225e6b1SAndroid Build Coastguard Worker# riscv64 PIE ELF toolchain
423*5225e6b1SAndroid Build Coastguard Workerrust_toolchain(
424*5225e6b1SAndroid Build Coastguard Worker    name = "riscv64gc-unknown-none-pie_elf",
425*5225e6b1SAndroid Build Coastguard Worker    allocator_library = None,
426*5225e6b1SAndroid Build Coastguard Worker    binary_ext = "",
427*5225e6b1SAndroid Build Coastguard Worker    default_edition = "2021",
428*5225e6b1SAndroid Build Coastguard Worker    dylib_ext = ".so",
429*5225e6b1SAndroid Build Coastguard Worker    exec_triple = "x86_64-unknown-linux-gnu",
430*5225e6b1SAndroid Build Coastguard Worker    extra_rustc_flags = common_lint_opts + [
431*5225e6b1SAndroid Build Coastguard Worker        "--codegen=linker={}".format(gbl_llvm_tool_path("lld")),
432*5225e6b1SAndroid Build Coastguard Worker        # Disable default sysroot. We'll pass sysroot explicitly via the `rust_std` field below.
433*5225e6b1SAndroid Build Coastguard Worker        "--sysroot",
434*5225e6b1SAndroid Build Coastguard Worker        "/dev/null",
435*5225e6b1SAndroid Build Coastguard Worker    ],
436*5225e6b1SAndroid Build Coastguard Worker    global_allocator_library = None,
437*5225e6b1SAndroid Build Coastguard Worker    rust_doc = "@rust_prebuilts//:bin/rustdoc",
438*5225e6b1SAndroid Build Coastguard Worker    # Need to use our own built sysroot because we are using a custom spec below.
439*5225e6b1SAndroid Build Coastguard Worker    rust_std = select({
440*5225e6b1SAndroid Build Coastguard Worker        ":rust_no_sysroot_true": ":rust_stdlib_empty",
441*5225e6b1SAndroid Build Coastguard Worker        "//conditions:default": ":rust_std_source_build",
442*5225e6b1SAndroid Build Coastguard Worker    }),
443*5225e6b1SAndroid Build Coastguard Worker    rustc = "@rust_prebuilts//:bin/rustc",
444*5225e6b1SAndroid Build Coastguard Worker    staticlib_ext = ".a",
445*5225e6b1SAndroid Build Coastguard Worker    stdlib_linkflags = [],
446*5225e6b1SAndroid Build Coastguard Worker    # The custom spec is based on builtin target "riscv64gc-unknown-none-elf" but with the
447*5225e6b1SAndroid Build Coastguard Worker    # following changes for enabling PIE:
448*5225e6b1SAndroid Build Coastguard Worker    #
449*5225e6b1SAndroid Build Coastguard Worker    #   1. "relocation-model" config entry changed from "static" to "pic".
450*5225e6b1SAndroid Build Coastguard Worker    #   2. Added "position-independent-executables": true.
451*5225e6b1SAndroid Build Coastguard Worker    #
452*5225e6b1SAndroid Build Coastguard Worker    # The original spec can be obtained by:
453*5225e6b1SAndroid Build Coastguard Worker    #
454*5225e6b1SAndroid Build Coastguard Worker    #   rustc +nightly -Z unstable-options --print target-spec-json \
455*5225e6b1SAndroid Build Coastguard Worker    #     --target riscv64gc-unknown-none-elf
456*5225e6b1SAndroid Build Coastguard Worker    target_json = """
457*5225e6b1SAndroid Build Coastguard Worker                {
458*5225e6b1SAndroid Build Coastguard Worker                    "arch": "riscv64",
459*5225e6b1SAndroid Build Coastguard Worker                    "code-model": "medium",
460*5225e6b1SAndroid Build Coastguard Worker                    "cpu": "generic-rv64",
461*5225e6b1SAndroid Build Coastguard Worker                    "data-layout": "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128",
462*5225e6b1SAndroid Build Coastguard Worker                    "eh-frame-header": false,
463*5225e6b1SAndroid Build Coastguard Worker                    "emit-debug-gdb-scripts": false,
464*5225e6b1SAndroid Build Coastguard Worker                    "features": "+m,+a,+f,+d,+c",
465*5225e6b1SAndroid Build Coastguard Worker                    "is-builtin": false,
466*5225e6b1SAndroid Build Coastguard Worker                    "linker": "rust-lld",
467*5225e6b1SAndroid Build Coastguard Worker                    "linker-flavor": "ld.lld",
468*5225e6b1SAndroid Build Coastguard Worker                    "llvm-abiname": "lp64d",
469*5225e6b1SAndroid Build Coastguard Worker                    "llvm-target": "riscv64-unknown-linux",
470*5225e6b1SAndroid Build Coastguard Worker                    "max-atomic-width": 64,
471*5225e6b1SAndroid Build Coastguard Worker                    "os": "none",
472*5225e6b1SAndroid Build Coastguard Worker                    "panic-strategy": "abort",
473*5225e6b1SAndroid Build Coastguard Worker                    "relocation-model": "pic",
474*5225e6b1SAndroid Build Coastguard Worker                    "position-independent-executables": true,
475*5225e6b1SAndroid Build Coastguard Worker                    "supported-sanitizers": [
476*5225e6b1SAndroid Build Coastguard Worker                        "kernel-address"
477*5225e6b1SAndroid Build Coastguard Worker                    ],
478*5225e6b1SAndroid Build Coastguard Worker                    "target-pointer-width": "64"
479*5225e6b1SAndroid Build Coastguard Worker                }
480*5225e6b1SAndroid Build Coastguard Worker""",
481*5225e6b1SAndroid Build Coastguard Worker)
482*5225e6b1SAndroid Build Coastguard Worker
483*5225e6b1SAndroid Build Coastguard Workertoolchain(
484*5225e6b1SAndroid Build Coastguard Worker    name = "riscv64gc-unknown-none-pie_elf_toolchain",
485*5225e6b1SAndroid Build Coastguard Worker    exec_compatible_with = ["@platforms//os:linux"],
486*5225e6b1SAndroid Build Coastguard Worker    target_settings = ["@gbl//toolchain:gbl_rust_elf_riscv64"],
487*5225e6b1SAndroid Build Coastguard Worker    toolchain = ":riscv64gc-unknown-none-pie_elf",
488*5225e6b1SAndroid Build Coastguard Worker    toolchain_type = "@rules_rust//rust:toolchain",
489*5225e6b1SAndroid Build Coastguard Worker)
490*5225e6b1SAndroid Build Coastguard Worker
491*5225e6b1SAndroid Build Coastguard Worker# rustfmt toolchain
492*5225e6b1SAndroid Build Coastguard Workerrustfmt_toolchain(
493*5225e6b1SAndroid Build Coastguard Worker    name = "rustfmt",
494*5225e6b1SAndroid Build Coastguard Worker    rustfmt = "@rust_prebuilts//:bin/rustfmt",
495*5225e6b1SAndroid Build Coastguard Worker)
496*5225e6b1SAndroid Build Coastguard Worker
497*5225e6b1SAndroid Build Coastguard Workertoolchain(
498*5225e6b1SAndroid Build Coastguard Worker    name = "rustfmt_toolchain",
499*5225e6b1SAndroid Build Coastguard Worker    exec_compatible_with = ["@platforms//os:linux"],
500*5225e6b1SAndroid Build Coastguard Worker    toolchain = ":rustfmt",
501*5225e6b1SAndroid Build Coastguard Worker    toolchain_type = "@rules_rust//rust/rustfmt:toolchain_type",
502*5225e6b1SAndroid Build Coastguard Worker)
503*5225e6b1SAndroid Build Coastguard Worker
504*5225e6b1SAndroid Build Coastguard Worker# Rust bindgen toolchain
505*5225e6b1SAndroid Build Coastguard Worker
506*5225e6b1SAndroid Build Coastguard Workerprebuilt_binary(
507*5225e6b1SAndroid Build Coastguard Worker    name = "bindgen_prebuilt",
508*5225e6b1SAndroid Build Coastguard Worker    bin = "@bindgen//:bindgen",
509*5225e6b1SAndroid Build Coastguard Worker)
510*5225e6b1SAndroid Build Coastguard Worker
511*5225e6b1SAndroid Build Coastguard Workerrust_bindgen_toolchain(
512*5225e6b1SAndroid Build Coastguard Worker    name = "bindgen_toolchain_impl",
513*5225e6b1SAndroid Build Coastguard Worker    bindgen = ":bindgen_prebuilt",
514*5225e6b1SAndroid Build Coastguard Worker    clang = "@gbl_llvm_prebuilts//:clang-bin",
515*5225e6b1SAndroid Build Coastguard Worker    libclang = "@gbl_llvm_prebuilts//:libclang",
516*5225e6b1SAndroid Build Coastguard Worker    libstdcxx = "@gbl_llvm_prebuilts//:libc++",
517*5225e6b1SAndroid Build Coastguard Worker)
518*5225e6b1SAndroid Build Coastguard Worker
519*5225e6b1SAndroid Build Coastguard Workertoolchain(
520*5225e6b1SAndroid Build Coastguard Worker    name = "bindgen_toolchain",
521*5225e6b1SAndroid Build Coastguard Worker    toolchain = "bindgen_toolchain_impl",
522*5225e6b1SAndroid Build Coastguard Worker    toolchain_type = "@rules_rust//bindgen:toolchain_type",
523*5225e6b1SAndroid Build Coastguard Worker)
524