blob: 760834929610b772164c7e6688b999c237641290 [file] [log] [blame]
Ivan Lozanoffee3342019-08-27 12:03:00 -07001// Copyright 2019 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
15package config
16
17import (
18 "strings"
19
20 "android/soong/android"
21)
22
23var (
Jeff Vander Stoep6e97a7b2020-07-15 21:34:45 +020024 LinuxRustFlags = []string{}
Colin Crosse32f0932022-01-23 20:48:36 -080025 LinuxMuslRustFlags = []string{
26 // disable rustc's builtin fallbacks for crt objects
27 "-C link_self_contained=no",
28 // force rustc to use a dynamic musl libc
29 "-C target-feature=-crt-static",
30 "-Z link-native-libraries=no",
31 }
Jeff Vander Stoep6e97a7b2020-07-15 21:34:45 +020032 LinuxRustLinkFlags = []string{
ThiƩbaud Weksteen682c9d72020-08-31 10:06:16 +020033 "-B${cc_config.ClangBin}",
Jeff Vander Stoep6e97a7b2020-07-15 21:34:45 +020034 "-fuse-ld=lld",
Ivan Lozano6d45a982020-09-09 09:08:44 -040035 "-Wl,--undefined-version",
Colin Crosse32f0932022-01-23 20:48:36 -080036 }
37 LinuxRustGlibcLinkFlags = []string{
Colin Cross748c8c72021-09-10 09:55:54 -070038 "--sysroot ${cc_config.LinuxGccRoot}/sysroot",
Jeff Vander Stoep6e97a7b2020-07-15 21:34:45 +020039 }
Colin Crosse32f0932022-01-23 20:48:36 -080040 LinuxRustMuslLinkFlags = []string{
41 "--sysroot /dev/null",
42 "-nodefaultlibs",
43 "-nostdlib",
44 "-Wl,--no-dynamic-linker",
45 // for unwind
46 "-lgcc", "-lgcc_eh",
47 }
Ivan Lozanoffee3342019-08-27 12:03:00 -070048 linuxX86Rustflags = []string{}
49 linuxX86Linkflags = []string{}
50 linuxX8664Rustflags = []string{}
51 linuxX8664Linkflags = []string{}
52)
53
54func init() {
Colin Crosse32f0932022-01-23 20:48:36 -080055 registerToolchainFactory(android.Linux, android.X86_64, linuxGlibcX8664ToolchainFactory)
56 registerToolchainFactory(android.Linux, android.X86, linuxGlibcX86ToolchainFactory)
Ivan Lozanoffee3342019-08-27 12:03:00 -070057
Colin Crosse32f0932022-01-23 20:48:36 -080058 registerToolchainFactory(android.LinuxMusl, android.X86_64, linuxMuslX8664ToolchainFactory)
59 registerToolchainFactory(android.LinuxMusl, android.X86, linuxMuslX86ToolchainFactory)
Colin Cross528d67e2021-07-23 22:23:07 +000060
Ivan Lozanoffee3342019-08-27 12:03:00 -070061 pctx.StaticVariable("LinuxToolchainRustFlags", strings.Join(LinuxRustFlags, " "))
Colin Crosse32f0932022-01-23 20:48:36 -080062 pctx.StaticVariable("LinuxMuslToolchainRustFlags", strings.Join(LinuxMuslRustFlags, " "))
Ivan Lozanoffee3342019-08-27 12:03:00 -070063 pctx.StaticVariable("LinuxToolchainLinkFlags", strings.Join(LinuxRustLinkFlags, " "))
Colin Crosse32f0932022-01-23 20:48:36 -080064 pctx.StaticVariable("LinuxGlibcToolchainLinkFlags", strings.Join(LinuxRustGlibcLinkFlags, " "))
65 pctx.StaticVariable("LinuxMuslToolchainLinkFlags", strings.Join(LinuxRustMuslLinkFlags, " "))
Ivan Lozanoffee3342019-08-27 12:03:00 -070066 pctx.StaticVariable("LinuxToolchainX86RustFlags", strings.Join(linuxX86Rustflags, " "))
67 pctx.StaticVariable("LinuxToolchainX86LinkFlags", strings.Join(linuxX86Linkflags, " "))
68 pctx.StaticVariable("LinuxToolchainX8664RustFlags", strings.Join(linuxX8664Rustflags, " "))
69 pctx.StaticVariable("LinuxToolchainX8664LinkFlags", strings.Join(linuxX8664Linkflags, " "))
70
71}
72
Colin Crosse32f0932022-01-23 20:48:36 -080073// Base 64-bit linux rust toolchain
Ivan Lozanoffee3342019-08-27 12:03:00 -070074type toolchainLinuxX8664 struct {
75 toolchain64Bit
Ivan Lozanoffee3342019-08-27 12:03:00 -070076}
77
78func (toolchainLinuxX8664) Supported() bool {
79 return true
80}
81
Ivan Lozanof1c84332019-09-20 11:00:37 -070082func (toolchainLinuxX8664) Bionic() bool {
83 return false
84}
85
Ivan Lozanoffee3342019-08-27 12:03:00 -070086func (t *toolchainLinuxX8664) Name() string {
87 return "x86_64"
88}
89
Ivan Lozanoffee3342019-08-27 12:03:00 -070090func (t *toolchainLinuxX8664) ToolchainLinkFlags() string {
Ivan Lozano6d45a982020-09-09 09:08:44 -040091 // Prepend the lld flags from cc_config so we stay in sync with cc
Colin Cross0523ba22021-07-14 18:45:05 -070092 return "${cc_config.LinuxLldflags} ${cc_config.LinuxX8664Lldflags} " +
Ivan Lozano6d45a982020-09-09 09:08:44 -040093 "${config.LinuxToolchainLinkFlags} ${config.LinuxToolchainX8664LinkFlags}"
Ivan Lozanoffee3342019-08-27 12:03:00 -070094}
95
96func (t *toolchainLinuxX8664) ToolchainRustFlags() string {
97 return "${config.LinuxToolchainRustFlags} ${config.LinuxToolchainX8664RustFlags}"
98}
99
Colin Crosse32f0932022-01-23 20:48:36 -0800100// Specialization of the 64-bit linux rust toolchain for glibc. Adds the gnu rust triple and
101// sysroot linker flags.
102type toolchainLinuxGlibcX8664 struct {
103 toolchainLinuxX8664
104}
105
106func (t *toolchainLinuxX8664) RustTriple() string {
107 return "x86_64-unknown-linux-gnu"
108}
109
110func (t *toolchainLinuxGlibcX8664) ToolchainLinkFlags() string {
111 return t.toolchainLinuxX8664.ToolchainLinkFlags() + " " + "${config.LinuxGlibcToolchainLinkFlags}"
112}
113
114func linuxGlibcX8664ToolchainFactory(arch android.Arch) Toolchain {
115 return toolchainLinuxGlibcX8664Singleton
116}
117
118// Specialization of the 64-bit linux rust toolchain for musl. Adds the musl rust triple and
119// linker flags to avoid using the host sysroot.
120type toolchainLinuxMuslX8664 struct {
121 toolchainLinuxX8664
122}
123
124func (t *toolchainLinuxMuslX8664) RustTriple() string {
125 return "x86_64-unknown-linux-musl"
126}
127
128func (t *toolchainLinuxMuslX8664) ToolchainLinkFlags() string {
129 return t.toolchainLinuxX8664.ToolchainLinkFlags() + " " + "${config.LinuxMuslToolchainLinkFlags}"
130}
131
132func (t *toolchainLinuxMuslX8664) ToolchainRustFlags() string {
133 return t.toolchainLinuxX8664.ToolchainRustFlags() + " " + "${config.LinuxMuslToolchainRustFlags}"
134}
135
136func linuxMuslX8664ToolchainFactory(arch android.Arch) Toolchain {
137 return toolchainLinuxMuslX8664Singleton
138}
139
140// Base 32-bit linux rust toolchain
141type toolchainLinuxX86 struct {
142 toolchain32Bit
Ivan Lozanoffee3342019-08-27 12:03:00 -0700143}
144
145func (toolchainLinuxX86) Supported() bool {
146 return true
147}
148
Ivan Lozanof1c84332019-09-20 11:00:37 -0700149func (toolchainLinuxX86) Bionic() bool {
150 return false
151}
152
Ivan Lozanoffee3342019-08-27 12:03:00 -0700153func (t *toolchainLinuxX86) Name() string {
154 return "x86"
155}
156
Ivan Lozano6cd99e62020-02-11 08:24:25 -0500157func (toolchainLinuxX86) LibclangRuntimeLibraryArch() string {
158 return "i386"
159}
160
161func (toolchainLinuxX8664) LibclangRuntimeLibraryArch() string {
162 return "x86_64"
163}
164
Ivan Lozanoffee3342019-08-27 12:03:00 -0700165func (t *toolchainLinuxX86) ToolchainLinkFlags() string {
Ivan Lozano6d45a982020-09-09 09:08:44 -0400166 // Prepend the lld flags from cc_config so we stay in sync with cc
Colin Cross0523ba22021-07-14 18:45:05 -0700167 return "${cc_config.LinuxLldflags} ${cc_config.LinuxX86Lldflags} " +
Ivan Lozano6d45a982020-09-09 09:08:44 -0400168 "${config.LinuxToolchainLinkFlags} ${config.LinuxToolchainX86LinkFlags}"
Ivan Lozanoffee3342019-08-27 12:03:00 -0700169}
170
171func (t *toolchainLinuxX86) ToolchainRustFlags() string {
172 return "${config.LinuxToolchainRustFlags} ${config.LinuxToolchainX86RustFlags}"
173}
174
Colin Crosse32f0932022-01-23 20:48:36 -0800175// Specialization of the 32-bit linux rust toolchain for glibc. Adds the gnu rust triple and
176// sysroot linker flags.
177type toolchainLinuxGlibcX86 struct {
178 toolchainLinuxX86
Ivan Lozanoffee3342019-08-27 12:03:00 -0700179}
180
Colin Crosse32f0932022-01-23 20:48:36 -0800181func (t *toolchainLinuxGlibcX86) RustTriple() string {
182 return "i686-unknown-linux-gnu"
183}
184
185func (t *toolchainLinuxGlibcX86) ToolchainLinkFlags() string {
186 return t.toolchainLinuxX86.ToolchainLinkFlags() + " " + "${config.LinuxGlibcToolchainLinkFlags}"
187}
188
189func linuxGlibcX86ToolchainFactory(arch android.Arch) Toolchain {
190 return toolchainLinuxGlibcX86Singleton
191}
192
193// Specialization of the 32-bit linux rust toolchain for musl. Adds the musl rust triple and
194// linker flags to avoid using the host sysroot.
195type toolchainLinuxMuslX86 struct {
196 toolchainLinuxX86
197}
198
199func (t *toolchainLinuxMuslX86) RustTriple() string {
200 return "i686-unknown-linux-musl"
201}
202
203func (t *toolchainLinuxMuslX86) ToolchainLinkFlags() string {
204 return t.toolchainLinuxX86.ToolchainLinkFlags() + " " + "${config.LinuxMuslToolchainLinkFlags}"
205}
206
207func (t *toolchainLinuxMuslX86) ToolchainRustFlags() string {
208 return t.toolchainLinuxX86.ToolchainRustFlags() + " " + "${config.LinuxMuslToolchainRustFlags}"
209}
210
211func linuxMuslX86ToolchainFactory(arch android.Arch) Toolchain {
212 return toolchainLinuxMuslX86Singleton
213}
214
215var toolchainLinuxGlibcX8664Singleton Toolchain = &toolchainLinuxGlibcX8664{}
216var toolchainLinuxGlibcX86Singleton Toolchain = &toolchainLinuxGlibcX86{}
217var toolchainLinuxMuslX8664Singleton Toolchain = &toolchainLinuxMuslX8664{}
218var toolchainLinuxMuslX86Singleton Toolchain = &toolchainLinuxMuslX86{}