blob: 1b126dea12b0dc2e3da761b0a240b7094eab2fee [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 {
Colin Crossfc3b0642022-09-01 11:02:15 -0700161 toolchainBase
Colin Crossb98c8b02016-07-29 13:44:28 -0700162 cFlags, ldFlags string
163}
164
165type toolchainLinuxX86 struct {
166 toolchain32Bit
167 toolchainLinux
168}
169
170type toolchainLinuxX8664 struct {
171 toolchain64Bit
172 toolchainLinux
173}
174
175func (t *toolchainLinuxX86) Name() string {
176 return "x86"
177}
178
179func (t *toolchainLinuxX8664) Name() string {
180 return "x86_64"
181}
182
183func (t *toolchainLinux) GccRoot() string {
184 return "${config.LinuxGccRoot}"
185}
186
187func (t *toolchainLinux) GccTriple() string {
188 return "${config.LinuxGccTriple}"
189}
190
191func (t *toolchainLinux) GccVersion() string {
192 return linuxGccVersion
193}
194
Colin Crossb98c8b02016-07-29 13:44:28 -0700195func (t *toolchainLinux) IncludeFlags() string {
196 return ""
197}
198
Colin Cross33bac242021-07-14 17:03:16 -0700199func (t *toolchainLinuxX86) Cflags() string {
Colin Cross0523ba22021-07-14 18:45:05 -0700200 return "${config.LinuxCflags} ${config.LinuxX86Cflags}"
Colin Crossb98c8b02016-07-29 13:44:28 -0700201}
202
Colin Cross33bac242021-07-14 17:03:16 -0700203func (t *toolchainLinuxX86) Cppflags() string {
Logan Chienbef00a22018-07-27 06:27:53 +0800204 return ""
Colin Crossb98c8b02016-07-29 13:44:28 -0700205}
206
Colin Cross33bac242021-07-14 17:03:16 -0700207func (t *toolchainLinuxX8664) Cflags() string {
Colin Cross0523ba22021-07-14 18:45:05 -0700208 return "${config.LinuxCflags} ${config.LinuxX8664Cflags}"
Colin Crossb98c8b02016-07-29 13:44:28 -0700209}
210
Colin Cross33bac242021-07-14 17:03:16 -0700211func (t *toolchainLinuxX8664) Cppflags() string {
Logan Chienbef00a22018-07-27 06:27:53 +0800212 return ""
Colin Crossb98c8b02016-07-29 13:44:28 -0700213}
214
Colin Cross33bac242021-07-14 17:03:16 -0700215func (t *toolchainLinuxX86) Ldflags() string {
Colin Cross0523ba22021-07-14 18:45:05 -0700216 return "${config.LinuxLdflags} ${config.LinuxX86Ldflags}"
Colin Crossb98c8b02016-07-29 13:44:28 -0700217}
218
Colin Cross33bac242021-07-14 17:03:16 -0700219func (t *toolchainLinuxX86) Lldflags() string {
Colin Cross0523ba22021-07-14 18:45:05 -0700220 return "${config.LinuxLldflags} ${config.LinuxX86Lldflags}"
Chih-Hung Hsieh02b4da52018-04-03 11:33:34 -0700221}
222
Colin Cross33bac242021-07-14 17:03:16 -0700223func (t *toolchainLinuxX8664) Ldflags() string {
Colin Cross0523ba22021-07-14 18:45:05 -0700224 return "${config.LinuxLdflags} ${config.LinuxX8664Ldflags}"
Colin Crossb98c8b02016-07-29 13:44:28 -0700225}
226
Colin Cross33bac242021-07-14 17:03:16 -0700227func (t *toolchainLinuxX8664) Lldflags() string {
Colin Cross0523ba22021-07-14 18:45:05 -0700228 return "${config.LinuxLldflags} ${config.LinuxX8664Lldflags}"
Chih-Hung Hsieh02b4da52018-04-03 11:33:34 -0700229}
230
Greg Hartman09302be2017-10-04 17:31:43 -0700231func (t *toolchainLinuxX86) YasmFlags() string {
232 return "${config.LinuxX86YasmFlags}"
233}
234
235func (t *toolchainLinuxX8664) YasmFlags() string {
236 return "${config.LinuxX8664YasmFlags}"
237}
238
Mitch Phillipsda9a4632019-07-15 09:34:09 -0700239func (toolchainLinuxX86) LibclangRuntimeLibraryArch() string {
Ivan Lozano9ac32c72020-02-19 15:24:02 -0500240 return "i386"
Mitch Phillipsda9a4632019-07-15 09:34:09 -0700241}
242
243func (toolchainLinuxX8664) LibclangRuntimeLibraryArch() string {
244 return "x86_64"
245}
246
Colin Crossb98c8b02016-07-29 13:44:28 -0700247func (t *toolchainLinux) AvailableLibraries() []string {
248 return linuxAvailableLibraries
249}
250
Colin Crossfc3b0642022-09-01 11:02:15 -0700251func (toolchainLinux) ShlibSuffix() string {
252 return ".so"
253}
254
255func (toolchainLinux) ExecutableSuffix() string {
256 return ""
257}
258
Colin Cross528d67e2021-07-23 22:23:07 +0000259// glibc specialization of the linux toolchain
Colin Crossb98c8b02016-07-29 13:44:28 -0700260
Colin Cross528d67e2021-07-23 22:23:07 +0000261type toolchainGlibc struct {
Colin Crossfc3b0642022-09-01 11:02:15 -0700262 toolchainNoCrt
Colin Crossb98c8b02016-07-29 13:44:28 -0700263}
264
Colin Cross528d67e2021-07-23 22:23:07 +0000265func (toolchainGlibc) Glibc() bool { return true }
266
267func (toolchainGlibc) Cflags() string {
268 return "${config.LinuxGlibcCflags}"
269}
270
271func (toolchainGlibc) Ldflags() string {
272 return "${config.LinuxGlibcLdflags}"
273}
274
275func (toolchainGlibc) Lldflags() string {
276 return "${config.LinuxGlibcLldflags}"
277}
278
279type toolchainLinuxGlibcX86 struct {
280 toolchainLinuxX86
281 toolchainGlibc
282}
283
284type toolchainLinuxGlibcX8664 struct {
285 toolchainLinuxX8664
286 toolchainGlibc
287}
288
Colin Cross72ee6762022-01-28 14:05:22 -0800289func (t *toolchainLinuxGlibcX86) ClangTriple() string {
290 return "i686-linux-gnu"
291}
292
Colin Cross528d67e2021-07-23 22:23:07 +0000293func (t *toolchainLinuxGlibcX86) Cflags() string {
294 return t.toolchainLinuxX86.Cflags() + " " + t.toolchainGlibc.Cflags()
295}
296
297func (t *toolchainLinuxGlibcX86) Ldflags() string {
298 return t.toolchainLinuxX86.Ldflags() + " " + t.toolchainGlibc.Ldflags()
299}
300
301func (t *toolchainLinuxGlibcX86) Lldflags() string {
302 return t.toolchainLinuxX86.Lldflags() + " " + t.toolchainGlibc.Lldflags()
303}
304
Colin Cross72ee6762022-01-28 14:05:22 -0800305func (t *toolchainLinuxGlibcX8664) ClangTriple() string {
306 return "x86_64-linux-gnu"
307}
308
Colin Cross528d67e2021-07-23 22:23:07 +0000309func (t *toolchainLinuxGlibcX8664) Cflags() string {
310 return t.toolchainLinuxX8664.Cflags() + " " + t.toolchainGlibc.Cflags()
311}
312
313func (t *toolchainLinuxGlibcX8664) Ldflags() string {
314 return t.toolchainLinuxX8664.Ldflags() + " " + t.toolchainGlibc.Ldflags()
315}
316
317func (t *toolchainLinuxGlibcX8664) Lldflags() string {
318 return t.toolchainLinuxX8664.Lldflags() + " " + t.toolchainGlibc.Lldflags()
319}
320
321var toolchainLinuxGlibcX86Singleton Toolchain = &toolchainLinuxGlibcX86{}
322var toolchainLinuxGlibcX8664Singleton Toolchain = &toolchainLinuxGlibcX8664{}
323
324func linuxGlibcX86ToolchainFactory(arch android.Arch) Toolchain {
325 return toolchainLinuxGlibcX86Singleton
326}
327
328func linuxGlibcX8664ToolchainFactory(arch android.Arch) Toolchain {
329 return toolchainLinuxGlibcX8664Singleton
330}
331
332// musl specialization of the linux toolchain
333
334type toolchainMusl struct {
335}
336
337func (toolchainMusl) Musl() bool { return true }
338
339func (toolchainMusl) CrtBeginStaticBinary() []string { return muslCrtBeginStaticBinary }
340func (toolchainMusl) CrtBeginSharedBinary() []string { return muslCrtBeginSharedBinary }
341func (toolchainMusl) CrtBeginSharedLibrary() []string { return muslCrtBeginSharedLibrary }
342func (toolchainMusl) CrtEndStaticBinary() []string { return muslCrtEndStaticBinary }
343func (toolchainMusl) CrtEndSharedBinary() []string { return muslCrtEndSharedBinary }
344func (toolchainMusl) CrtEndSharedLibrary() []string { return muslCrtEndSharedLibrary }
345
346func (toolchainMusl) DefaultSharedLibraries() []string { return muslDefaultSharedLibraries }
347
348func (toolchainMusl) Cflags() string {
349 return "${config.LinuxMuslCflags}"
350}
351
352func (toolchainMusl) Ldflags() string {
353 return "${config.LinuxMuslLdflags}"
354}
355
356func (toolchainMusl) Lldflags() string {
357 return "${config.LinuxMuslLldflags}"
358}
359
360type toolchainLinuxMuslX86 struct {
361 toolchainLinuxX86
362 toolchainMusl
363}
364
365type toolchainLinuxMuslX8664 struct {
366 toolchainLinuxX8664
367 toolchainMusl
368}
369
Colin Cross72ee6762022-01-28 14:05:22 -0800370func (t *toolchainLinuxMuslX86) ClangTriple() string {
371 return "i686-linux-musl"
372}
373
Colin Cross528d67e2021-07-23 22:23:07 +0000374func (t *toolchainLinuxMuslX86) Cflags() string {
375 return t.toolchainLinuxX86.Cflags() + " " + t.toolchainMusl.Cflags()
376}
377
378func (t *toolchainLinuxMuslX86) Ldflags() string {
379 return t.toolchainLinuxX86.Ldflags() + " " + t.toolchainMusl.Ldflags()
380}
381
382func (t *toolchainLinuxMuslX86) Lldflags() string {
383 return t.toolchainLinuxX86.Lldflags() + " " + t.toolchainMusl.Lldflags()
384}
385
Colin Cross72ee6762022-01-28 14:05:22 -0800386func (t *toolchainLinuxMuslX8664) ClangTriple() string {
387 return "x86_64-linux-musl"
388}
389
Colin Cross528d67e2021-07-23 22:23:07 +0000390func (t *toolchainLinuxMuslX8664) Cflags() string {
391 return t.toolchainLinuxX8664.Cflags() + " " + t.toolchainMusl.Cflags()
392}
393
394func (t *toolchainLinuxMuslX8664) Ldflags() string {
395 return t.toolchainLinuxX8664.Ldflags() + " " + t.toolchainMusl.Ldflags()
396}
397
398func (t *toolchainLinuxMuslX8664) Lldflags() string {
399 return t.toolchainLinuxX8664.Lldflags() + " " + t.toolchainMusl.Lldflags()
400}
401
402var toolchainLinuxMuslX86Singleton Toolchain = &toolchainLinuxMuslX86{}
403var toolchainLinuxMuslX8664Singleton Toolchain = &toolchainLinuxMuslX8664{}
404
405func linuxMuslX86ToolchainFactory(arch android.Arch) Toolchain {
406 return toolchainLinuxMuslX86Singleton
407}
408
409func linuxMuslX8664ToolchainFactory(arch android.Arch) Toolchain {
410 return toolchainLinuxMuslX8664Singleton
Colin Crossb98c8b02016-07-29 13:44:28 -0700411}
412
413func init() {
Colin Cross528d67e2021-07-23 22:23:07 +0000414 registerToolchainFactory(android.Linux, android.X86, linuxGlibcX86ToolchainFactory)
415 registerToolchainFactory(android.Linux, android.X86_64, linuxGlibcX8664ToolchainFactory)
416 registerToolchainFactory(android.LinuxMusl, android.X86, linuxMuslX86ToolchainFactory)
417 registerToolchainFactory(android.LinuxMusl, android.X86_64, linuxMuslX8664ToolchainFactory)
Colin Crossb98c8b02016-07-29 13:44:28 -0700418}