blob: 4e8fd7752dee1ce1caae43fd50048df81c4844b4 [file] [log] [blame]
Colin Crossb98c8b02016-07-29 13:44:28 -07001// 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{
Colin Crossb98c8b02016-07-29 13:44:28 -070025 "-Wa,--noexecstack",
26
27 "-fPIC",
Colin Crossb98c8b02016-07-29 13:44:28 -070028
29 "-U_FORTIFY_SOURCE",
30 "-D_FORTIFY_SOURCE=2",
31 "-fstack-protector",
32
33 // Workaround differences in inttypes.h between host and target.
34 //See bug 12708004.
35 "-D__STDC_FORMAT_MACROS",
36 "-D__STDC_CONSTANT_MACROS",
Colin Cross33bac242021-07-14 17:03:16 -070037
38 "--gcc-toolchain=${LinuxGccRoot}",
Colin Cross5d6904e2021-07-23 22:20:29 +000039 "-fstack-protector-strong",
Colin Cross4fb4ef22021-07-19 14:11:03 -070040 }
41
Colin Cross528d67e2021-07-23 22:23:07 +000042 linuxGlibcCflags = []string{
43 "--sysroot ${LinuxGccRoot}/sysroot",
44 }
45
46 linuxMuslCflags = []string{
47 "-D_LIBCPP_HAS_MUSL_LIBC",
Colin Cross7e7b0282021-08-16 14:42:53 -070048 "-DANDROID_HOST_MUSL",
Colin Cross528d67e2021-07-23 22:23:07 +000049 "-nostdlibinc",
Colin Cross6745a8e2022-02-11 13:43:21 -080050 "--sysroot /dev/null",
Colin Cross528d67e2021-07-23 22:23:07 +000051 }
52
Colin Crossb98c8b02016-07-29 13:44:28 -070053 linuxLdflags = []string{
54 "-Wl,-z,noexecstack",
55 "-Wl,-z,relro",
56 "-Wl,-z,now",
57 "-Wl,--no-undefined-version",
Colin Cross33bac242021-07-14 17:03:16 -070058
59 "--gcc-toolchain=${LinuxGccRoot}",
Colin Cross528d67e2021-07-23 22:23:07 +000060 }
61
62 linuxGlibcLdflags = []string{
Colin Cross33bac242021-07-14 17:03:16 -070063 "--sysroot ${LinuxGccRoot}/sysroot",
Colin Crossb98c8b02016-07-29 13:44:28 -070064 }
65
Colin Cross528d67e2021-07-23 22:23:07 +000066 linuxMuslLdflags = []string{
67 "-nostdlib",
Colin Cross6745a8e2022-02-11 13:43:21 -080068 "--sysroot /dev/null",
Colin Cross528d67e2021-07-23 22:23:07 +000069 }
70
Colin Crossb98c8b02016-07-29 13:44:28 -070071 // Extended cflags
72 linuxX86Cflags = []string{
73 "-msse3",
Colin Crossb98c8b02016-07-29 13:44:28 -070074 "-m32",
75 "-march=prescott",
76 "-D_FILE_OFFSET_BITS=64",
77 "-D_LARGEFILE_SOURCE=1",
78 }
79
80 linuxX8664Cflags = []string{
81 "-m64",
82 }
83
84 linuxX86Ldflags = []string{
85 "-m32",
Colin Cross33bac242021-07-14 17:03:16 -070086 "-B${LinuxGccRoot}/lib/gcc/${LinuxGccTriple}/${LinuxGccVersion}/32",
87 "-L${LinuxGccRoot}/lib/gcc/${LinuxGccTriple}/${LinuxGccVersion}/32",
88 "-L${LinuxGccRoot}/${LinuxGccTriple}/lib32",
Colin Crossb98c8b02016-07-29 13:44:28 -070089 }
90
91 linuxX8664Ldflags = []string{
92 "-m64",
Colin Crossb98c8b02016-07-29 13:44:28 -070093 "-B${LinuxGccRoot}/lib/gcc/${LinuxGccTriple}/${LinuxGccVersion}",
94 "-L${LinuxGccRoot}/lib/gcc/${LinuxGccTriple}/${LinuxGccVersion}",
95 "-L${LinuxGccRoot}/${LinuxGccTriple}/lib64",
Colin Cross33bac242021-07-14 17:03:16 -070096 }
Chih-Hung Hsieh3101a962018-04-17 14:16:05 -070097
Colin Crossb98c8b02016-07-29 13:44:28 -070098 linuxAvailableLibraries = addPrefix([]string{
99 "c",
100 "dl",
101 "gcc",
102 "gcc_s",
103 "m",
104 "ncurses",
105 "pthread",
106 "resolv",
107 "rt",
108 "util",
Colin Crossb98c8b02016-07-29 13:44:28 -0700109 }, "-l")
Colin Cross528d67e2021-07-23 22:23:07 +0000110
Colin Crossf26b4662021-08-18 13:55:01 -0700111 muslCrtBeginStaticBinary, muslCrtEndStaticBinary = []string{"libc_musl_crtbegin_static"}, []string{"libc_musl_crtend"}
Colin Cross528d67e2021-07-23 22:23:07 +0000112 muslCrtBeginSharedBinary, muslCrtEndSharedBinary = []string{"libc_musl_crtbegin_dynamic", "musl_linker_script"}, []string{"libc_musl_crtend"}
113 muslCrtBeginSharedLibrary, muslCrtEndSharedLibrary = []string{"libc_musl_crtbegin_so"}, []string{"libc_musl_crtend_so"}
114
Colin Cross90a8b3a2021-08-02 13:17:13 -0700115 muslDefaultSharedLibraries = []string{"libc_musl"}
Colin Crossb98c8b02016-07-29 13:44:28 -0700116)
117
118const (
George Burgess IV7294cdc2019-01-23 13:59:10 -0800119 linuxGccVersion = "4.8.3"
120 linuxGlibcVersion = "2.17"
Colin Crossb98c8b02016-07-29 13:44:28 -0700121)
122
123func init() {
Sam Delmerico7f889562022-03-25 14:55:40 +0000124 exportedVars.ExportStringStaticVariable("LinuxGccVersion", linuxGccVersion)
125 exportedVars.ExportStringStaticVariable("LinuxGlibcVersion", linuxGlibcVersion)
Chris Parsons3b1f83d2021-10-14 14:08:38 -0400126
George Burgess IV7294cdc2019-01-23 13:59:10 -0800127 // Most places use the full GCC version. A few only use up to the first two numbers.
128 if p := strings.Split(linuxGccVersion, "."); len(p) > 2 {
Sam Delmerico7f889562022-03-25 14:55:40 +0000129 exportedVars.ExportStringStaticVariable("ShortLinuxGccVersion", strings.Join(p[:2], "."))
George Burgess IV7294cdc2019-01-23 13:59:10 -0800130 } else {
Sam Delmerico7f889562022-03-25 14:55:40 +0000131 exportedVars.ExportStringStaticVariable("ShortLinuxGccVersion", linuxGccVersion)
George Burgess IV7294cdc2019-01-23 13:59:10 -0800132 }
Colin Crossb98c8b02016-07-29 13:44:28 -0700133
Sam Delmerico7f889562022-03-25 14:55:40 +0000134 exportedVars.ExportSourcePathVariable("LinuxGccRoot",
Chris Parsons3b1f83d2021-10-14 14:08:38 -0400135 "prebuilts/gcc/linux-x86/host/x86_64-linux-glibc${LinuxGlibcVersion}-${ShortLinuxGccVersion}")
Colin Crossb98c8b02016-07-29 13:44:28 -0700136
Sam Delmerico7f889562022-03-25 14:55:40 +0000137 exportedVars.ExportStringListStaticVariable("LinuxGccTriple", []string{"x86_64-linux"})
Colin Crossb98c8b02016-07-29 13:44:28 -0700138
Sam Delmerico7f889562022-03-25 14:55:40 +0000139 exportedVars.ExportStringListStaticVariable("LinuxCflags", linuxCflags)
140 exportedVars.ExportStringListStaticVariable("LinuxLdflags", linuxLdflags)
141 exportedVars.ExportStringListStaticVariable("LinuxLldflags", linuxLdflags)
142 exportedVars.ExportStringListStaticVariable("LinuxGlibcCflags", linuxGlibcCflags)
143 exportedVars.ExportStringListStaticVariable("LinuxGlibcLdflags", linuxGlibcLdflags)
144 exportedVars.ExportStringListStaticVariable("LinuxGlibcLldflags", linuxGlibcLdflags)
145 exportedVars.ExportStringListStaticVariable("LinuxMuslCflags", linuxMuslCflags)
146 exportedVars.ExportStringListStaticVariable("LinuxMuslLdflags", linuxMuslLdflags)
147 exportedVars.ExportStringListStaticVariable("LinuxMuslLldflags", linuxMuslLdflags)
Colin Crossb98c8b02016-07-29 13:44:28 -0700148
Sam Delmerico7f889562022-03-25 14:55:40 +0000149 exportedVars.ExportStringListStaticVariable("LinuxX86Cflags", linuxX86Cflags)
150 exportedVars.ExportStringListStaticVariable("LinuxX8664Cflags", linuxX8664Cflags)
151 exportedVars.ExportStringListStaticVariable("LinuxX86Ldflags", linuxX86Ldflags)
152 exportedVars.ExportStringListStaticVariable("LinuxX86Lldflags", linuxX86Ldflags)
153 exportedVars.ExportStringListStaticVariable("LinuxX8664Ldflags", linuxX8664Ldflags)
154 exportedVars.ExportStringListStaticVariable("LinuxX8664Lldflags", linuxX8664Ldflags)
Greg Hartman09302be2017-10-04 17:31:43 -0700155 // Yasm flags
Sam Delmerico7f889562022-03-25 14:55:40 +0000156 exportedVars.ExportStringListStaticVariable("LinuxX86YasmFlags", []string{"-f elf32 -m x86"})
157 exportedVars.ExportStringListStaticVariable("LinuxX8664YasmFlags", []string{"-f elf64 -m amd64"})
Colin Crossb98c8b02016-07-29 13:44:28 -0700158}
159
160type toolchainLinux struct {
161 cFlags, ldFlags string
162}
163
164type toolchainLinuxX86 struct {
165 toolchain32Bit
166 toolchainLinux
167}
168
169type toolchainLinuxX8664 struct {
170 toolchain64Bit
171 toolchainLinux
172}
173
174func (t *toolchainLinuxX86) Name() string {
175 return "x86"
176}
177
178func (t *toolchainLinuxX8664) Name() string {
179 return "x86_64"
180}
181
182func (t *toolchainLinux) GccRoot() string {
183 return "${config.LinuxGccRoot}"
184}
185
186func (t *toolchainLinux) GccTriple() string {
187 return "${config.LinuxGccTriple}"
188}
189
190func (t *toolchainLinux) GccVersion() string {
191 return linuxGccVersion
192}
193
Colin Crossb98c8b02016-07-29 13:44:28 -0700194func (t *toolchainLinux) IncludeFlags() string {
195 return ""
196}
197
Colin Cross33bac242021-07-14 17:03:16 -0700198func (t *toolchainLinuxX86) Cflags() string {
Colin Cross0523ba22021-07-14 18:45:05 -0700199 return "${config.LinuxCflags} ${config.LinuxX86Cflags}"
Colin Crossb98c8b02016-07-29 13:44:28 -0700200}
201
Colin Cross33bac242021-07-14 17:03:16 -0700202func (t *toolchainLinuxX86) Cppflags() string {
Logan Chienbef00a22018-07-27 06:27:53 +0800203 return ""
Colin Crossb98c8b02016-07-29 13:44:28 -0700204}
205
Colin Cross33bac242021-07-14 17:03:16 -0700206func (t *toolchainLinuxX8664) Cflags() string {
Colin Cross0523ba22021-07-14 18:45:05 -0700207 return "${config.LinuxCflags} ${config.LinuxX8664Cflags}"
Colin Crossb98c8b02016-07-29 13:44:28 -0700208}
209
Colin Cross33bac242021-07-14 17:03:16 -0700210func (t *toolchainLinuxX8664) Cppflags() string {
Logan Chienbef00a22018-07-27 06:27:53 +0800211 return ""
Colin Crossb98c8b02016-07-29 13:44:28 -0700212}
213
Colin Cross33bac242021-07-14 17:03:16 -0700214func (t *toolchainLinuxX86) Ldflags() string {
Colin Cross0523ba22021-07-14 18:45:05 -0700215 return "${config.LinuxLdflags} ${config.LinuxX86Ldflags}"
Colin Crossb98c8b02016-07-29 13:44:28 -0700216}
217
Colin Cross33bac242021-07-14 17:03:16 -0700218func (t *toolchainLinuxX86) Lldflags() string {
Colin Cross0523ba22021-07-14 18:45:05 -0700219 return "${config.LinuxLldflags} ${config.LinuxX86Lldflags}"
Chih-Hung Hsieh02b4da52018-04-03 11:33:34 -0700220}
221
Colin Cross33bac242021-07-14 17:03:16 -0700222func (t *toolchainLinuxX8664) Ldflags() string {
Colin Cross0523ba22021-07-14 18:45:05 -0700223 return "${config.LinuxLdflags} ${config.LinuxX8664Ldflags}"
Colin Crossb98c8b02016-07-29 13:44:28 -0700224}
225
Colin Cross33bac242021-07-14 17:03:16 -0700226func (t *toolchainLinuxX8664) Lldflags() string {
Colin Cross0523ba22021-07-14 18:45:05 -0700227 return "${config.LinuxLldflags} ${config.LinuxX8664Lldflags}"
Chih-Hung Hsieh02b4da52018-04-03 11:33:34 -0700228}
229
Greg Hartman09302be2017-10-04 17:31:43 -0700230func (t *toolchainLinuxX86) YasmFlags() string {
231 return "${config.LinuxX86YasmFlags}"
232}
233
234func (t *toolchainLinuxX8664) YasmFlags() string {
235 return "${config.LinuxX8664YasmFlags}"
236}
237
Mitch Phillipsda9a4632019-07-15 09:34:09 -0700238func (toolchainLinuxX86) LibclangRuntimeLibraryArch() string {
Ivan Lozano9ac32c72020-02-19 15:24:02 -0500239 return "i386"
Mitch Phillipsda9a4632019-07-15 09:34:09 -0700240}
241
242func (toolchainLinuxX8664) LibclangRuntimeLibraryArch() string {
243 return "x86_64"
244}
245
Colin Crossb98c8b02016-07-29 13:44:28 -0700246func (t *toolchainLinux) AvailableLibraries() []string {
247 return linuxAvailableLibraries
248}
249
Colin Cross528d67e2021-07-23 22:23:07 +0000250// glibc specialization of the linux toolchain
Colin Crossb98c8b02016-07-29 13:44:28 -0700251
Colin Cross528d67e2021-07-23 22:23:07 +0000252type toolchainGlibc struct {
Colin Crossb98c8b02016-07-29 13:44:28 -0700253}
254
Colin Cross528d67e2021-07-23 22:23:07 +0000255func (toolchainGlibc) Glibc() bool { return true }
256
257func (toolchainGlibc) Cflags() string {
258 return "${config.LinuxGlibcCflags}"
259}
260
261func (toolchainGlibc) Ldflags() string {
262 return "${config.LinuxGlibcLdflags}"
263}
264
265func (toolchainGlibc) Lldflags() string {
266 return "${config.LinuxGlibcLldflags}"
267}
268
269type toolchainLinuxGlibcX86 struct {
270 toolchainLinuxX86
271 toolchainGlibc
272}
273
274type toolchainLinuxGlibcX8664 struct {
275 toolchainLinuxX8664
276 toolchainGlibc
277}
278
Colin Cross72ee6762022-01-28 14:05:22 -0800279func (t *toolchainLinuxGlibcX86) ClangTriple() string {
280 return "i686-linux-gnu"
281}
282
Colin Cross528d67e2021-07-23 22:23:07 +0000283func (t *toolchainLinuxGlibcX86) Cflags() string {
284 return t.toolchainLinuxX86.Cflags() + " " + t.toolchainGlibc.Cflags()
285}
286
287func (t *toolchainLinuxGlibcX86) Ldflags() string {
288 return t.toolchainLinuxX86.Ldflags() + " " + t.toolchainGlibc.Ldflags()
289}
290
291func (t *toolchainLinuxGlibcX86) Lldflags() string {
292 return t.toolchainLinuxX86.Lldflags() + " " + t.toolchainGlibc.Lldflags()
293}
294
Colin Cross72ee6762022-01-28 14:05:22 -0800295func (t *toolchainLinuxGlibcX8664) ClangTriple() string {
296 return "x86_64-linux-gnu"
297}
298
Colin Cross528d67e2021-07-23 22:23:07 +0000299func (t *toolchainLinuxGlibcX8664) Cflags() string {
300 return t.toolchainLinuxX8664.Cflags() + " " + t.toolchainGlibc.Cflags()
301}
302
303func (t *toolchainLinuxGlibcX8664) Ldflags() string {
304 return t.toolchainLinuxX8664.Ldflags() + " " + t.toolchainGlibc.Ldflags()
305}
306
307func (t *toolchainLinuxGlibcX8664) Lldflags() string {
308 return t.toolchainLinuxX8664.Lldflags() + " " + t.toolchainGlibc.Lldflags()
309}
310
311var toolchainLinuxGlibcX86Singleton Toolchain = &toolchainLinuxGlibcX86{}
312var toolchainLinuxGlibcX8664Singleton Toolchain = &toolchainLinuxGlibcX8664{}
313
314func linuxGlibcX86ToolchainFactory(arch android.Arch) Toolchain {
315 return toolchainLinuxGlibcX86Singleton
316}
317
318func linuxGlibcX8664ToolchainFactory(arch android.Arch) Toolchain {
319 return toolchainLinuxGlibcX8664Singleton
320}
321
322// musl specialization of the linux toolchain
323
324type toolchainMusl struct {
325}
326
327func (toolchainMusl) Musl() bool { return true }
328
329func (toolchainMusl) CrtBeginStaticBinary() []string { return muslCrtBeginStaticBinary }
330func (toolchainMusl) CrtBeginSharedBinary() []string { return muslCrtBeginSharedBinary }
331func (toolchainMusl) CrtBeginSharedLibrary() []string { return muslCrtBeginSharedLibrary }
332func (toolchainMusl) CrtEndStaticBinary() []string { return muslCrtEndStaticBinary }
333func (toolchainMusl) CrtEndSharedBinary() []string { return muslCrtEndSharedBinary }
334func (toolchainMusl) CrtEndSharedLibrary() []string { return muslCrtEndSharedLibrary }
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
Colin Cross72ee6762022-01-28 14:05:22 -0800360func (t *toolchainLinuxMuslX86) ClangTriple() string {
361 return "i686-linux-musl"
362}
363
Colin Cross528d67e2021-07-23 22:23:07 +0000364func (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
Colin Cross72ee6762022-01-28 14:05:22 -0800376func (t *toolchainLinuxMuslX8664) ClangTriple() string {
377 return "x86_64-linux-musl"
378}
379
Colin Cross528d67e2021-07-23 22:23:07 +0000380func (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
Colin Crossb98c8b02016-07-29 13:44:28 -0700401}
402
403func init() {
Colin Cross528d67e2021-07-23 22:23:07 +0000404 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)
Colin Crossb98c8b02016-07-29 13:44:28 -0700408}