1// 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 (
24	LinuxRustFlags     = []string{}
25	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	}
32	LinuxRustLinkFlags = []string{
33		"-B${cc_config.ClangBin}",
34		"-fuse-ld=lld",
35		"-Wl,--undefined-version",
36	}
37	LinuxRustGlibcLinkFlags = []string{
38		"--sysroot ${cc_config.LinuxGccRoot}/sysroot",
39	}
40	LinuxRustMuslLinkFlags = []string{
41		"--sysroot /dev/null",
42		"-nodefaultlibs",
43		"-nostdlib",
44		"-Wl,--no-dynamic-linker",
45	}
46	linuxX86Rustflags   = []string{}
47	linuxX86Linkflags   = []string{}
48	linuxX8664Rustflags = []string{}
49	linuxX8664Linkflags = []string{}
50)
51
52func init() {
53	registerToolchainFactory(android.Linux, android.X86_64, linuxGlibcX8664ToolchainFactory)
54	registerToolchainFactory(android.Linux, android.X86, linuxGlibcX86ToolchainFactory)
55
56	registerToolchainFactory(android.LinuxMusl, android.X86_64, linuxMuslX8664ToolchainFactory)
57	registerToolchainFactory(android.LinuxMusl, android.X86, linuxMuslX86ToolchainFactory)
58
59	pctx.StaticVariable("LinuxToolchainRustFlags", strings.Join(LinuxRustFlags, " "))
60	pctx.StaticVariable("LinuxMuslToolchainRustFlags", strings.Join(LinuxMuslRustFlags, " "))
61	pctx.StaticVariable("LinuxToolchainLinkFlags", strings.Join(LinuxRustLinkFlags, " "))
62	pctx.StaticVariable("LinuxGlibcToolchainLinkFlags", strings.Join(LinuxRustGlibcLinkFlags, " "))
63	pctx.StaticVariable("LinuxMuslToolchainLinkFlags", strings.Join(LinuxRustMuslLinkFlags, " "))
64	pctx.StaticVariable("LinuxToolchainX86RustFlags", strings.Join(linuxX86Rustflags, " "))
65	pctx.StaticVariable("LinuxToolchainX86LinkFlags", strings.Join(linuxX86Linkflags, " "))
66	pctx.StaticVariable("LinuxToolchainX8664RustFlags", strings.Join(linuxX8664Rustflags, " "))
67	pctx.StaticVariable("LinuxToolchainX8664LinkFlags", strings.Join(linuxX8664Linkflags, " "))
68
69}
70
71// Base 64-bit linux rust toolchain
72type toolchainLinuxX8664 struct {
73	toolchain64Bit
74}
75
76func (toolchainLinuxX8664) Supported() bool {
77	return true
78}
79
80func (toolchainLinuxX8664) Bionic() bool {
81	return false
82}
83
84func (t *toolchainLinuxX8664) Name() string {
85	return "x86_64"
86}
87
88func (t *toolchainLinuxX8664) ToolchainLinkFlags() string {
89	// Prepend the lld flags from cc_config so we stay in sync with cc
90	return "${cc_config.LinuxLldflags} ${cc_config.LinuxX8664Lldflags} " +
91		"${config.LinuxToolchainLinkFlags} ${config.LinuxToolchainX8664LinkFlags}"
92}
93
94func (t *toolchainLinuxX8664) ToolchainRustFlags() string {
95	return "${config.LinuxToolchainRustFlags} ${config.LinuxToolchainX8664RustFlags}"
96}
97
98// Specialization of the 64-bit linux rust toolchain for glibc.  Adds the gnu rust triple and
99// sysroot linker flags.
100type toolchainLinuxGlibcX8664 struct {
101	toolchainLinuxX8664
102}
103
104func (t *toolchainLinuxX8664) RustTriple() string {
105	return "x86_64-unknown-linux-gnu"
106}
107
108func (t *toolchainLinuxGlibcX8664) ToolchainLinkFlags() string {
109	return t.toolchainLinuxX8664.ToolchainLinkFlags() + " " + "${config.LinuxGlibcToolchainLinkFlags}"
110}
111
112func linuxGlibcX8664ToolchainFactory(arch android.Arch) Toolchain {
113	return toolchainLinuxGlibcX8664Singleton
114}
115
116// Specialization of the 64-bit linux rust toolchain for musl.  Adds the musl rust triple and
117// linker flags to avoid using the host sysroot.
118type toolchainLinuxMuslX8664 struct {
119	toolchainLinuxX8664
120}
121
122func (t *toolchainLinuxMuslX8664) RustTriple() string {
123	return "x86_64-unknown-linux-musl"
124}
125
126func (t *toolchainLinuxMuslX8664) ToolchainLinkFlags() string {
127	return t.toolchainLinuxX8664.ToolchainLinkFlags() + " " + "${config.LinuxMuslToolchainLinkFlags}"
128}
129
130func (t *toolchainLinuxMuslX8664) ToolchainRustFlags() string {
131	return t.toolchainLinuxX8664.ToolchainRustFlags() + " " + "${config.LinuxMuslToolchainRustFlags}"
132}
133
134func linuxMuslX8664ToolchainFactory(arch android.Arch) Toolchain {
135	return toolchainLinuxMuslX8664Singleton
136}
137
138// Base 32-bit linux rust toolchain
139type toolchainLinuxX86 struct {
140	toolchain32Bit
141}
142
143func (toolchainLinuxX86) Supported() bool {
144	return true
145}
146
147func (toolchainLinuxX86) Bionic() bool {
148	return false
149}
150
151func (t *toolchainLinuxX86) Name() string {
152	return "x86"
153}
154
155func (toolchainLinuxX86) LibclangRuntimeLibraryArch() string {
156	return "i386"
157}
158
159func (toolchainLinuxX8664) LibclangRuntimeLibraryArch() string {
160	return "x86_64"
161}
162
163func (t *toolchainLinuxX86) ToolchainLinkFlags() string {
164	// Prepend the lld flags from cc_config so we stay in sync with cc
165	return "${cc_config.LinuxLldflags} ${cc_config.LinuxX86Lldflags} " +
166		"${config.LinuxToolchainLinkFlags} ${config.LinuxToolchainX86LinkFlags}"
167}
168
169func (t *toolchainLinuxX86) ToolchainRustFlags() string {
170	return "${config.LinuxToolchainRustFlags} ${config.LinuxToolchainX86RustFlags}"
171}
172
173// Specialization of the 32-bit linux rust toolchain for glibc.  Adds the gnu rust triple and
174// sysroot linker flags.
175type toolchainLinuxGlibcX86 struct {
176	toolchainLinuxX86
177}
178
179func (t *toolchainLinuxGlibcX86) RustTriple() string {
180	return "i686-unknown-linux-gnu"
181}
182
183func (t *toolchainLinuxGlibcX86) ToolchainLinkFlags() string {
184	return t.toolchainLinuxX86.ToolchainLinkFlags() + " " + "${config.LinuxGlibcToolchainLinkFlags}"
185}
186
187func linuxGlibcX86ToolchainFactory(arch android.Arch) Toolchain {
188	return toolchainLinuxGlibcX86Singleton
189}
190
191// Specialization of the 32-bit linux rust toolchain for musl.  Adds the musl rust triple and
192// linker flags to avoid using the host sysroot.
193type toolchainLinuxMuslX86 struct {
194	toolchainLinuxX86
195}
196
197func (t *toolchainLinuxMuslX86) RustTriple() string {
198	return "i686-unknown-linux-musl"
199}
200
201func (t *toolchainLinuxMuslX86) ToolchainLinkFlags() string {
202	return t.toolchainLinuxX86.ToolchainLinkFlags() + " " + "${config.LinuxMuslToolchainLinkFlags}"
203}
204
205func (t *toolchainLinuxMuslX86) ToolchainRustFlags() string {
206	return t.toolchainLinuxX86.ToolchainRustFlags() + " " + "${config.LinuxMuslToolchainRustFlags}"
207}
208
209func linuxMuslX86ToolchainFactory(arch android.Arch) Toolchain {
210	return toolchainLinuxMuslX86Singleton
211}
212
213var toolchainLinuxGlibcX8664Singleton Toolchain = &toolchainLinuxGlibcX8664{}
214var toolchainLinuxGlibcX86Singleton Toolchain = &toolchainLinuxGlibcX86{}
215var toolchainLinuxMuslX8664Singleton Toolchain = &toolchainLinuxMuslX8664{}
216var toolchainLinuxMuslX86Singleton Toolchain = &toolchainLinuxMuslX86{}
217