xref: /aosp_15_r20/build/soong/cc/config/x86_linux_host.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1// Copyright 2016 Google Inc. All rights reserved.
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	linuxCflags = []string{
25		"-Wa,--noexecstack",
26
27		"-fPIC",
28
29		"-fno-omit-frame-pointer",
30
31		"-U_FORTIFY_SOURCE",
32		"-D_FORTIFY_SOURCE=2",
33		"-fstack-protector",
34
35		"--gcc-toolchain=${LinuxGccRoot}",
36		"-fstack-protector-strong",
37	}
38
39	linuxGlibcCflags = []string{
40		"--sysroot ${LinuxGccRoot}/sysroot",
41	}
42
43	linuxMuslCflags = []string{
44		"-D_LIBCPP_HAS_MUSL_LIBC",
45		"-DANDROID_HOST_MUSL",
46		"-nostdlibinc",
47		"--sysroot /dev/null",
48	}
49
50	linuxLdflags = []string{
51		"-Wl,-z,noexecstack",
52		"-Wl,-z,relro",
53		"-Wl,-z,now",
54		"-Wl,--no-undefined-version",
55
56		"--gcc-toolchain=${LinuxGccRoot}",
57	}
58
59	linuxLldflags = append(linuxLdflags,
60		"-Wl,--compress-debug-sections=zstd",
61	)
62
63	linuxGlibcLdflags = []string{
64		"--sysroot ${LinuxGccRoot}/sysroot",
65	}
66
67	linuxMuslLdflags = []string{
68		"-nostdlib",
69		"--sysroot /dev/null",
70	}
71
72	// Extended cflags
73	linuxX86Cflags = []string{
74		"-msse3",
75		"-m32",
76		"-march=prescott",
77		"-D_FILE_OFFSET_BITS=64",
78		"-D_LARGEFILE_SOURCE=1",
79	}
80
81	linuxX8664Cflags = []string{
82		"-m64",
83	}
84
85	linuxX86Ldflags = []string{
86		"-m32",
87		"-B${LinuxGccRoot}/lib/gcc/${LinuxGccTriple}/${LinuxGccVersion}/32",
88		"-L${LinuxGccRoot}/lib/gcc/${LinuxGccTriple}/${LinuxGccVersion}/32",
89		"-L${LinuxGccRoot}/${LinuxGccTriple}/lib32",
90	}
91
92	linuxX8664Ldflags = []string{
93		"-m64",
94		"-B${LinuxGccRoot}/lib/gcc/${LinuxGccTriple}/${LinuxGccVersion}",
95		"-L${LinuxGccRoot}/lib/gcc/${LinuxGccTriple}/${LinuxGccVersion}",
96		"-L${LinuxGccRoot}/${LinuxGccTriple}/lib64",
97	}
98
99	linuxAvailableLibraries = addPrefix([]string{
100		"c",
101		"dl",
102		"gcc",
103		"gcc_s",
104		"m",
105		"ncurses",
106		"pthread",
107		"resolv",
108		"rt",
109		"util",
110	}, "-l")
111
112	muslCrtBeginStaticBinary, muslCrtEndStaticBinary   = []string{"libc_musl_crtbegin_static"}, []string{"libc_musl_crtend"}
113	muslCrtBeginSharedBinary, muslCrtEndSharedBinary   = []string{"libc_musl_crtbegin_dynamic"}, []string{"libc_musl_crtend"}
114	muslCrtBeginSharedLibrary, muslCrtEndSharedLibrary = []string{"libc_musl_crtbegin_so"}, []string{"libc_musl_crtend_so"}
115
116	MuslDefaultSharedLibraries = []string{"libc_musl"}
117)
118
119const (
120	linuxGccVersion   = "4.8.3"
121	linuxGlibcVersion = "2.17"
122)
123
124func init() {
125	pctx.StaticVariable("LinuxGccVersion", linuxGccVersion)
126	pctx.StaticVariable("LinuxGlibcVersion", linuxGlibcVersion)
127
128	// Most places use the full GCC version. A few only use up to the first two numbers.
129	if p := strings.Split(linuxGccVersion, "."); len(p) > 2 {
130		pctx.StaticVariable("ShortLinuxGccVersion", strings.Join(p[:2], "."))
131	} else {
132		pctx.StaticVariable("ShortLinuxGccVersion", linuxGccVersion)
133	}
134
135	pctx.SourcePathVariable("LinuxGccRoot",
136		"prebuilts/gcc/linux-x86/host/x86_64-linux-glibc${LinuxGlibcVersion}-${ShortLinuxGccVersion}")
137
138	pctx.StaticVariable("LinuxGccTriple", "x86_64-linux")
139
140	pctx.StaticVariable("LinuxCflags", strings.Join(linuxCflags, " "))
141	pctx.StaticVariable("LinuxLdflags", strings.Join(linuxLdflags, " "))
142	pctx.StaticVariable("LinuxLldflags", strings.Join(linuxLldflags, " "))
143	pctx.StaticVariable("LinuxGlibcCflags", strings.Join(linuxGlibcCflags, " "))
144	pctx.StaticVariable("LinuxGlibcLdflags", strings.Join(linuxGlibcLdflags, " "))
145	pctx.StaticVariable("LinuxGlibcLldflags", strings.Join(linuxGlibcLdflags, " "))
146	pctx.StaticVariable("LinuxMuslCflags", strings.Join(linuxMuslCflags, " "))
147	pctx.StaticVariable("LinuxMuslLdflags", strings.Join(linuxMuslLdflags, " "))
148	pctx.StaticVariable("LinuxMuslLldflags", strings.Join(linuxMuslLdflags, " "))
149
150	pctx.StaticVariable("LinuxX86Cflags", strings.Join(linuxX86Cflags, " "))
151	pctx.StaticVariable("LinuxX8664Cflags", strings.Join(linuxX8664Cflags, " "))
152	pctx.StaticVariable("LinuxX86Ldflags", strings.Join(linuxX86Ldflags, " "))
153	pctx.StaticVariable("LinuxX86Lldflags", strings.Join(linuxX86Ldflags, " "))
154	pctx.StaticVariable("LinuxX8664Ldflags", strings.Join(linuxX8664Ldflags, " "))
155	pctx.StaticVariable("LinuxX8664Lldflags", strings.Join(linuxX8664Ldflags, " "))
156	// Yasm flags
157	pctx.StaticVariable("LinuxX86YasmFlags", "-f elf32 -m x86")
158	pctx.StaticVariable("LinuxX8664YasmFlags", "-f elf64 -m amd64")
159}
160
161type toolchainLinux struct {
162	toolchainBase
163	cFlags, ldFlags string
164}
165
166type toolchainLinuxX86 struct {
167	toolchain32Bit
168	toolchainLinux
169}
170
171type toolchainLinuxX8664 struct {
172	toolchain64Bit
173	toolchainLinux
174}
175
176func (t *toolchainLinuxX86) Name() string {
177	return "x86"
178}
179
180func (t *toolchainLinuxX8664) Name() string {
181	return "x86_64"
182}
183
184func (t *toolchainLinux) IncludeFlags() string {
185	return ""
186}
187
188func (t *toolchainLinuxX86) Cflags() string {
189	return "${config.LinuxCflags} ${config.LinuxX86Cflags}"
190}
191
192func (t *toolchainLinuxX86) Cppflags() string {
193	return ""
194}
195
196func (t *toolchainLinuxX8664) Cflags() string {
197	return "${config.LinuxCflags} ${config.LinuxX8664Cflags}"
198}
199
200func (t *toolchainLinuxX8664) Cppflags() string {
201	return ""
202}
203
204func (t *toolchainLinuxX86) Ldflags() string {
205	return "${config.LinuxLdflags} ${config.LinuxX86Ldflags}"
206}
207
208func (t *toolchainLinuxX86) Lldflags() string {
209	return "${config.LinuxLldflags} ${config.LinuxX86Lldflags}"
210}
211
212func (t *toolchainLinuxX8664) Ldflags() string {
213	return "${config.LinuxLdflags} ${config.LinuxX8664Ldflags}"
214}
215
216func (t *toolchainLinuxX8664) Lldflags() string {
217	return "${config.LinuxLldflags} ${config.LinuxX8664Lldflags}"
218}
219
220func (t *toolchainLinuxX86) YasmFlags() string {
221	return "${config.LinuxX86YasmFlags}"
222}
223
224func (t *toolchainLinuxX8664) YasmFlags() string {
225	return "${config.LinuxX8664YasmFlags}"
226}
227
228func (toolchainLinuxX86) LibclangRuntimeLibraryArch() string {
229	return "i386"
230}
231
232func (toolchainLinuxX8664) LibclangRuntimeLibraryArch() string {
233	return "x86_64"
234}
235
236func (t *toolchainLinux) AvailableLibraries() []string {
237	return linuxAvailableLibraries
238}
239
240func (toolchainLinux) ShlibSuffix() string {
241	return ".so"
242}
243
244func (toolchainLinux) ExecutableSuffix() string {
245	return ""
246}
247
248// glibc specialization of the linux toolchain
249
250type toolchainGlibc struct {
251	toolchainNoCrt
252}
253
254func (toolchainGlibc) Glibc() bool { return true }
255
256func (toolchainGlibc) Cflags() string {
257	return "${config.LinuxGlibcCflags}"
258}
259
260func (toolchainGlibc) Ldflags() string {
261	return "${config.LinuxGlibcLdflags}"
262}
263
264func (toolchainGlibc) Lldflags() string {
265	return "${config.LinuxGlibcLldflags}"
266}
267
268type toolchainLinuxGlibcX86 struct {
269	toolchainLinuxX86
270	toolchainGlibc
271}
272
273type toolchainLinuxGlibcX8664 struct {
274	toolchainLinuxX8664
275	toolchainGlibc
276}
277
278func (t *toolchainLinuxGlibcX86) ClangTriple() string {
279	return "i686-linux-gnu"
280}
281
282func (t *toolchainLinuxGlibcX86) Cflags() string {
283	return t.toolchainLinuxX86.Cflags() + " " + t.toolchainGlibc.Cflags()
284}
285
286func (t *toolchainLinuxGlibcX86) Ldflags() string {
287	return t.toolchainLinuxX86.Ldflags() + " " + t.toolchainGlibc.Ldflags()
288}
289
290func (t *toolchainLinuxGlibcX86) Lldflags() string {
291	return t.toolchainLinuxX86.Lldflags() + " " + t.toolchainGlibc.Lldflags()
292}
293
294func (t *toolchainLinuxGlibcX8664) ClangTriple() string {
295	return "x86_64-linux-gnu"
296}
297
298func (t *toolchainLinuxGlibcX8664) Cflags() string {
299	return t.toolchainLinuxX8664.Cflags() + " " + t.toolchainGlibc.Cflags()
300}
301
302func (t *toolchainLinuxGlibcX8664) Ldflags() string {
303	return t.toolchainLinuxX8664.Ldflags() + " " + t.toolchainGlibc.Ldflags()
304}
305
306func (t *toolchainLinuxGlibcX8664) Lldflags() string {
307	return t.toolchainLinuxX8664.Lldflags() + " " + t.toolchainGlibc.Lldflags()
308}
309
310var toolchainLinuxGlibcX86Singleton Toolchain = &toolchainLinuxGlibcX86{}
311var toolchainLinuxGlibcX8664Singleton Toolchain = &toolchainLinuxGlibcX8664{}
312
313func linuxGlibcX86ToolchainFactory(arch android.Arch) Toolchain {
314	return toolchainLinuxGlibcX86Singleton
315}
316
317func linuxGlibcX8664ToolchainFactory(arch android.Arch) Toolchain {
318	return toolchainLinuxGlibcX8664Singleton
319}
320
321// musl specialization of the linux toolchain
322
323type toolchainMusl struct {
324}
325
326func (toolchainMusl) Musl() bool { return true }
327
328func (toolchainMusl) CrtBeginStaticBinary() []string       { return muslCrtBeginStaticBinary }
329func (toolchainMusl) CrtBeginSharedBinary() []string       { return muslCrtBeginSharedBinary }
330func (toolchainMusl) CrtBeginSharedLibrary() []string      { return muslCrtBeginSharedLibrary }
331func (toolchainMusl) CrtEndStaticBinary() []string         { return muslCrtEndStaticBinary }
332func (toolchainMusl) CrtEndSharedBinary() []string         { return muslCrtEndSharedBinary }
333func (toolchainMusl) CrtEndSharedLibrary() []string        { return muslCrtEndSharedLibrary }
334func (toolchainMusl) CrtPadSegmentSharedLibrary() []string { return nil }
335
336func (toolchainMusl) DefaultSharedLibraries() []string { return MuslDefaultSharedLibraries }
337
338func (toolchainMusl) Cflags() string {
339	return "${config.LinuxMuslCflags}"
340}
341
342func (toolchainMusl) Ldflags() string {
343	return "${config.LinuxMuslLdflags}"
344}
345
346func (toolchainMusl) Lldflags() string {
347	return "${config.LinuxMuslLldflags}"
348}
349
350type toolchainLinuxMuslX86 struct {
351	toolchainLinuxX86
352	toolchainMusl
353}
354
355type toolchainLinuxMuslX8664 struct {
356	toolchainLinuxX8664
357	toolchainMusl
358}
359
360func (t *toolchainLinuxMuslX86) ClangTriple() string {
361	return "i686-linux-musl"
362}
363
364func (t *toolchainLinuxMuslX86) Cflags() string {
365	return t.toolchainLinuxX86.Cflags() + " " + t.toolchainMusl.Cflags()
366}
367
368func (t *toolchainLinuxMuslX86) Ldflags() string {
369	return t.toolchainLinuxX86.Ldflags() + " " + t.toolchainMusl.Ldflags()
370}
371
372func (t *toolchainLinuxMuslX86) Lldflags() string {
373	return t.toolchainLinuxX86.Lldflags() + " " + t.toolchainMusl.Lldflags()
374}
375
376func (t *toolchainLinuxMuslX8664) ClangTriple() string {
377	return "x86_64-linux-musl"
378}
379
380func (t *toolchainLinuxMuslX8664) Cflags() string {
381	return t.toolchainLinuxX8664.Cflags() + " " + t.toolchainMusl.Cflags()
382}
383
384func (t *toolchainLinuxMuslX8664) Ldflags() string {
385	return t.toolchainLinuxX8664.Ldflags() + " " + t.toolchainMusl.Ldflags()
386}
387
388func (t *toolchainLinuxMuslX8664) Lldflags() string {
389	return t.toolchainLinuxX8664.Lldflags() + " " + t.toolchainMusl.Lldflags()
390}
391
392var toolchainLinuxMuslX86Singleton Toolchain = &toolchainLinuxMuslX86{}
393var toolchainLinuxMuslX8664Singleton Toolchain = &toolchainLinuxMuslX8664{}
394
395func linuxMuslX86ToolchainFactory(arch android.Arch) Toolchain {
396	return toolchainLinuxMuslX86Singleton
397}
398
399func linuxMuslX8664ToolchainFactory(arch android.Arch) Toolchain {
400	return toolchainLinuxMuslX8664Singleton
401}
402
403func init() {
404	registerToolchainFactory(android.Linux, android.X86, linuxGlibcX86ToolchainFactory)
405	registerToolchainFactory(android.Linux, android.X86_64, linuxGlibcX8664ToolchainFactory)
406	registerToolchainFactory(android.LinuxMusl, android.X86, linuxMuslX86ToolchainFactory)
407	registerToolchainFactory(android.LinuxMusl, android.X86_64, linuxMuslX8664ToolchainFactory)
408}
409