blob: ce6836ba5e6b742ff665799ccac1df40b037b2ea [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",
68 "-lgcc", "-lgcc_eh",
Colin Cross6745a8e2022-02-11 13:43:21 -080069 "--sysroot /dev/null",
Colin Cross528d67e2021-07-23 22:23:07 +000070 }
71
Colin Crossb98c8b02016-07-29 13:44:28 -070072 // Extended cflags
73 linuxX86Cflags = []string{
74 "-msse3",
Colin Crossb98c8b02016-07-29 13:44:28 -070075 "-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",
Colin Cross33bac242021-07-14 17:03:16 -070087 "-B${LinuxGccRoot}/lib/gcc/${LinuxGccTriple}/${LinuxGccVersion}/32",
88 "-L${LinuxGccRoot}/lib/gcc/${LinuxGccTriple}/${LinuxGccVersion}/32",
89 "-L${LinuxGccRoot}/${LinuxGccTriple}/lib32",
Colin Crossb98c8b02016-07-29 13:44:28 -070090 }
91
92 linuxX8664Ldflags = []string{
93 "-m64",
Colin Crossb98c8b02016-07-29 13:44:28 -070094 "-B${LinuxGccRoot}/lib/gcc/${LinuxGccTriple}/${LinuxGccVersion}",
95 "-L${LinuxGccRoot}/lib/gcc/${LinuxGccTriple}/${LinuxGccVersion}",
96 "-L${LinuxGccRoot}/${LinuxGccTriple}/lib64",
Colin Cross33bac242021-07-14 17:03:16 -070097 }
Chih-Hung Hsieh3101a962018-04-17 14:16:05 -070098
Colin Crossb98c8b02016-07-29 13:44:28 -070099 linuxAvailableLibraries = addPrefix([]string{
100 "c",
101 "dl",
102 "gcc",
103 "gcc_s",
104 "m",
105 "ncurses",
106 "pthread",
107 "resolv",
108 "rt",
109 "util",
Colin Crossb98c8b02016-07-29 13:44:28 -0700110 }, "-l")
Colin Cross528d67e2021-07-23 22:23:07 +0000111
Colin Crossf26b4662021-08-18 13:55:01 -0700112 muslCrtBeginStaticBinary, muslCrtEndStaticBinary = []string{"libc_musl_crtbegin_static"}, []string{"libc_musl_crtend"}
Colin Cross528d67e2021-07-23 22:23:07 +0000113 muslCrtBeginSharedBinary, muslCrtEndSharedBinary = []string{"libc_musl_crtbegin_dynamic", "musl_linker_script"}, []string{"libc_musl_crtend"}
114 muslCrtBeginSharedLibrary, muslCrtEndSharedLibrary = []string{"libc_musl_crtbegin_so"}, []string{"libc_musl_crtend_so"}
115
Colin Cross90a8b3a2021-08-02 13:17:13 -0700116 muslDefaultSharedLibraries = []string{"libc_musl"}
Colin Crossb98c8b02016-07-29 13:44:28 -0700117)
118
119const (
George Burgess IV7294cdc2019-01-23 13:59:10 -0800120 linuxGccVersion = "4.8.3"
121 linuxGlibcVersion = "2.17"
Colin Crossb98c8b02016-07-29 13:44:28 -0700122)
123
124func init() {
Chris Parsons3b1f83d2021-10-14 14:08:38 -0400125 exportStringStaticVariable("LinuxGccVersion", linuxGccVersion)
126 exportStringStaticVariable("LinuxGlibcVersion", linuxGlibcVersion)
127
George Burgess IV7294cdc2019-01-23 13:59:10 -0800128 // 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 {
Chris Parsons3b1f83d2021-10-14 14:08:38 -0400130 exportStringStaticVariable("ShortLinuxGccVersion", strings.Join(p[:2], "."))
George Burgess IV7294cdc2019-01-23 13:59:10 -0800131 } else {
Chris Parsons3b1f83d2021-10-14 14:08:38 -0400132 exportStringStaticVariable("ShortLinuxGccVersion", linuxGccVersion)
George Burgess IV7294cdc2019-01-23 13:59:10 -0800133 }
Colin Crossb98c8b02016-07-29 13:44:28 -0700134
Chris Parsons3b1f83d2021-10-14 14:08:38 -0400135 exportSourcePathVariable("LinuxGccRoot",
136 "prebuilts/gcc/linux-x86/host/x86_64-linux-glibc${LinuxGlibcVersion}-${ShortLinuxGccVersion}")
Colin Crossb98c8b02016-07-29 13:44:28 -0700137
Chris Parsons3b1f83d2021-10-14 14:08:38 -0400138 exportStringListStaticVariable("LinuxGccTriple", []string{"x86_64-linux"})
Colin Crossb98c8b02016-07-29 13:44:28 -0700139
Chris Parsons3b1f83d2021-10-14 14:08:38 -0400140 exportStringListStaticVariable("LinuxCflags", linuxCflags)
141 exportStringListStaticVariable("LinuxLdflags", linuxLdflags)
142 exportStringListStaticVariable("LinuxLldflags", linuxLdflags)
143 exportStringListStaticVariable("LinuxGlibcCflags", linuxGlibcCflags)
144 exportStringListStaticVariable("LinuxGlibcLdflags", linuxGlibcLdflags)
145 exportStringListStaticVariable("LinuxGlibcLldflags", linuxGlibcLdflags)
146 exportStringListStaticVariable("LinuxMuslCflags", linuxMuslCflags)
147 exportStringListStaticVariable("LinuxMuslLdflags", linuxMuslLdflags)
148 exportStringListStaticVariable("LinuxMuslLldflags", linuxMuslLdflags)
Colin Crossb98c8b02016-07-29 13:44:28 -0700149
Chris Parsons3b1f83d2021-10-14 14:08:38 -0400150 exportStringListStaticVariable("LinuxX86Cflags", linuxX86Cflags)
151 exportStringListStaticVariable("LinuxX8664Cflags", linuxX8664Cflags)
152 exportStringListStaticVariable("LinuxX86Ldflags", linuxX86Ldflags)
153 exportStringListStaticVariable("LinuxX86Lldflags", linuxX86Ldflags)
154 exportStringListStaticVariable("LinuxX8664Ldflags", linuxX8664Ldflags)
155 exportStringListStaticVariable("LinuxX8664Lldflags", linuxX8664Ldflags)
Greg Hartman09302be2017-10-04 17:31:43 -0700156 // Yasm flags
Chris Parsons3b1f83d2021-10-14 14:08:38 -0400157 exportStringListStaticVariable("LinuxX86YasmFlags", []string{"-f elf32 -m x86"})
158 exportStringListStaticVariable("LinuxX8664YasmFlags", []string{"-f elf64 -m amd64"})
Colin Crossb98c8b02016-07-29 13:44:28 -0700159}
160
161type toolchainLinux struct {
162 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 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 Crossb98c8b02016-07-29 13:44:28 -0700254}
255
Colin Cross528d67e2021-07-23 22:23:07 +0000256func (toolchainGlibc) Glibc() bool { return true }
257
258func (toolchainGlibc) Cflags() string {
259 return "${config.LinuxGlibcCflags}"
260}
261
262func (toolchainGlibc) Ldflags() string {
263 return "${config.LinuxGlibcLdflags}"
264}
265
266func (toolchainGlibc) Lldflags() string {
267 return "${config.LinuxGlibcLldflags}"
268}
269
270type toolchainLinuxGlibcX86 struct {
271 toolchainLinuxX86
272 toolchainGlibc
273}
274
275type toolchainLinuxGlibcX8664 struct {
276 toolchainLinuxX8664
277 toolchainGlibc
278}
279
Colin Cross72ee6762022-01-28 14:05:22 -0800280func (t *toolchainLinuxGlibcX86) ClangTriple() string {
281 return "i686-linux-gnu"
282}
283
Colin Cross528d67e2021-07-23 22:23:07 +0000284func (t *toolchainLinuxGlibcX86) Cflags() string {
285 return t.toolchainLinuxX86.Cflags() + " " + t.toolchainGlibc.Cflags()
286}
287
288func (t *toolchainLinuxGlibcX86) Ldflags() string {
289 return t.toolchainLinuxX86.Ldflags() + " " + t.toolchainGlibc.Ldflags()
290}
291
292func (t *toolchainLinuxGlibcX86) Lldflags() string {
293 return t.toolchainLinuxX86.Lldflags() + " " + t.toolchainGlibc.Lldflags()
294}
295
Colin Cross72ee6762022-01-28 14:05:22 -0800296func (t *toolchainLinuxGlibcX8664) ClangTriple() string {
297 return "x86_64-linux-gnu"
298}
299
Colin Cross528d67e2021-07-23 22:23:07 +0000300func (t *toolchainLinuxGlibcX8664) Cflags() string {
301 return t.toolchainLinuxX8664.Cflags() + " " + t.toolchainGlibc.Cflags()
302}
303
304func (t *toolchainLinuxGlibcX8664) Ldflags() string {
305 return t.toolchainLinuxX8664.Ldflags() + " " + t.toolchainGlibc.Ldflags()
306}
307
308func (t *toolchainLinuxGlibcX8664) Lldflags() string {
309 return t.toolchainLinuxX8664.Lldflags() + " " + t.toolchainGlibc.Lldflags()
310}
311
312var toolchainLinuxGlibcX86Singleton Toolchain = &toolchainLinuxGlibcX86{}
313var toolchainLinuxGlibcX8664Singleton Toolchain = &toolchainLinuxGlibcX8664{}
314
315func linuxGlibcX86ToolchainFactory(arch android.Arch) Toolchain {
316 return toolchainLinuxGlibcX86Singleton
317}
318
319func linuxGlibcX8664ToolchainFactory(arch android.Arch) Toolchain {
320 return toolchainLinuxGlibcX8664Singleton
321}
322
323// musl specialization of the linux toolchain
324
325type toolchainMusl struct {
326}
327
328func (toolchainMusl) Musl() bool { return true }
329
330func (toolchainMusl) CrtBeginStaticBinary() []string { return muslCrtBeginStaticBinary }
331func (toolchainMusl) CrtBeginSharedBinary() []string { return muslCrtBeginSharedBinary }
332func (toolchainMusl) CrtBeginSharedLibrary() []string { return muslCrtBeginSharedLibrary }
333func (toolchainMusl) CrtEndStaticBinary() []string { return muslCrtEndStaticBinary }
334func (toolchainMusl) CrtEndSharedBinary() []string { return muslCrtEndSharedBinary }
335func (toolchainMusl) CrtEndSharedLibrary() []string { return muslCrtEndSharedLibrary }
336
337func (toolchainMusl) DefaultSharedLibraries() []string { return muslDefaultSharedLibraries }
338
339func (toolchainMusl) Cflags() string {
340 return "${config.LinuxMuslCflags}"
341}
342
343func (toolchainMusl) Ldflags() string {
344 return "${config.LinuxMuslLdflags}"
345}
346
347func (toolchainMusl) Lldflags() string {
348 return "${config.LinuxMuslLldflags}"
349}
350
351type toolchainLinuxMuslX86 struct {
352 toolchainLinuxX86
353 toolchainMusl
354}
355
356type toolchainLinuxMuslX8664 struct {
357 toolchainLinuxX8664
358 toolchainMusl
359}
360
Colin Cross72ee6762022-01-28 14:05:22 -0800361func (t *toolchainLinuxMuslX86) ClangTriple() string {
362 return "i686-linux-musl"
363}
364
Colin Cross528d67e2021-07-23 22:23:07 +0000365func (t *toolchainLinuxMuslX86) Cflags() string {
366 return t.toolchainLinuxX86.Cflags() + " " + t.toolchainMusl.Cflags()
367}
368
369func (t *toolchainLinuxMuslX86) Ldflags() string {
370 return t.toolchainLinuxX86.Ldflags() + " " + t.toolchainMusl.Ldflags()
371}
372
373func (t *toolchainLinuxMuslX86) Lldflags() string {
374 return t.toolchainLinuxX86.Lldflags() + " " + t.toolchainMusl.Lldflags()
375}
376
Colin Cross72ee6762022-01-28 14:05:22 -0800377func (t *toolchainLinuxMuslX8664) ClangTriple() string {
378 return "x86_64-linux-musl"
379}
380
Colin Cross528d67e2021-07-23 22:23:07 +0000381func (t *toolchainLinuxMuslX8664) Cflags() string {
382 return t.toolchainLinuxX8664.Cflags() + " " + t.toolchainMusl.Cflags()
383}
384
385func (t *toolchainLinuxMuslX8664) Ldflags() string {
386 return t.toolchainLinuxX8664.Ldflags() + " " + t.toolchainMusl.Ldflags()
387}
388
389func (t *toolchainLinuxMuslX8664) Lldflags() string {
390 return t.toolchainLinuxX8664.Lldflags() + " " + t.toolchainMusl.Lldflags()
391}
392
393var toolchainLinuxMuslX86Singleton Toolchain = &toolchainLinuxMuslX86{}
394var toolchainLinuxMuslX8664Singleton Toolchain = &toolchainLinuxMuslX8664{}
395
396func linuxMuslX86ToolchainFactory(arch android.Arch) Toolchain {
397 return toolchainLinuxMuslX86Singleton
398}
399
400func linuxMuslX8664ToolchainFactory(arch android.Arch) Toolchain {
401 return toolchainLinuxMuslX8664Singleton
Colin Crossb98c8b02016-07-29 13:44:28 -0700402}
403
404func init() {
Colin Cross528d67e2021-07-23 22:23:07 +0000405 registerToolchainFactory(android.Linux, android.X86, linuxGlibcX86ToolchainFactory)
406 registerToolchainFactory(android.Linux, android.X86_64, linuxGlibcX8664ToolchainFactory)
407 registerToolchainFactory(android.LinuxMusl, android.X86, linuxMuslX86ToolchainFactory)
408 registerToolchainFactory(android.LinuxMusl, android.X86_64, linuxMuslX8664ToolchainFactory)
Colin Crossb98c8b02016-07-29 13:44:28 -0700409}