blob: f95da0b3b87f068eed94c1fc28d67cad0444bedc [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
Eric Rahm19524712023-10-20 15:56:27 +000062 linuxLldflags = append(linuxLdflags,
63 "-Wl,--compress-debug-sections=zstd",
64 )
65
Colin Cross528d67e2021-07-23 22:23:07 +000066 linuxGlibcLdflags = []string{
Colin Cross33bac242021-07-14 17:03:16 -070067 "--sysroot ${LinuxGccRoot}/sysroot",
Colin Crossb98c8b02016-07-29 13:44:28 -070068 }
69
Colin Cross528d67e2021-07-23 22:23:07 +000070 linuxMuslLdflags = []string{
71 "-nostdlib",
Colin Cross6745a8e2022-02-11 13:43:21 -080072 "--sysroot /dev/null",
Colin Cross528d67e2021-07-23 22:23:07 +000073 }
74
Colin Crossb98c8b02016-07-29 13:44:28 -070075 // Extended cflags
76 linuxX86Cflags = []string{
77 "-msse3",
Colin Crossb98c8b02016-07-29 13:44:28 -070078 "-m32",
79 "-march=prescott",
80 "-D_FILE_OFFSET_BITS=64",
81 "-D_LARGEFILE_SOURCE=1",
82 }
83
84 linuxX8664Cflags = []string{
85 "-m64",
86 }
87
88 linuxX86Ldflags = []string{
89 "-m32",
Colin Cross33bac242021-07-14 17:03:16 -070090 "-B${LinuxGccRoot}/lib/gcc/${LinuxGccTriple}/${LinuxGccVersion}/32",
91 "-L${LinuxGccRoot}/lib/gcc/${LinuxGccTriple}/${LinuxGccVersion}/32",
92 "-L${LinuxGccRoot}/${LinuxGccTriple}/lib32",
Colin Crossb98c8b02016-07-29 13:44:28 -070093 }
94
95 linuxX8664Ldflags = []string{
96 "-m64",
Colin Crossb98c8b02016-07-29 13:44:28 -070097 "-B${LinuxGccRoot}/lib/gcc/${LinuxGccTriple}/${LinuxGccVersion}",
98 "-L${LinuxGccRoot}/lib/gcc/${LinuxGccTriple}/${LinuxGccVersion}",
99 "-L${LinuxGccRoot}/${LinuxGccTriple}/lib64",
Colin Cross33bac242021-07-14 17:03:16 -0700100 }
Chih-Hung Hsieh3101a962018-04-17 14:16:05 -0700101
Colin Crossb98c8b02016-07-29 13:44:28 -0700102 linuxAvailableLibraries = addPrefix([]string{
103 "c",
104 "dl",
105 "gcc",
106 "gcc_s",
107 "m",
108 "ncurses",
109 "pthread",
110 "resolv",
111 "rt",
112 "util",
Colin Crossb98c8b02016-07-29 13:44:28 -0700113 }, "-l")
Colin Cross528d67e2021-07-23 22:23:07 +0000114
Colin Crossf26b4662021-08-18 13:55:01 -0700115 muslCrtBeginStaticBinary, muslCrtEndStaticBinary = []string{"libc_musl_crtbegin_static"}, []string{"libc_musl_crtend"}
Colin Cross3699f832022-09-16 17:26:24 +0000116 muslCrtBeginSharedBinary, muslCrtEndSharedBinary = []string{"libc_musl_crtbegin_dynamic"}, []string{"libc_musl_crtend"}
Colin Cross528d67e2021-07-23 22:23:07 +0000117 muslCrtBeginSharedLibrary, muslCrtEndSharedLibrary = []string{"libc_musl_crtbegin_so"}, []string{"libc_musl_crtend_so"}
118
Trevor Radcliffe0d1b4022022-12-12 22:26:34 +0000119 MuslDefaultSharedLibraries = []string{"libc_musl"}
Colin Crossb98c8b02016-07-29 13:44:28 -0700120)
121
122const (
George Burgess IV7294cdc2019-01-23 13:59:10 -0800123 linuxGccVersion = "4.8.3"
124 linuxGlibcVersion = "2.17"
Colin Crossb98c8b02016-07-29 13:44:28 -0700125)
126
127func init() {
Sam Delmerico7f889562022-03-25 14:55:40 +0000128 exportedVars.ExportStringStaticVariable("LinuxGccVersion", linuxGccVersion)
129 exportedVars.ExportStringStaticVariable("LinuxGlibcVersion", linuxGlibcVersion)
Chris Parsons3b1f83d2021-10-14 14:08:38 -0400130
George Burgess IV7294cdc2019-01-23 13:59:10 -0800131 // Most places use the full GCC version. A few only use up to the first two numbers.
132 if p := strings.Split(linuxGccVersion, "."); len(p) > 2 {
Sam Delmerico7f889562022-03-25 14:55:40 +0000133 exportedVars.ExportStringStaticVariable("ShortLinuxGccVersion", strings.Join(p[:2], "."))
George Burgess IV7294cdc2019-01-23 13:59:10 -0800134 } else {
Sam Delmerico7f889562022-03-25 14:55:40 +0000135 exportedVars.ExportStringStaticVariable("ShortLinuxGccVersion", linuxGccVersion)
George Burgess IV7294cdc2019-01-23 13:59:10 -0800136 }
Colin Crossb98c8b02016-07-29 13:44:28 -0700137
Sam Delmerico7f889562022-03-25 14:55:40 +0000138 exportedVars.ExportSourcePathVariable("LinuxGccRoot",
Chris Parsons3b1f83d2021-10-14 14:08:38 -0400139 "prebuilts/gcc/linux-x86/host/x86_64-linux-glibc${LinuxGlibcVersion}-${ShortLinuxGccVersion}")
Colin Crossb98c8b02016-07-29 13:44:28 -0700140
Sam Delmerico7f889562022-03-25 14:55:40 +0000141 exportedVars.ExportStringListStaticVariable("LinuxGccTriple", []string{"x86_64-linux"})
Colin Crossb98c8b02016-07-29 13:44:28 -0700142
Sam Delmerico7f889562022-03-25 14:55:40 +0000143 exportedVars.ExportStringListStaticVariable("LinuxCflags", linuxCflags)
144 exportedVars.ExportStringListStaticVariable("LinuxLdflags", linuxLdflags)
Eric Rahm19524712023-10-20 15:56:27 +0000145 exportedVars.ExportStringListStaticVariable("LinuxLldflags", linuxLldflags)
Sam Delmerico7f889562022-03-25 14:55:40 +0000146 exportedVars.ExportStringListStaticVariable("LinuxGlibcCflags", linuxGlibcCflags)
147 exportedVars.ExportStringListStaticVariable("LinuxGlibcLdflags", linuxGlibcLdflags)
148 exportedVars.ExportStringListStaticVariable("LinuxGlibcLldflags", linuxGlibcLdflags)
149 exportedVars.ExportStringListStaticVariable("LinuxMuslCflags", linuxMuslCflags)
150 exportedVars.ExportStringListStaticVariable("LinuxMuslLdflags", linuxMuslLdflags)
151 exportedVars.ExportStringListStaticVariable("LinuxMuslLldflags", linuxMuslLdflags)
Colin Crossb98c8b02016-07-29 13:44:28 -0700152
Sam Delmerico7f889562022-03-25 14:55:40 +0000153 exportedVars.ExportStringListStaticVariable("LinuxX86Cflags", linuxX86Cflags)
154 exportedVars.ExportStringListStaticVariable("LinuxX8664Cflags", linuxX8664Cflags)
155 exportedVars.ExportStringListStaticVariable("LinuxX86Ldflags", linuxX86Ldflags)
156 exportedVars.ExportStringListStaticVariable("LinuxX86Lldflags", linuxX86Ldflags)
157 exportedVars.ExportStringListStaticVariable("LinuxX8664Ldflags", linuxX8664Ldflags)
158 exportedVars.ExportStringListStaticVariable("LinuxX8664Lldflags", linuxX8664Ldflags)
Greg Hartman09302be2017-10-04 17:31:43 -0700159 // Yasm flags
Sam Delmerico7f889562022-03-25 14:55:40 +0000160 exportedVars.ExportStringListStaticVariable("LinuxX86YasmFlags", []string{"-f elf32 -m x86"})
161 exportedVars.ExportStringListStaticVariable("LinuxX8664YasmFlags", []string{"-f elf64 -m amd64"})
Colin Crossb98c8b02016-07-29 13:44:28 -0700162}
163
164type toolchainLinux struct {
Colin Crossfc3b0642022-09-01 11:02:15 -0700165 toolchainBase
Colin Crossb98c8b02016-07-29 13:44:28 -0700166 cFlags, ldFlags string
167}
168
169type toolchainLinuxX86 struct {
170 toolchain32Bit
171 toolchainLinux
172}
173
174type toolchainLinuxX8664 struct {
175 toolchain64Bit
176 toolchainLinux
177}
178
179func (t *toolchainLinuxX86) Name() string {
180 return "x86"
181}
182
183func (t *toolchainLinuxX8664) Name() string {
184 return "x86_64"
185}
186
Colin Crossb98c8b02016-07-29 13:44:28 -0700187func (t *toolchainLinux) IncludeFlags() string {
188 return ""
189}
190
Colin Cross33bac242021-07-14 17:03:16 -0700191func (t *toolchainLinuxX86) Cflags() string {
Colin Cross0523ba22021-07-14 18:45:05 -0700192 return "${config.LinuxCflags} ${config.LinuxX86Cflags}"
Colin Crossb98c8b02016-07-29 13:44:28 -0700193}
194
Colin Cross33bac242021-07-14 17:03:16 -0700195func (t *toolchainLinuxX86) Cppflags() string {
Logan Chienbef00a22018-07-27 06:27:53 +0800196 return ""
Colin Crossb98c8b02016-07-29 13:44:28 -0700197}
198
Colin Cross33bac242021-07-14 17:03:16 -0700199func (t *toolchainLinuxX8664) Cflags() string {
Colin Cross0523ba22021-07-14 18:45:05 -0700200 return "${config.LinuxCflags} ${config.LinuxX8664Cflags}"
Colin Crossb98c8b02016-07-29 13:44:28 -0700201}
202
Colin Cross33bac242021-07-14 17:03:16 -0700203func (t *toolchainLinuxX8664) 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 *toolchainLinuxX86) Ldflags() string {
Colin Cross0523ba22021-07-14 18:45:05 -0700208 return "${config.LinuxLdflags} ${config.LinuxX86Ldflags}"
Colin Crossb98c8b02016-07-29 13:44:28 -0700209}
210
Colin Cross33bac242021-07-14 17:03:16 -0700211func (t *toolchainLinuxX86) Lldflags() string {
Colin Cross0523ba22021-07-14 18:45:05 -0700212 return "${config.LinuxLldflags} ${config.LinuxX86Lldflags}"
Chih-Hung Hsieh02b4da52018-04-03 11:33:34 -0700213}
214
Colin Cross33bac242021-07-14 17:03:16 -0700215func (t *toolchainLinuxX8664) Ldflags() string {
Colin Cross0523ba22021-07-14 18:45:05 -0700216 return "${config.LinuxLdflags} ${config.LinuxX8664Ldflags}"
Colin Crossb98c8b02016-07-29 13:44:28 -0700217}
218
Colin Cross33bac242021-07-14 17:03:16 -0700219func (t *toolchainLinuxX8664) Lldflags() string {
Colin Cross0523ba22021-07-14 18:45:05 -0700220 return "${config.LinuxLldflags} ${config.LinuxX8664Lldflags}"
Chih-Hung Hsieh02b4da52018-04-03 11:33:34 -0700221}
222
Greg Hartman09302be2017-10-04 17:31:43 -0700223func (t *toolchainLinuxX86) YasmFlags() string {
224 return "${config.LinuxX86YasmFlags}"
225}
226
227func (t *toolchainLinuxX8664) YasmFlags() string {
228 return "${config.LinuxX8664YasmFlags}"
229}
230
Mitch Phillipsda9a4632019-07-15 09:34:09 -0700231func (toolchainLinuxX86) LibclangRuntimeLibraryArch() string {
Ivan Lozano9ac32c72020-02-19 15:24:02 -0500232 return "i386"
Mitch Phillipsda9a4632019-07-15 09:34:09 -0700233}
234
235func (toolchainLinuxX8664) LibclangRuntimeLibraryArch() string {
236 return "x86_64"
237}
238
Colin Crossb98c8b02016-07-29 13:44:28 -0700239func (t *toolchainLinux) AvailableLibraries() []string {
240 return linuxAvailableLibraries
241}
242
Colin Crossfc3b0642022-09-01 11:02:15 -0700243func (toolchainLinux) ShlibSuffix() string {
244 return ".so"
245}
246
247func (toolchainLinux) ExecutableSuffix() string {
248 return ""
249}
250
Colin Cross528d67e2021-07-23 22:23:07 +0000251// glibc specialization of the linux toolchain
Colin Crossb98c8b02016-07-29 13:44:28 -0700252
Colin Cross528d67e2021-07-23 22:23:07 +0000253type toolchainGlibc struct {
Colin Crossfc3b0642022-09-01 11:02:15 -0700254 toolchainNoCrt
Colin Crossb98c8b02016-07-29 13:44:28 -0700255}
256
Colin Cross528d67e2021-07-23 22:23:07 +0000257func (toolchainGlibc) Glibc() bool { return true }
258
259func (toolchainGlibc) Cflags() string {
260 return "${config.LinuxGlibcCflags}"
261}
262
263func (toolchainGlibc) Ldflags() string {
264 return "${config.LinuxGlibcLdflags}"
265}
266
267func (toolchainGlibc) Lldflags() string {
268 return "${config.LinuxGlibcLldflags}"
269}
270
271type toolchainLinuxGlibcX86 struct {
272 toolchainLinuxX86
273 toolchainGlibc
274}
275
276type toolchainLinuxGlibcX8664 struct {
277 toolchainLinuxX8664
278 toolchainGlibc
279}
280
Colin Cross72ee6762022-01-28 14:05:22 -0800281func (t *toolchainLinuxGlibcX86) ClangTriple() string {
282 return "i686-linux-gnu"
283}
284
Colin Cross528d67e2021-07-23 22:23:07 +0000285func (t *toolchainLinuxGlibcX86) Cflags() string {
286 return t.toolchainLinuxX86.Cflags() + " " + t.toolchainGlibc.Cflags()
287}
288
289func (t *toolchainLinuxGlibcX86) Ldflags() string {
290 return t.toolchainLinuxX86.Ldflags() + " " + t.toolchainGlibc.Ldflags()
291}
292
293func (t *toolchainLinuxGlibcX86) Lldflags() string {
294 return t.toolchainLinuxX86.Lldflags() + " " + t.toolchainGlibc.Lldflags()
295}
296
Colin Cross72ee6762022-01-28 14:05:22 -0800297func (t *toolchainLinuxGlibcX8664) ClangTriple() string {
298 return "x86_64-linux-gnu"
299}
300
Colin Cross528d67e2021-07-23 22:23:07 +0000301func (t *toolchainLinuxGlibcX8664) Cflags() string {
302 return t.toolchainLinuxX8664.Cflags() + " " + t.toolchainGlibc.Cflags()
303}
304
305func (t *toolchainLinuxGlibcX8664) Ldflags() string {
306 return t.toolchainLinuxX8664.Ldflags() + " " + t.toolchainGlibc.Ldflags()
307}
308
309func (t *toolchainLinuxGlibcX8664) Lldflags() string {
310 return t.toolchainLinuxX8664.Lldflags() + " " + t.toolchainGlibc.Lldflags()
311}
312
313var toolchainLinuxGlibcX86Singleton Toolchain = &toolchainLinuxGlibcX86{}
314var toolchainLinuxGlibcX8664Singleton Toolchain = &toolchainLinuxGlibcX8664{}
315
316func linuxGlibcX86ToolchainFactory(arch android.Arch) Toolchain {
317 return toolchainLinuxGlibcX86Singleton
318}
319
320func linuxGlibcX8664ToolchainFactory(arch android.Arch) Toolchain {
321 return toolchainLinuxGlibcX8664Singleton
322}
323
324// musl specialization of the linux toolchain
325
326type toolchainMusl struct {
327}
328
329func (toolchainMusl) Musl() bool { return true }
330
331func (toolchainMusl) CrtBeginStaticBinary() []string { return muslCrtBeginStaticBinary }
332func (toolchainMusl) CrtBeginSharedBinary() []string { return muslCrtBeginSharedBinary }
333func (toolchainMusl) CrtBeginSharedLibrary() []string { return muslCrtBeginSharedLibrary }
334func (toolchainMusl) CrtEndStaticBinary() []string { return muslCrtEndStaticBinary }
335func (toolchainMusl) CrtEndSharedBinary() []string { return muslCrtEndSharedBinary }
336func (toolchainMusl) CrtEndSharedLibrary() []string { return muslCrtEndSharedLibrary }
337
Trevor Radcliffe0d1b4022022-12-12 22:26:34 +0000338func (toolchainMusl) DefaultSharedLibraries() []string { return MuslDefaultSharedLibraries }
Colin Cross528d67e2021-07-23 22:23:07 +0000339
340func (toolchainMusl) Cflags() string {
341 return "${config.LinuxMuslCflags}"
342}
343
344func (toolchainMusl) Ldflags() string {
345 return "${config.LinuxMuslLdflags}"
346}
347
348func (toolchainMusl) Lldflags() string {
349 return "${config.LinuxMuslLldflags}"
350}
351
352type toolchainLinuxMuslX86 struct {
353 toolchainLinuxX86
354 toolchainMusl
355}
356
357type toolchainLinuxMuslX8664 struct {
358 toolchainLinuxX8664
359 toolchainMusl
360}
361
Colin Cross72ee6762022-01-28 14:05:22 -0800362func (t *toolchainLinuxMuslX86) ClangTriple() string {
363 return "i686-linux-musl"
364}
365
Colin Cross528d67e2021-07-23 22:23:07 +0000366func (t *toolchainLinuxMuslX86) Cflags() string {
367 return t.toolchainLinuxX86.Cflags() + " " + t.toolchainMusl.Cflags()
368}
369
370func (t *toolchainLinuxMuslX86) Ldflags() string {
371 return t.toolchainLinuxX86.Ldflags() + " " + t.toolchainMusl.Ldflags()
372}
373
374func (t *toolchainLinuxMuslX86) Lldflags() string {
375 return t.toolchainLinuxX86.Lldflags() + " " + t.toolchainMusl.Lldflags()
376}
377
Colin Cross72ee6762022-01-28 14:05:22 -0800378func (t *toolchainLinuxMuslX8664) ClangTriple() string {
379 return "x86_64-linux-musl"
380}
381
Colin Cross528d67e2021-07-23 22:23:07 +0000382func (t *toolchainLinuxMuslX8664) Cflags() string {
383 return t.toolchainLinuxX8664.Cflags() + " " + t.toolchainMusl.Cflags()
384}
385
386func (t *toolchainLinuxMuslX8664) Ldflags() string {
387 return t.toolchainLinuxX8664.Ldflags() + " " + t.toolchainMusl.Ldflags()
388}
389
390func (t *toolchainLinuxMuslX8664) Lldflags() string {
391 return t.toolchainLinuxX8664.Lldflags() + " " + t.toolchainMusl.Lldflags()
392}
393
394var toolchainLinuxMuslX86Singleton Toolchain = &toolchainLinuxMuslX86{}
395var toolchainLinuxMuslX8664Singleton Toolchain = &toolchainLinuxMuslX8664{}
396
397func linuxMuslX86ToolchainFactory(arch android.Arch) Toolchain {
398 return toolchainLinuxMuslX86Singleton
399}
400
401func linuxMuslX8664ToolchainFactory(arch android.Arch) Toolchain {
402 return toolchainLinuxMuslX8664Singleton
Colin Crossb98c8b02016-07-29 13:44:28 -0700403}
404
405func init() {
Colin Cross528d67e2021-07-23 22:23:07 +0000406 registerToolchainFactory(android.Linux, android.X86, linuxGlibcX86ToolchainFactory)
407 registerToolchainFactory(android.Linux, android.X86_64, linuxGlibcX8664ToolchainFactory)
408 registerToolchainFactory(android.LinuxMusl, android.X86, linuxMuslX86ToolchainFactory)
409 registerToolchainFactory(android.LinuxMusl, android.X86_64, linuxMuslX8664ToolchainFactory)
Colin Crossb98c8b02016-07-29 13:44:28 -0700410}