blob: 7f22377bf43f596169f02d0b48811a0b6521246c [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
Colin Cross33bac242021-07-14 17:03:16 -070033 "--gcc-toolchain=${LinuxGccRoot}",
Colin Cross5d6904e2021-07-23 22:20:29 +000034 "-fstack-protector-strong",
Colin Cross4fb4ef22021-07-19 14:11:03 -070035 }
36
Colin Cross528d67e2021-07-23 22:23:07 +000037 linuxGlibcCflags = []string{
38 "--sysroot ${LinuxGccRoot}/sysroot",
39 }
40
41 linuxMuslCflags = []string{
42 "-D_LIBCPP_HAS_MUSL_LIBC",
Colin Cross7e7b0282021-08-16 14:42:53 -070043 "-DANDROID_HOST_MUSL",
Colin Cross528d67e2021-07-23 22:23:07 +000044 "-nostdlibinc",
Colin Cross6745a8e2022-02-11 13:43:21 -080045 "--sysroot /dev/null",
Colin Cross528d67e2021-07-23 22:23:07 +000046 }
47
Colin Crossb98c8b02016-07-29 13:44:28 -070048 linuxLdflags = []string{
49 "-Wl,-z,noexecstack",
50 "-Wl,-z,relro",
51 "-Wl,-z,now",
52 "-Wl,--no-undefined-version",
Colin Cross33bac242021-07-14 17:03:16 -070053
54 "--gcc-toolchain=${LinuxGccRoot}",
Colin Cross528d67e2021-07-23 22:23:07 +000055 }
56
Eric Rahm19524712023-10-20 15:56:27 +000057 linuxLldflags = append(linuxLdflags,
58 "-Wl,--compress-debug-sections=zstd",
59 )
60
Colin Cross528d67e2021-07-23 22:23:07 +000061 linuxGlibcLdflags = []string{
Colin Cross33bac242021-07-14 17:03:16 -070062 "--sysroot ${LinuxGccRoot}/sysroot",
Colin Crossb98c8b02016-07-29 13:44:28 -070063 }
64
Colin Cross528d67e2021-07-23 22:23:07 +000065 linuxMuslLdflags = []string{
66 "-nostdlib",
Colin Cross6745a8e2022-02-11 13:43:21 -080067 "--sysroot /dev/null",
Colin Cross528d67e2021-07-23 22:23:07 +000068 }
69
Colin Crossb98c8b02016-07-29 13:44:28 -070070 // Extended cflags
71 linuxX86Cflags = []string{
72 "-msse3",
Colin Crossb98c8b02016-07-29 13:44:28 -070073 "-m32",
74 "-march=prescott",
75 "-D_FILE_OFFSET_BITS=64",
76 "-D_LARGEFILE_SOURCE=1",
77 }
78
79 linuxX8664Cflags = []string{
80 "-m64",
81 }
82
83 linuxX86Ldflags = []string{
84 "-m32",
Colin Cross33bac242021-07-14 17:03:16 -070085 "-B${LinuxGccRoot}/lib/gcc/${LinuxGccTriple}/${LinuxGccVersion}/32",
86 "-L${LinuxGccRoot}/lib/gcc/${LinuxGccTriple}/${LinuxGccVersion}/32",
87 "-L${LinuxGccRoot}/${LinuxGccTriple}/lib32",
Colin Crossb98c8b02016-07-29 13:44:28 -070088 }
89
90 linuxX8664Ldflags = []string{
91 "-m64",
Colin Crossb98c8b02016-07-29 13:44:28 -070092 "-B${LinuxGccRoot}/lib/gcc/${LinuxGccTriple}/${LinuxGccVersion}",
93 "-L${LinuxGccRoot}/lib/gcc/${LinuxGccTriple}/${LinuxGccVersion}",
94 "-L${LinuxGccRoot}/${LinuxGccTriple}/lib64",
Colin Cross33bac242021-07-14 17:03:16 -070095 }
Chih-Hung Hsieh3101a962018-04-17 14:16:05 -070096
Colin Crossb98c8b02016-07-29 13:44:28 -070097 linuxAvailableLibraries = addPrefix([]string{
98 "c",
99 "dl",
100 "gcc",
101 "gcc_s",
102 "m",
103 "ncurses",
104 "pthread",
105 "resolv",
106 "rt",
107 "util",
Colin Crossb98c8b02016-07-29 13:44:28 -0700108 }, "-l")
Colin Cross528d67e2021-07-23 22:23:07 +0000109
Colin Crossf26b4662021-08-18 13:55:01 -0700110 muslCrtBeginStaticBinary, muslCrtEndStaticBinary = []string{"libc_musl_crtbegin_static"}, []string{"libc_musl_crtend"}
Colin Cross3699f832022-09-16 17:26:24 +0000111 muslCrtBeginSharedBinary, muslCrtEndSharedBinary = []string{"libc_musl_crtbegin_dynamic"}, []string{"libc_musl_crtend"}
Colin Cross528d67e2021-07-23 22:23:07 +0000112 muslCrtBeginSharedLibrary, muslCrtEndSharedLibrary = []string{"libc_musl_crtbegin_so"}, []string{"libc_musl_crtend_so"}
113
Trevor Radcliffe0d1b4022022-12-12 22:26:34 +0000114 MuslDefaultSharedLibraries = []string{"libc_musl"}
Colin Crossb98c8b02016-07-29 13:44:28 -0700115)
116
117const (
George Burgess IV7294cdc2019-01-23 13:59:10 -0800118 linuxGccVersion = "4.8.3"
119 linuxGlibcVersion = "2.17"
Colin Crossb98c8b02016-07-29 13:44:28 -0700120)
121
122func init() {
Cole Faust8982b1c2024-04-08 16:54:45 -0700123 pctx.StaticVariable("LinuxGccVersion", linuxGccVersion)
124 pctx.StaticVariable("LinuxGlibcVersion", linuxGlibcVersion)
Chris Parsons3b1f83d2021-10-14 14:08:38 -0400125
George Burgess IV7294cdc2019-01-23 13:59:10 -0800126 // Most places use the full GCC version. A few only use up to the first two numbers.
127 if p := strings.Split(linuxGccVersion, "."); len(p) > 2 {
Cole Faust8982b1c2024-04-08 16:54:45 -0700128 pctx.StaticVariable("ShortLinuxGccVersion", strings.Join(p[:2], "."))
George Burgess IV7294cdc2019-01-23 13:59:10 -0800129 } else {
Cole Faust8982b1c2024-04-08 16:54:45 -0700130 pctx.StaticVariable("ShortLinuxGccVersion", linuxGccVersion)
George Burgess IV7294cdc2019-01-23 13:59:10 -0800131 }
Colin Crossb98c8b02016-07-29 13:44:28 -0700132
Cole Faust8982b1c2024-04-08 16:54:45 -0700133 pctx.SourcePathVariable("LinuxGccRoot",
Chris Parsons3b1f83d2021-10-14 14:08:38 -0400134 "prebuilts/gcc/linux-x86/host/x86_64-linux-glibc${LinuxGlibcVersion}-${ShortLinuxGccVersion}")
Colin Crossb98c8b02016-07-29 13:44:28 -0700135
Cole Faust8982b1c2024-04-08 16:54:45 -0700136 pctx.StaticVariable("LinuxGccTriple", "x86_64-linux")
Colin Crossb98c8b02016-07-29 13:44:28 -0700137
Cole Faust8982b1c2024-04-08 16:54:45 -0700138 pctx.StaticVariable("LinuxCflags", strings.Join(linuxCflags, " "))
139 pctx.StaticVariable("LinuxLdflags", strings.Join(linuxLdflags, " "))
140 pctx.StaticVariable("LinuxLldflags", strings.Join(linuxLldflags, " "))
141 pctx.StaticVariable("LinuxGlibcCflags", strings.Join(linuxGlibcCflags, " "))
142 pctx.StaticVariable("LinuxGlibcLdflags", strings.Join(linuxGlibcLdflags, " "))
143 pctx.StaticVariable("LinuxGlibcLldflags", strings.Join(linuxGlibcLdflags, " "))
144 pctx.StaticVariable("LinuxMuslCflags", strings.Join(linuxMuslCflags, " "))
145 pctx.StaticVariable("LinuxMuslLdflags", strings.Join(linuxMuslLdflags, " "))
146 pctx.StaticVariable("LinuxMuslLldflags", strings.Join(linuxMuslLdflags, " "))
Colin Crossb98c8b02016-07-29 13:44:28 -0700147
Cole Faust8982b1c2024-04-08 16:54:45 -0700148 pctx.StaticVariable("LinuxX86Cflags", strings.Join(linuxX86Cflags, " "))
149 pctx.StaticVariable("LinuxX8664Cflags", strings.Join(linuxX8664Cflags, " "))
150 pctx.StaticVariable("LinuxX86Ldflags", strings.Join(linuxX86Ldflags, " "))
151 pctx.StaticVariable("LinuxX86Lldflags", strings.Join(linuxX86Ldflags, " "))
152 pctx.StaticVariable("LinuxX8664Ldflags", strings.Join(linuxX8664Ldflags, " "))
153 pctx.StaticVariable("LinuxX8664Lldflags", strings.Join(linuxX8664Ldflags, " "))
Greg Hartman09302be2017-10-04 17:31:43 -0700154 // Yasm flags
Cole Faust8982b1c2024-04-08 16:54:45 -0700155 pctx.StaticVariable("LinuxX86YasmFlags", "-f elf32 -m x86")
156 pctx.StaticVariable("LinuxX8664YasmFlags", "-f elf64 -m amd64")
Colin Crossb98c8b02016-07-29 13:44:28 -0700157}
158
159type toolchainLinux struct {
Colin Crossfc3b0642022-09-01 11:02:15 -0700160 toolchainBase
Colin Crossb98c8b02016-07-29 13:44:28 -0700161 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
Colin Crossb98c8b02016-07-29 13:44:28 -0700182func (t *toolchainLinux) IncludeFlags() string {
183 return ""
184}
185
Colin Cross33bac242021-07-14 17:03:16 -0700186func (t *toolchainLinuxX86) Cflags() string {
Colin Cross0523ba22021-07-14 18:45:05 -0700187 return "${config.LinuxCflags} ${config.LinuxX86Cflags}"
Colin Crossb98c8b02016-07-29 13:44:28 -0700188}
189
Colin Cross33bac242021-07-14 17:03:16 -0700190func (t *toolchainLinuxX86) Cppflags() string {
Logan Chienbef00a22018-07-27 06:27:53 +0800191 return ""
Colin Crossb98c8b02016-07-29 13:44:28 -0700192}
193
Colin Cross33bac242021-07-14 17:03:16 -0700194func (t *toolchainLinuxX8664) Cflags() string {
Colin Cross0523ba22021-07-14 18:45:05 -0700195 return "${config.LinuxCflags} ${config.LinuxX8664Cflags}"
Colin Crossb98c8b02016-07-29 13:44:28 -0700196}
197
Colin Cross33bac242021-07-14 17:03:16 -0700198func (t *toolchainLinuxX8664) Cppflags() string {
Logan Chienbef00a22018-07-27 06:27:53 +0800199 return ""
Colin Crossb98c8b02016-07-29 13:44:28 -0700200}
201
Colin Cross33bac242021-07-14 17:03:16 -0700202func (t *toolchainLinuxX86) Ldflags() string {
Colin Cross0523ba22021-07-14 18:45:05 -0700203 return "${config.LinuxLdflags} ${config.LinuxX86Ldflags}"
Colin Crossb98c8b02016-07-29 13:44:28 -0700204}
205
Colin Cross33bac242021-07-14 17:03:16 -0700206func (t *toolchainLinuxX86) Lldflags() string {
Colin Cross0523ba22021-07-14 18:45:05 -0700207 return "${config.LinuxLldflags} ${config.LinuxX86Lldflags}"
Chih-Hung Hsieh02b4da52018-04-03 11:33:34 -0700208}
209
Colin Cross33bac242021-07-14 17:03:16 -0700210func (t *toolchainLinuxX8664) Ldflags() string {
Colin Cross0523ba22021-07-14 18:45:05 -0700211 return "${config.LinuxLdflags} ${config.LinuxX8664Ldflags}"
Colin Crossb98c8b02016-07-29 13:44:28 -0700212}
213
Colin Cross33bac242021-07-14 17:03:16 -0700214func (t *toolchainLinuxX8664) Lldflags() string {
Colin Cross0523ba22021-07-14 18:45:05 -0700215 return "${config.LinuxLldflags} ${config.LinuxX8664Lldflags}"
Chih-Hung Hsieh02b4da52018-04-03 11:33:34 -0700216}
217
Greg Hartman09302be2017-10-04 17:31:43 -0700218func (t *toolchainLinuxX86) YasmFlags() string {
219 return "${config.LinuxX86YasmFlags}"
220}
221
222func (t *toolchainLinuxX8664) YasmFlags() string {
223 return "${config.LinuxX8664YasmFlags}"
224}
225
Mitch Phillipsda9a4632019-07-15 09:34:09 -0700226func (toolchainLinuxX86) LibclangRuntimeLibraryArch() string {
Ivan Lozano9ac32c72020-02-19 15:24:02 -0500227 return "i386"
Mitch Phillipsda9a4632019-07-15 09:34:09 -0700228}
229
230func (toolchainLinuxX8664) LibclangRuntimeLibraryArch() string {
231 return "x86_64"
232}
233
Colin Crossb98c8b02016-07-29 13:44:28 -0700234func (t *toolchainLinux) AvailableLibraries() []string {
235 return linuxAvailableLibraries
236}
237
Colin Crossfc3b0642022-09-01 11:02:15 -0700238func (toolchainLinux) ShlibSuffix() string {
239 return ".so"
240}
241
242func (toolchainLinux) ExecutableSuffix() string {
243 return ""
244}
245
Colin Cross528d67e2021-07-23 22:23:07 +0000246// glibc specialization of the linux toolchain
Colin Crossb98c8b02016-07-29 13:44:28 -0700247
Colin Cross528d67e2021-07-23 22:23:07 +0000248type toolchainGlibc struct {
Colin Crossfc3b0642022-09-01 11:02:15 -0700249 toolchainNoCrt
Colin Crossb98c8b02016-07-29 13:44:28 -0700250}
251
Colin Cross528d67e2021-07-23 22:23:07 +0000252func (toolchainGlibc) Glibc() bool { return true }
253
254func (toolchainGlibc) Cflags() string {
255 return "${config.LinuxGlibcCflags}"
256}
257
258func (toolchainGlibc) Ldflags() string {
259 return "${config.LinuxGlibcLdflags}"
260}
261
262func (toolchainGlibc) Lldflags() string {
263 return "${config.LinuxGlibcLldflags}"
264}
265
266type toolchainLinuxGlibcX86 struct {
267 toolchainLinuxX86
268 toolchainGlibc
269}
270
271type toolchainLinuxGlibcX8664 struct {
272 toolchainLinuxX8664
273 toolchainGlibc
274}
275
Colin Cross72ee6762022-01-28 14:05:22 -0800276func (t *toolchainLinuxGlibcX86) ClangTriple() string {
277 return "i686-linux-gnu"
278}
279
Colin Cross528d67e2021-07-23 22:23:07 +0000280func (t *toolchainLinuxGlibcX86) Cflags() string {
281 return t.toolchainLinuxX86.Cflags() + " " + t.toolchainGlibc.Cflags()
282}
283
284func (t *toolchainLinuxGlibcX86) Ldflags() string {
285 return t.toolchainLinuxX86.Ldflags() + " " + t.toolchainGlibc.Ldflags()
286}
287
288func (t *toolchainLinuxGlibcX86) Lldflags() string {
289 return t.toolchainLinuxX86.Lldflags() + " " + t.toolchainGlibc.Lldflags()
290}
291
Colin Cross72ee6762022-01-28 14:05:22 -0800292func (t *toolchainLinuxGlibcX8664) ClangTriple() string {
293 return "x86_64-linux-gnu"
294}
295
Colin Cross528d67e2021-07-23 22:23:07 +0000296func (t *toolchainLinuxGlibcX8664) Cflags() string {
297 return t.toolchainLinuxX8664.Cflags() + " " + t.toolchainGlibc.Cflags()
298}
299
300func (t *toolchainLinuxGlibcX8664) Ldflags() string {
301 return t.toolchainLinuxX8664.Ldflags() + " " + t.toolchainGlibc.Ldflags()
302}
303
304func (t *toolchainLinuxGlibcX8664) Lldflags() string {
305 return t.toolchainLinuxX8664.Lldflags() + " " + t.toolchainGlibc.Lldflags()
306}
307
308var toolchainLinuxGlibcX86Singleton Toolchain = &toolchainLinuxGlibcX86{}
309var toolchainLinuxGlibcX8664Singleton Toolchain = &toolchainLinuxGlibcX8664{}
310
311func linuxGlibcX86ToolchainFactory(arch android.Arch) Toolchain {
312 return toolchainLinuxGlibcX86Singleton
313}
314
315func linuxGlibcX8664ToolchainFactory(arch android.Arch) Toolchain {
316 return toolchainLinuxGlibcX8664Singleton
317}
318
319// musl specialization of the linux toolchain
320
321type toolchainMusl struct {
322}
323
324func (toolchainMusl) Musl() bool { return true }
325
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -0800326func (toolchainMusl) CrtBeginStaticBinary() []string { return muslCrtBeginStaticBinary }
327func (toolchainMusl) CrtBeginSharedBinary() []string { return muslCrtBeginSharedBinary }
328func (toolchainMusl) CrtBeginSharedLibrary() []string { return muslCrtBeginSharedLibrary }
329func (toolchainMusl) CrtEndStaticBinary() []string { return muslCrtEndStaticBinary }
330func (toolchainMusl) CrtEndSharedBinary() []string { return muslCrtEndSharedBinary }
331func (toolchainMusl) CrtEndSharedLibrary() []string { return muslCrtEndSharedLibrary }
332func (toolchainMusl) CrtPadSegmentSharedLibrary() []string { return nil }
Colin Cross528d67e2021-07-23 22:23:07 +0000333
Trevor Radcliffe0d1b4022022-12-12 22:26:34 +0000334func (toolchainMusl) DefaultSharedLibraries() []string { return MuslDefaultSharedLibraries }
Colin Cross528d67e2021-07-23 22:23:07 +0000335
336func (toolchainMusl) Cflags() string {
337 return "${config.LinuxMuslCflags}"
338}
339
340func (toolchainMusl) Ldflags() string {
341 return "${config.LinuxMuslLdflags}"
342}
343
344func (toolchainMusl) Lldflags() string {
345 return "${config.LinuxMuslLldflags}"
346}
347
348type toolchainLinuxMuslX86 struct {
349 toolchainLinuxX86
350 toolchainMusl
351}
352
353type toolchainLinuxMuslX8664 struct {
354 toolchainLinuxX8664
355 toolchainMusl
356}
357
Colin Cross72ee6762022-01-28 14:05:22 -0800358func (t *toolchainLinuxMuslX86) ClangTriple() string {
359 return "i686-linux-musl"
360}
361
Colin Cross528d67e2021-07-23 22:23:07 +0000362func (t *toolchainLinuxMuslX86) Cflags() string {
363 return t.toolchainLinuxX86.Cflags() + " " + t.toolchainMusl.Cflags()
364}
365
366func (t *toolchainLinuxMuslX86) Ldflags() string {
367 return t.toolchainLinuxX86.Ldflags() + " " + t.toolchainMusl.Ldflags()
368}
369
370func (t *toolchainLinuxMuslX86) Lldflags() string {
371 return t.toolchainLinuxX86.Lldflags() + " " + t.toolchainMusl.Lldflags()
372}
373
Colin Cross72ee6762022-01-28 14:05:22 -0800374func (t *toolchainLinuxMuslX8664) ClangTriple() string {
375 return "x86_64-linux-musl"
376}
377
Colin Cross528d67e2021-07-23 22:23:07 +0000378func (t *toolchainLinuxMuslX8664) Cflags() string {
379 return t.toolchainLinuxX8664.Cflags() + " " + t.toolchainMusl.Cflags()
380}
381
382func (t *toolchainLinuxMuslX8664) Ldflags() string {
383 return t.toolchainLinuxX8664.Ldflags() + " " + t.toolchainMusl.Ldflags()
384}
385
386func (t *toolchainLinuxMuslX8664) Lldflags() string {
387 return t.toolchainLinuxX8664.Lldflags() + " " + t.toolchainMusl.Lldflags()
388}
389
390var toolchainLinuxMuslX86Singleton Toolchain = &toolchainLinuxMuslX86{}
391var toolchainLinuxMuslX8664Singleton Toolchain = &toolchainLinuxMuslX8664{}
392
393func linuxMuslX86ToolchainFactory(arch android.Arch) Toolchain {
394 return toolchainLinuxMuslX86Singleton
395}
396
397func linuxMuslX8664ToolchainFactory(arch android.Arch) Toolchain {
398 return toolchainLinuxMuslX8664Singleton
Colin Crossb98c8b02016-07-29 13:44:28 -0700399}
400
401func init() {
Colin Cross528d67e2021-07-23 22:23:07 +0000402 registerToolchainFactory(android.Linux, android.X86, linuxGlibcX86ToolchainFactory)
403 registerToolchainFactory(android.Linux, android.X86_64, linuxGlibcX8664ToolchainFactory)
404 registerToolchainFactory(android.LinuxMusl, android.X86, linuxMuslX86ToolchainFactory)
405 registerToolchainFactory(android.LinuxMusl, android.X86_64, linuxMuslX8664ToolchainFactory)
Colin Crossb98c8b02016-07-29 13:44:28 -0700406}