blob: 43333fadad93fa93611acabd055b6d011fe8f925 [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",
50 }
51
Colin Crossb98c8b02016-07-29 13:44:28 -070052 linuxLdflags = []string{
53 "-Wl,-z,noexecstack",
54 "-Wl,-z,relro",
55 "-Wl,-z,now",
56 "-Wl,--no-undefined-version",
Colin Cross33bac242021-07-14 17:03:16 -070057
58 "--gcc-toolchain=${LinuxGccRoot}",
Colin Cross528d67e2021-07-23 22:23:07 +000059 }
60
61 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",
67 "-lgcc", "-lgcc_eh",
68 }
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 Cross528d67e2021-07-23 22:23:07 +0000111 muslCrtBeginSharedBinary, muslCrtEndSharedBinary = []string{"libc_musl_crtbegin_dynamic", "musl_linker_script"}, []string{"libc_musl_crtend"}
112 muslCrtBeginSharedLibrary, muslCrtEndSharedLibrary = []string{"libc_musl_crtbegin_so"}, []string{"libc_musl_crtend_so"}
113
Colin Cross90a8b3a2021-08-02 13:17:13 -0700114 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() {
Chris Parsons3b1f83d2021-10-14 14:08:38 -0400123 exportStringStaticVariable("LinuxGccVersion", linuxGccVersion)
124 exportStringStaticVariable("LinuxGlibcVersion", linuxGlibcVersion)
125
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 {
Chris Parsons3b1f83d2021-10-14 14:08:38 -0400128 exportStringStaticVariable("ShortLinuxGccVersion", strings.Join(p[:2], "."))
George Burgess IV7294cdc2019-01-23 13:59:10 -0800129 } else {
Chris Parsons3b1f83d2021-10-14 14:08:38 -0400130 exportStringStaticVariable("ShortLinuxGccVersion", linuxGccVersion)
George Burgess IV7294cdc2019-01-23 13:59:10 -0800131 }
Colin Crossb98c8b02016-07-29 13:44:28 -0700132
Chris Parsons3b1f83d2021-10-14 14:08:38 -0400133 exportSourcePathVariable("LinuxGccRoot",
134 "prebuilts/gcc/linux-x86/host/x86_64-linux-glibc${LinuxGlibcVersion}-${ShortLinuxGccVersion}")
Colin Crossb98c8b02016-07-29 13:44:28 -0700135
Chris Parsons3b1f83d2021-10-14 14:08:38 -0400136 exportStringListStaticVariable("LinuxGccTriple", []string{"x86_64-linux"})
Colin Crossb98c8b02016-07-29 13:44:28 -0700137
Chris Parsons3b1f83d2021-10-14 14:08:38 -0400138 exportStringListStaticVariable("LinuxCflags", linuxCflags)
139 exportStringListStaticVariable("LinuxLdflags", linuxLdflags)
140 exportStringListStaticVariable("LinuxLldflags", linuxLdflags)
141 exportStringListStaticVariable("LinuxGlibcCflags", linuxGlibcCflags)
142 exportStringListStaticVariable("LinuxGlibcLdflags", linuxGlibcLdflags)
143 exportStringListStaticVariable("LinuxGlibcLldflags", linuxGlibcLdflags)
144 exportStringListStaticVariable("LinuxMuslCflags", linuxMuslCflags)
145 exportStringListStaticVariable("LinuxMuslLdflags", linuxMuslLdflags)
146 exportStringListStaticVariable("LinuxMuslLldflags", linuxMuslLdflags)
Colin Crossb98c8b02016-07-29 13:44:28 -0700147
Chris Parsons3b1f83d2021-10-14 14:08:38 -0400148 exportStringListStaticVariable("LinuxX86Cflags", linuxX86Cflags)
149 exportStringListStaticVariable("LinuxX8664Cflags", linuxX8664Cflags)
150 exportStringListStaticVariable("LinuxX86Ldflags", linuxX86Ldflags)
151 exportStringListStaticVariable("LinuxX86Lldflags", linuxX86Ldflags)
152 exportStringListStaticVariable("LinuxX8664Ldflags", linuxX8664Ldflags)
153 exportStringListStaticVariable("LinuxX8664Lldflags", linuxX8664Ldflags)
Greg Hartman09302be2017-10-04 17:31:43 -0700154 // Yasm flags
Chris Parsons3b1f83d2021-10-14 14:08:38 -0400155 exportStringListStaticVariable("LinuxX86YasmFlags", []string{"-f elf32 -m x86"})
156 exportStringListStaticVariable("LinuxX8664YasmFlags", []string{"-f elf64 -m amd64"})
Colin Crossb98c8b02016-07-29 13:44:28 -0700157}
158
159type toolchainLinux struct {
160 cFlags, ldFlags string
161}
162
163type toolchainLinuxX86 struct {
164 toolchain32Bit
165 toolchainLinux
166}
167
168type toolchainLinuxX8664 struct {
169 toolchain64Bit
170 toolchainLinux
171}
172
173func (t *toolchainLinuxX86) Name() string {
174 return "x86"
175}
176
177func (t *toolchainLinuxX8664) Name() string {
178 return "x86_64"
179}
180
181func (t *toolchainLinux) GccRoot() string {
182 return "${config.LinuxGccRoot}"
183}
184
185func (t *toolchainLinux) GccTriple() string {
186 return "${config.LinuxGccTriple}"
187}
188
189func (t *toolchainLinux) GccVersion() string {
190 return linuxGccVersion
191}
192
Colin Crossb98c8b02016-07-29 13:44:28 -0700193func (t *toolchainLinux) IncludeFlags() string {
194 return ""
195}
196
197func (t *toolchainLinuxX86) ClangTriple() string {
198 return "i686-linux-gnu"
199}
200
Colin Cross33bac242021-07-14 17:03:16 -0700201func (t *toolchainLinuxX86) Cflags() string {
Colin Cross0523ba22021-07-14 18:45:05 -0700202 return "${config.LinuxCflags} ${config.LinuxX86Cflags}"
Colin Crossb98c8b02016-07-29 13:44:28 -0700203}
204
Colin Cross33bac242021-07-14 17:03:16 -0700205func (t *toolchainLinuxX86) Cppflags() string {
Logan Chienbef00a22018-07-27 06:27:53 +0800206 return ""
Colin Crossb98c8b02016-07-29 13:44:28 -0700207}
208
209func (t *toolchainLinuxX8664) ClangTriple() string {
210 return "x86_64-linux-gnu"
211}
212
Colin Cross33bac242021-07-14 17:03:16 -0700213func (t *toolchainLinuxX8664) Cflags() string {
Colin Cross0523ba22021-07-14 18:45:05 -0700214 return "${config.LinuxCflags} ${config.LinuxX8664Cflags}"
Colin Crossb98c8b02016-07-29 13:44:28 -0700215}
216
Colin Cross33bac242021-07-14 17:03:16 -0700217func (t *toolchainLinuxX8664) Cppflags() string {
Logan Chienbef00a22018-07-27 06:27:53 +0800218 return ""
Colin Crossb98c8b02016-07-29 13:44:28 -0700219}
220
Colin Cross33bac242021-07-14 17:03:16 -0700221func (t *toolchainLinuxX86) Ldflags() string {
Colin Cross0523ba22021-07-14 18:45:05 -0700222 return "${config.LinuxLdflags} ${config.LinuxX86Ldflags}"
Colin Crossb98c8b02016-07-29 13:44:28 -0700223}
224
Colin Cross33bac242021-07-14 17:03:16 -0700225func (t *toolchainLinuxX86) Lldflags() string {
Colin Cross0523ba22021-07-14 18:45:05 -0700226 return "${config.LinuxLldflags} ${config.LinuxX86Lldflags}"
Chih-Hung Hsieh02b4da52018-04-03 11:33:34 -0700227}
228
Colin Cross33bac242021-07-14 17:03:16 -0700229func (t *toolchainLinuxX8664) Ldflags() string {
Colin Cross0523ba22021-07-14 18:45:05 -0700230 return "${config.LinuxLdflags} ${config.LinuxX8664Ldflags}"
Colin Crossb98c8b02016-07-29 13:44:28 -0700231}
232
Colin Cross33bac242021-07-14 17:03:16 -0700233func (t *toolchainLinuxX8664) Lldflags() string {
Colin Cross0523ba22021-07-14 18:45:05 -0700234 return "${config.LinuxLldflags} ${config.LinuxX8664Lldflags}"
Chih-Hung Hsieh02b4da52018-04-03 11:33:34 -0700235}
236
Greg Hartman09302be2017-10-04 17:31:43 -0700237func (t *toolchainLinuxX86) YasmFlags() string {
238 return "${config.LinuxX86YasmFlags}"
239}
240
241func (t *toolchainLinuxX8664) YasmFlags() string {
242 return "${config.LinuxX8664YasmFlags}"
243}
244
Mitch Phillipsda9a4632019-07-15 09:34:09 -0700245func (toolchainLinuxX86) LibclangRuntimeLibraryArch() string {
Ivan Lozano9ac32c72020-02-19 15:24:02 -0500246 return "i386"
Mitch Phillipsda9a4632019-07-15 09:34:09 -0700247}
248
249func (toolchainLinuxX8664) LibclangRuntimeLibraryArch() string {
250 return "x86_64"
251}
252
Colin Crossb98c8b02016-07-29 13:44:28 -0700253func (t *toolchainLinux) AvailableLibraries() []string {
254 return linuxAvailableLibraries
255}
256
Colin Cross528d67e2021-07-23 22:23:07 +0000257// glibc specialization of the linux toolchain
Colin Crossb98c8b02016-07-29 13:44:28 -0700258
Colin Cross528d67e2021-07-23 22:23:07 +0000259type toolchainGlibc struct {
Colin Crossb98c8b02016-07-29 13:44:28 -0700260}
261
Colin Cross528d67e2021-07-23 22:23:07 +0000262func (toolchainGlibc) Glibc() bool { return true }
263
264func (toolchainGlibc) Cflags() string {
265 return "${config.LinuxGlibcCflags}"
266}
267
268func (toolchainGlibc) Ldflags() string {
269 return "${config.LinuxGlibcLdflags}"
270}
271
272func (toolchainGlibc) Lldflags() string {
273 return "${config.LinuxGlibcLldflags}"
274}
275
276type toolchainLinuxGlibcX86 struct {
277 toolchainLinuxX86
278 toolchainGlibc
279}
280
281type toolchainLinuxGlibcX8664 struct {
282 toolchainLinuxX8664
283 toolchainGlibc
284}
285
286func (t *toolchainLinuxGlibcX86) Cflags() string {
287 return t.toolchainLinuxX86.Cflags() + " " + t.toolchainGlibc.Cflags()
288}
289
290func (t *toolchainLinuxGlibcX86) Ldflags() string {
291 return t.toolchainLinuxX86.Ldflags() + " " + t.toolchainGlibc.Ldflags()
292}
293
294func (t *toolchainLinuxGlibcX86) Lldflags() string {
295 return t.toolchainLinuxX86.Lldflags() + " " + t.toolchainGlibc.Lldflags()
296}
297
298func (t *toolchainLinuxGlibcX8664) Cflags() string {
299 return t.toolchainLinuxX8664.Cflags() + " " + t.toolchainGlibc.Cflags()
300}
301
302func (t *toolchainLinuxGlibcX8664) Ldflags() string {
303 return t.toolchainLinuxX8664.Ldflags() + " " + t.toolchainGlibc.Ldflags()
304}
305
306func (t *toolchainLinuxGlibcX8664) Lldflags() string {
307 return t.toolchainLinuxX8664.Lldflags() + " " + t.toolchainGlibc.Lldflags()
308}
309
310var toolchainLinuxGlibcX86Singleton Toolchain = &toolchainLinuxGlibcX86{}
311var toolchainLinuxGlibcX8664Singleton Toolchain = &toolchainLinuxGlibcX8664{}
312
313func linuxGlibcX86ToolchainFactory(arch android.Arch) Toolchain {
314 return toolchainLinuxGlibcX86Singleton
315}
316
317func linuxGlibcX8664ToolchainFactory(arch android.Arch) Toolchain {
318 return toolchainLinuxGlibcX8664Singleton
319}
320
321// musl specialization of the linux toolchain
322
323type toolchainMusl struct {
324}
325
326func (toolchainMusl) Musl() bool { return true }
327
328func (toolchainMusl) CrtBeginStaticBinary() []string { return muslCrtBeginStaticBinary }
329func (toolchainMusl) CrtBeginSharedBinary() []string { return muslCrtBeginSharedBinary }
330func (toolchainMusl) CrtBeginSharedLibrary() []string { return muslCrtBeginSharedLibrary }
331func (toolchainMusl) CrtEndStaticBinary() []string { return muslCrtEndStaticBinary }
332func (toolchainMusl) CrtEndSharedBinary() []string { return muslCrtEndSharedBinary }
333func (toolchainMusl) CrtEndSharedLibrary() []string { return muslCrtEndSharedLibrary }
334
335func (toolchainMusl) DefaultSharedLibraries() []string { return muslDefaultSharedLibraries }
336
337func (toolchainMusl) Cflags() string {
338 return "${config.LinuxMuslCflags}"
339}
340
341func (toolchainMusl) Ldflags() string {
342 return "${config.LinuxMuslLdflags}"
343}
344
345func (toolchainMusl) Lldflags() string {
346 return "${config.LinuxMuslLldflags}"
347}
348
349type toolchainLinuxMuslX86 struct {
350 toolchainLinuxX86
351 toolchainMusl
352}
353
354type toolchainLinuxMuslX8664 struct {
355 toolchainLinuxX8664
356 toolchainMusl
357}
358
359func (t *toolchainLinuxMuslX86) Cflags() string {
360 return t.toolchainLinuxX86.Cflags() + " " + t.toolchainMusl.Cflags()
361}
362
363func (t *toolchainLinuxMuslX86) Ldflags() string {
364 return t.toolchainLinuxX86.Ldflags() + " " + t.toolchainMusl.Ldflags()
365}
366
367func (t *toolchainLinuxMuslX86) Lldflags() string {
368 return t.toolchainLinuxX86.Lldflags() + " " + t.toolchainMusl.Lldflags()
369}
370
371func (t *toolchainLinuxMuslX8664) Cflags() string {
372 return t.toolchainLinuxX8664.Cflags() + " " + t.toolchainMusl.Cflags()
373}
374
375func (t *toolchainLinuxMuslX8664) Ldflags() string {
376 return t.toolchainLinuxX8664.Ldflags() + " " + t.toolchainMusl.Ldflags()
377}
378
379func (t *toolchainLinuxMuslX8664) Lldflags() string {
380 return t.toolchainLinuxX8664.Lldflags() + " " + t.toolchainMusl.Lldflags()
381}
382
383var toolchainLinuxMuslX86Singleton Toolchain = &toolchainLinuxMuslX86{}
384var toolchainLinuxMuslX8664Singleton Toolchain = &toolchainLinuxMuslX8664{}
385
386func linuxMuslX86ToolchainFactory(arch android.Arch) Toolchain {
387 return toolchainLinuxMuslX86Singleton
388}
389
390func linuxMuslX8664ToolchainFactory(arch android.Arch) Toolchain {
391 return toolchainLinuxMuslX8664Singleton
Colin Crossb98c8b02016-07-29 13:44:28 -0700392}
393
394func init() {
Colin Cross528d67e2021-07-23 22:23:07 +0000395 registerToolchainFactory(android.Linux, android.X86, linuxGlibcX86ToolchainFactory)
396 registerToolchainFactory(android.Linux, android.X86_64, linuxGlibcX8664ToolchainFactory)
397 registerToolchainFactory(android.LinuxMusl, android.X86, linuxMuslX86ToolchainFactory)
398 registerToolchainFactory(android.LinuxMusl, android.X86_64, linuxMuslX8664ToolchainFactory)
Colin Crossb98c8b02016-07-29 13:44:28 -0700399}