blob: 1d66cb7139a110521b7d26c6535fa8394609d717 [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",
48 "-nostdlibinc",
49 }
50
Colin Crossb98c8b02016-07-29 13:44:28 -070051 linuxLdflags = []string{
52 "-Wl,-z,noexecstack",
53 "-Wl,-z,relro",
54 "-Wl,-z,now",
55 "-Wl,--no-undefined-version",
Colin Cross33bac242021-07-14 17:03:16 -070056
57 "--gcc-toolchain=${LinuxGccRoot}",
Colin Cross528d67e2021-07-23 22:23:07 +000058 }
59
60 linuxGlibcLdflags = []string{
Colin Cross33bac242021-07-14 17:03:16 -070061 "--sysroot ${LinuxGccRoot}/sysroot",
Colin Crossb98c8b02016-07-29 13:44:28 -070062 }
63
Colin Cross528d67e2021-07-23 22:23:07 +000064 linuxMuslLdflags = []string{
65 "-nostdlib",
66 "-lgcc", "-lgcc_eh",
67 }
68
Colin Crossb98c8b02016-07-29 13:44:28 -070069 // Extended cflags
70 linuxX86Cflags = []string{
71 "-msse3",
Colin Crossb98c8b02016-07-29 13:44:28 -070072 "-m32",
73 "-march=prescott",
74 "-D_FILE_OFFSET_BITS=64",
75 "-D_LARGEFILE_SOURCE=1",
76 }
77
78 linuxX8664Cflags = []string{
79 "-m64",
80 }
81
82 linuxX86Ldflags = []string{
83 "-m32",
Colin Cross33bac242021-07-14 17:03:16 -070084 "-B${LinuxGccRoot}/lib/gcc/${LinuxGccTriple}/${LinuxGccVersion}/32",
85 "-L${LinuxGccRoot}/lib/gcc/${LinuxGccTriple}/${LinuxGccVersion}/32",
86 "-L${LinuxGccRoot}/${LinuxGccTriple}/lib32",
Colin Crossb98c8b02016-07-29 13:44:28 -070087 }
88
89 linuxX8664Ldflags = []string{
90 "-m64",
Colin Crossb98c8b02016-07-29 13:44:28 -070091 "-B${LinuxGccRoot}/lib/gcc/${LinuxGccTriple}/${LinuxGccVersion}",
92 "-L${LinuxGccRoot}/lib/gcc/${LinuxGccTriple}/${LinuxGccVersion}",
93 "-L${LinuxGccRoot}/${LinuxGccTriple}/lib64",
Colin Cross33bac242021-07-14 17:03:16 -070094 }
Chih-Hung Hsieh3101a962018-04-17 14:16:05 -070095
Colin Crossb98c8b02016-07-29 13:44:28 -070096 linuxAvailableLibraries = addPrefix([]string{
97 "c",
98 "dl",
99 "gcc",
100 "gcc_s",
101 "m",
102 "ncurses",
103 "pthread",
104 "resolv",
105 "rt",
106 "util",
Colin Crossb98c8b02016-07-29 13:44:28 -0700107 }, "-l")
Colin Cross528d67e2021-07-23 22:23:07 +0000108
109 muslCrtBeginStaticBinary, muslCrtEndStaticBinary = []string{"libc_musl_crtbegin_static"}, []string{"crtend_android"}
110 muslCrtBeginSharedBinary, muslCrtEndSharedBinary = []string{"libc_musl_crtbegin_dynamic", "musl_linker_script"}, []string{"libc_musl_crtend"}
111 muslCrtBeginSharedLibrary, muslCrtEndSharedLibrary = []string{"libc_musl_crtbegin_so"}, []string{"libc_musl_crtend_so"}
112
113 muslDefaultSharedLibraries = []string{"libjemalloc5", "libc_musl"}
Colin Crossb98c8b02016-07-29 13:44:28 -0700114)
115
116const (
George Burgess IV7294cdc2019-01-23 13:59:10 -0800117 linuxGccVersion = "4.8.3"
118 linuxGlibcVersion = "2.17"
Colin Crossb98c8b02016-07-29 13:44:28 -0700119)
120
121func init() {
122 pctx.StaticVariable("LinuxGccVersion", linuxGccVersion)
George Burgess IV7294cdc2019-01-23 13:59:10 -0800123 pctx.StaticVariable("LinuxGlibcVersion", linuxGlibcVersion)
124 // Most places use the full GCC version. A few only use up to the first two numbers.
125 if p := strings.Split(linuxGccVersion, "."); len(p) > 2 {
126 pctx.StaticVariable("ShortLinuxGccVersion", strings.Join(p[:2], "."))
127 } else {
128 pctx.StaticVariable("ShortLinuxGccVersion", linuxGccVersion)
129 }
Colin Crossb98c8b02016-07-29 13:44:28 -0700130
131 pctx.SourcePathVariable("LinuxGccRoot",
George Burgess IV7294cdc2019-01-23 13:59:10 -0800132 "prebuilts/gcc/${HostPrebuiltTag}/host/x86_64-linux-glibc${LinuxGlibcVersion}-${ShortLinuxGccVersion}")
Colin Crossb98c8b02016-07-29 13:44:28 -0700133
134 pctx.StaticVariable("LinuxGccTriple", "x86_64-linux")
135
Colin Cross0523ba22021-07-14 18:45:05 -0700136 pctx.StaticVariable("LinuxCflags", strings.Join(linuxCflags, " "))
137 pctx.StaticVariable("LinuxLdflags", strings.Join(linuxLdflags, " "))
138 pctx.StaticVariable("LinuxLldflags", strings.Join(linuxLdflags, " "))
Colin Crossb98c8b02016-07-29 13:44:28 -0700139
Colin Cross0523ba22021-07-14 18:45:05 -0700140 pctx.StaticVariable("LinuxX86Cflags", strings.Join(linuxX86Cflags, " "))
141 pctx.StaticVariable("LinuxX8664Cflags", strings.Join(linuxX8664Cflags, " "))
142 pctx.StaticVariable("LinuxX86Ldflags", strings.Join(linuxX86Ldflags, " "))
143 pctx.StaticVariable("LinuxX86Lldflags", strings.Join(linuxX86Ldflags, " "))
144 pctx.StaticVariable("LinuxX8664Ldflags", strings.Join(linuxX8664Ldflags, " "))
145 pctx.StaticVariable("LinuxX8664Lldflags", strings.Join(linuxX8664Ldflags, " "))
Greg Hartman09302be2017-10-04 17:31:43 -0700146 // Yasm flags
147 pctx.StaticVariable("LinuxX86YasmFlags", "-f elf32 -m x86")
148 pctx.StaticVariable("LinuxX8664YasmFlags", "-f elf64 -m amd64")
Colin Cross528d67e2021-07-23 22:23:07 +0000149
150 pctx.StaticVariable("LinuxGlibcCflags", strings.Join(linuxGlibcCflags, " "))
151 pctx.StaticVariable("LinuxGlibcLdflags", strings.Join(linuxGlibcLdflags, " "))
152 pctx.StaticVariable("LinuxGlibcLldflags", strings.Join(linuxGlibcLdflags, " "))
153 pctx.StaticVariable("LinuxMuslCflags", strings.Join(linuxMuslCflags, " "))
154 pctx.StaticVariable("LinuxMuslLdflags", strings.Join(linuxMuslLdflags, " "))
155 pctx.StaticVariable("LinuxMuslLldflags", strings.Join(linuxMuslLdflags, " "))
Colin Crossb98c8b02016-07-29 13:44:28 -0700156}
157
158type toolchainLinux struct {
159 cFlags, ldFlags string
160}
161
162type toolchainLinuxX86 struct {
163 toolchain32Bit
164 toolchainLinux
165}
166
167type toolchainLinuxX8664 struct {
168 toolchain64Bit
169 toolchainLinux
170}
171
172func (t *toolchainLinuxX86) Name() string {
173 return "x86"
174}
175
176func (t *toolchainLinuxX8664) Name() string {
177 return "x86_64"
178}
179
180func (t *toolchainLinux) GccRoot() string {
181 return "${config.LinuxGccRoot}"
182}
183
184func (t *toolchainLinux) GccTriple() string {
185 return "${config.LinuxGccTriple}"
186}
187
188func (t *toolchainLinux) GccVersion() string {
189 return linuxGccVersion
190}
191
Colin Crossb98c8b02016-07-29 13:44:28 -0700192func (t *toolchainLinux) IncludeFlags() string {
193 return ""
194}
195
196func (t *toolchainLinuxX86) ClangTriple() string {
197 return "i686-linux-gnu"
198}
199
Colin Cross33bac242021-07-14 17:03:16 -0700200func (t *toolchainLinuxX86) Cflags() string {
Colin Cross0523ba22021-07-14 18:45:05 -0700201 return "${config.LinuxCflags} ${config.LinuxX86Cflags}"
Colin Crossb98c8b02016-07-29 13:44:28 -0700202}
203
Colin Cross33bac242021-07-14 17:03:16 -0700204func (t *toolchainLinuxX86) Cppflags() string {
Logan Chienbef00a22018-07-27 06:27:53 +0800205 return ""
Colin Crossb98c8b02016-07-29 13:44:28 -0700206}
207
208func (t *toolchainLinuxX8664) ClangTriple() string {
209 return "x86_64-linux-gnu"
210}
211
Colin Cross33bac242021-07-14 17:03:16 -0700212func (t *toolchainLinuxX8664) Cflags() string {
Colin Cross0523ba22021-07-14 18:45:05 -0700213 return "${config.LinuxCflags} ${config.LinuxX8664Cflags}"
Colin Crossb98c8b02016-07-29 13:44:28 -0700214}
215
Colin Cross33bac242021-07-14 17:03:16 -0700216func (t *toolchainLinuxX8664) Cppflags() string {
Logan Chienbef00a22018-07-27 06:27:53 +0800217 return ""
Colin Crossb98c8b02016-07-29 13:44:28 -0700218}
219
Colin Cross33bac242021-07-14 17:03:16 -0700220func (t *toolchainLinuxX86) Ldflags() string {
Colin Cross0523ba22021-07-14 18:45:05 -0700221 return "${config.LinuxLdflags} ${config.LinuxX86Ldflags}"
Colin Crossb98c8b02016-07-29 13:44:28 -0700222}
223
Colin Cross33bac242021-07-14 17:03:16 -0700224func (t *toolchainLinuxX86) Lldflags() string {
Colin Cross0523ba22021-07-14 18:45:05 -0700225 return "${config.LinuxLldflags} ${config.LinuxX86Lldflags}"
Chih-Hung Hsieh02b4da52018-04-03 11:33:34 -0700226}
227
Colin Cross33bac242021-07-14 17:03:16 -0700228func (t *toolchainLinuxX8664) Ldflags() string {
Colin Cross0523ba22021-07-14 18:45:05 -0700229 return "${config.LinuxLdflags} ${config.LinuxX8664Ldflags}"
Colin Crossb98c8b02016-07-29 13:44:28 -0700230}
231
Colin Cross33bac242021-07-14 17:03:16 -0700232func (t *toolchainLinuxX8664) Lldflags() string {
Colin Cross0523ba22021-07-14 18:45:05 -0700233 return "${config.LinuxLldflags} ${config.LinuxX8664Lldflags}"
Chih-Hung Hsieh02b4da52018-04-03 11:33:34 -0700234}
235
Greg Hartman09302be2017-10-04 17:31:43 -0700236func (t *toolchainLinuxX86) YasmFlags() string {
237 return "${config.LinuxX86YasmFlags}"
238}
239
240func (t *toolchainLinuxX8664) YasmFlags() string {
241 return "${config.LinuxX8664YasmFlags}"
242}
243
Mitch Phillipsda9a4632019-07-15 09:34:09 -0700244func (toolchainLinuxX86) LibclangRuntimeLibraryArch() string {
Ivan Lozano9ac32c72020-02-19 15:24:02 -0500245 return "i386"
Mitch Phillipsda9a4632019-07-15 09:34:09 -0700246}
247
248func (toolchainLinuxX8664) LibclangRuntimeLibraryArch() string {
249 return "x86_64"
250}
251
Colin Crossb98c8b02016-07-29 13:44:28 -0700252func (t *toolchainLinux) AvailableLibraries() []string {
253 return linuxAvailableLibraries
254}
255
Colin Cross528d67e2021-07-23 22:23:07 +0000256// glibc specialization of the linux toolchain
Colin Crossb98c8b02016-07-29 13:44:28 -0700257
Colin Cross528d67e2021-07-23 22:23:07 +0000258type toolchainGlibc struct {
Colin Crossb98c8b02016-07-29 13:44:28 -0700259}
260
Colin Cross528d67e2021-07-23 22:23:07 +0000261func (toolchainGlibc) Glibc() bool { return true }
262
263func (toolchainGlibc) Cflags() string {
264 return "${config.LinuxGlibcCflags}"
265}
266
267func (toolchainGlibc) Ldflags() string {
268 return "${config.LinuxGlibcLdflags}"
269}
270
271func (toolchainGlibc) Lldflags() string {
272 return "${config.LinuxGlibcLldflags}"
273}
274
275type toolchainLinuxGlibcX86 struct {
276 toolchainLinuxX86
277 toolchainGlibc
278}
279
280type toolchainLinuxGlibcX8664 struct {
281 toolchainLinuxX8664
282 toolchainGlibc
283}
284
285func (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
297func (t *toolchainLinuxGlibcX8664) Cflags() string {
298 return t.toolchainLinuxX8664.Cflags() + " " + t.toolchainGlibc.Cflags()
299}
300
301func (t *toolchainLinuxGlibcX8664) Ldflags() string {
302 return t.toolchainLinuxX8664.Ldflags() + " " + t.toolchainGlibc.Ldflags()
303}
304
305func (t *toolchainLinuxGlibcX8664) Lldflags() string {
306 return t.toolchainLinuxX8664.Lldflags() + " " + t.toolchainGlibc.Lldflags()
307}
308
309var toolchainLinuxGlibcX86Singleton Toolchain = &toolchainLinuxGlibcX86{}
310var toolchainLinuxGlibcX8664Singleton Toolchain = &toolchainLinuxGlibcX8664{}
311
312func linuxGlibcX86ToolchainFactory(arch android.Arch) Toolchain {
313 return toolchainLinuxGlibcX86Singleton
314}
315
316func linuxGlibcX8664ToolchainFactory(arch android.Arch) Toolchain {
317 return toolchainLinuxGlibcX8664Singleton
318}
319
320// musl specialization of the linux toolchain
321
322type toolchainMusl struct {
323}
324
325func (toolchainMusl) Musl() bool { return true }
326
327func (toolchainMusl) CrtBeginStaticBinary() []string { return muslCrtBeginStaticBinary }
328func (toolchainMusl) CrtBeginSharedBinary() []string { return muslCrtBeginSharedBinary }
329func (toolchainMusl) CrtBeginSharedLibrary() []string { return muslCrtBeginSharedLibrary }
330func (toolchainMusl) CrtEndStaticBinary() []string { return muslCrtEndStaticBinary }
331func (toolchainMusl) CrtEndSharedBinary() []string { return muslCrtEndSharedBinary }
332func (toolchainMusl) CrtEndSharedLibrary() []string { return muslCrtEndSharedLibrary }
333
334func (toolchainMusl) DefaultSharedLibraries() []string { return muslDefaultSharedLibraries }
335
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
358func (t *toolchainLinuxMuslX86) Cflags() string {
359 return t.toolchainLinuxX86.Cflags() + " " + t.toolchainMusl.Cflags()
360}
361
362func (t *toolchainLinuxMuslX86) Ldflags() string {
363 return t.toolchainLinuxX86.Ldflags() + " " + t.toolchainMusl.Ldflags()
364}
365
366func (t *toolchainLinuxMuslX86) Lldflags() string {
367 return t.toolchainLinuxX86.Lldflags() + " " + t.toolchainMusl.Lldflags()
368}
369
370func (t *toolchainLinuxMuslX8664) Cflags() string {
371 return t.toolchainLinuxX8664.Cflags() + " " + t.toolchainMusl.Cflags()
372}
373
374func (t *toolchainLinuxMuslX8664) Ldflags() string {
375 return t.toolchainLinuxX8664.Ldflags() + " " + t.toolchainMusl.Ldflags()
376}
377
378func (t *toolchainLinuxMuslX8664) Lldflags() string {
379 return t.toolchainLinuxX8664.Lldflags() + " " + t.toolchainMusl.Lldflags()
380}
381
382var toolchainLinuxMuslX86Singleton Toolchain = &toolchainLinuxMuslX86{}
383var toolchainLinuxMuslX8664Singleton Toolchain = &toolchainLinuxMuslX8664{}
384
385func linuxMuslX86ToolchainFactory(arch android.Arch) Toolchain {
386 return toolchainLinuxMuslX86Singleton
387}
388
389func linuxMuslX8664ToolchainFactory(arch android.Arch) Toolchain {
390 return toolchainLinuxMuslX8664Singleton
Colin Crossb98c8b02016-07-29 13:44:28 -0700391}
392
393func init() {
Colin Cross528d67e2021-07-23 22:23:07 +0000394 registerToolchainFactory(android.Linux, android.X86, linuxGlibcX86ToolchainFactory)
395 registerToolchainFactory(android.Linux, android.X86_64, linuxGlibcX8664ToolchainFactory)
396 registerToolchainFactory(android.LinuxMusl, android.X86, linuxMuslX86ToolchainFactory)
397 registerToolchainFactory(android.LinuxMusl, android.X86_64, linuxMuslX8664ToolchainFactory)
Colin Crossb98c8b02016-07-29 13:44:28 -0700398}