• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// 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{
25		"-Wa,--noexecstack",
26
27		"-fPIC",
28
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",
37
38		"--gcc-toolchain=${LinuxGccRoot}",
39		"-fstack-protector-strong",
40	}
41
42	linuxGlibcCflags = []string{
43		"--sysroot ${LinuxGccRoot}/sysroot",
44	}
45
46	linuxMuslCflags = []string{
47		"-D_LIBCPP_HAS_MUSL_LIBC",
48		"-DANDROID_HOST_MUSL",
49		"-nostdlibinc",
50		"--sysroot /dev/null",
51	}
52
53	linuxLdflags = []string{
54		"-Wl,-z,noexecstack",
55		"-Wl,-z,relro",
56		"-Wl,-z,now",
57		"-Wl,--no-undefined-version",
58
59		"--gcc-toolchain=${LinuxGccRoot}",
60	}
61
62	linuxGlibcLdflags = []string{
63		"--sysroot ${LinuxGccRoot}/sysroot",
64	}
65
66	linuxMuslLdflags = []string{
67		"-nostdlib",
68		"--sysroot /dev/null",
69	}
70
71	// Extended cflags
72	linuxX86Cflags = []string{
73		"-msse3",
74		"-m32",
75		"-march=prescott",
76		"-D_FILE_OFFSET_BITS=64",
77		"-D_LARGEFILE_SOURCE=1",
78	}
79
80	linuxX8664Cflags = []string{
81		"-m64",
82	}
83
84	linuxX86Ldflags = []string{
85		"-m32",
86		"-B${LinuxGccRoot}/lib/gcc/${LinuxGccTriple}/${LinuxGccVersion}/32",
87		"-L${LinuxGccRoot}/lib/gcc/${LinuxGccTriple}/${LinuxGccVersion}/32",
88		"-L${LinuxGccRoot}/${LinuxGccTriple}/lib32",
89	}
90
91	linuxX8664Ldflags = []string{
92		"-m64",
93		"-B${LinuxGccRoot}/lib/gcc/${LinuxGccTriple}/${LinuxGccVersion}",
94		"-L${LinuxGccRoot}/lib/gcc/${LinuxGccTriple}/${LinuxGccVersion}",
95		"-L${LinuxGccRoot}/${LinuxGccTriple}/lib64",
96	}
97
98	linuxAvailableLibraries = addPrefix([]string{
99		"c",
100		"dl",
101		"gcc",
102		"gcc_s",
103		"m",
104		"ncurses",
105		"pthread",
106		"resolv",
107		"rt",
108		"util",
109	}, "-l")
110
111	muslCrtBeginStaticBinary, muslCrtEndStaticBinary   = []string{"libc_musl_crtbegin_static"}, []string{"libc_musl_crtend"}
112	muslCrtBeginSharedBinary, muslCrtEndSharedBinary   = []string{"libc_musl_crtbegin_dynamic", "musl_linker_script"}, []string{"libc_musl_crtend"}
113	muslCrtBeginSharedLibrary, muslCrtEndSharedLibrary = []string{"libc_musl_crtbegin_so"}, []string{"libc_musl_crtend_so"}
114
115	muslDefaultSharedLibraries = []string{"libc_musl"}
116)
117
118const (
119	linuxGccVersion   = "4.8.3"
120	linuxGlibcVersion = "2.17"
121)
122
123func init() {
124	exportedVars.ExportStringStaticVariable("LinuxGccVersion", linuxGccVersion)
125	exportedVars.ExportStringStaticVariable("LinuxGlibcVersion", linuxGlibcVersion)
126
127	// Most places use the full GCC version. A few only use up to the first two numbers.
128	if p := strings.Split(linuxGccVersion, "."); len(p) > 2 {
129		exportedVars.ExportStringStaticVariable("ShortLinuxGccVersion", strings.Join(p[:2], "."))
130	} else {
131		exportedVars.ExportStringStaticVariable("ShortLinuxGccVersion", linuxGccVersion)
132	}
133
134	exportedVars.ExportSourcePathVariable("LinuxGccRoot",
135		"prebuilts/gcc/linux-x86/host/x86_64-linux-glibc${LinuxGlibcVersion}-${ShortLinuxGccVersion}")
136
137	exportedVars.ExportStringListStaticVariable("LinuxGccTriple", []string{"x86_64-linux"})
138
139	exportedVars.ExportStringListStaticVariable("LinuxCflags", linuxCflags)
140	exportedVars.ExportStringListStaticVariable("LinuxLdflags", linuxLdflags)
141	exportedVars.ExportStringListStaticVariable("LinuxLldflags", linuxLdflags)
142	exportedVars.ExportStringListStaticVariable("LinuxGlibcCflags", linuxGlibcCflags)
143	exportedVars.ExportStringListStaticVariable("LinuxGlibcLdflags", linuxGlibcLdflags)
144	exportedVars.ExportStringListStaticVariable("LinuxGlibcLldflags", linuxGlibcLdflags)
145	exportedVars.ExportStringListStaticVariable("LinuxMuslCflags", linuxMuslCflags)
146	exportedVars.ExportStringListStaticVariable("LinuxMuslLdflags", linuxMuslLdflags)
147	exportedVars.ExportStringListStaticVariable("LinuxMuslLldflags", linuxMuslLdflags)
148
149	exportedVars.ExportStringListStaticVariable("LinuxX86Cflags", linuxX86Cflags)
150	exportedVars.ExportStringListStaticVariable("LinuxX8664Cflags", linuxX8664Cflags)
151	exportedVars.ExportStringListStaticVariable("LinuxX86Ldflags", linuxX86Ldflags)
152	exportedVars.ExportStringListStaticVariable("LinuxX86Lldflags", linuxX86Ldflags)
153	exportedVars.ExportStringListStaticVariable("LinuxX8664Ldflags", linuxX8664Ldflags)
154	exportedVars.ExportStringListStaticVariable("LinuxX8664Lldflags", linuxX8664Ldflags)
155	// Yasm flags
156	exportedVars.ExportStringListStaticVariable("LinuxX86YasmFlags", []string{"-f elf32 -m x86"})
157	exportedVars.ExportStringListStaticVariable("LinuxX8664YasmFlags", []string{"-f elf64 -m amd64"})
158}
159
160type toolchainLinux struct {
161	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
182func (t *toolchainLinux) GccRoot() string {
183	return "${config.LinuxGccRoot}"
184}
185
186func (t *toolchainLinux) GccTriple() string {
187	return "${config.LinuxGccTriple}"
188}
189
190func (t *toolchainLinux) GccVersion() string {
191	return linuxGccVersion
192}
193
194func (t *toolchainLinux) IncludeFlags() string {
195	return ""
196}
197
198func (t *toolchainLinuxX86) Cflags() string {
199	return "${config.LinuxCflags} ${config.LinuxX86Cflags}"
200}
201
202func (t *toolchainLinuxX86) Cppflags() string {
203	return ""
204}
205
206func (t *toolchainLinuxX8664) Cflags() string {
207	return "${config.LinuxCflags} ${config.LinuxX8664Cflags}"
208}
209
210func (t *toolchainLinuxX8664) Cppflags() string {
211	return ""
212}
213
214func (t *toolchainLinuxX86) Ldflags() string {
215	return "${config.LinuxLdflags} ${config.LinuxX86Ldflags}"
216}
217
218func (t *toolchainLinuxX86) Lldflags() string {
219	return "${config.LinuxLldflags} ${config.LinuxX86Lldflags}"
220}
221
222func (t *toolchainLinuxX8664) Ldflags() string {
223	return "${config.LinuxLdflags} ${config.LinuxX8664Ldflags}"
224}
225
226func (t *toolchainLinuxX8664) Lldflags() string {
227	return "${config.LinuxLldflags} ${config.LinuxX8664Lldflags}"
228}
229
230func (t *toolchainLinuxX86) YasmFlags() string {
231	return "${config.LinuxX86YasmFlags}"
232}
233
234func (t *toolchainLinuxX8664) YasmFlags() string {
235	return "${config.LinuxX8664YasmFlags}"
236}
237
238func (toolchainLinuxX86) LibclangRuntimeLibraryArch() string {
239	return "i386"
240}
241
242func (toolchainLinuxX8664) LibclangRuntimeLibraryArch() string {
243	return "x86_64"
244}
245
246func (t *toolchainLinux) AvailableLibraries() []string {
247	return linuxAvailableLibraries
248}
249
250// glibc specialization of the linux toolchain
251
252type toolchainGlibc struct {
253}
254
255func (toolchainGlibc) Glibc() bool { return true }
256
257func (toolchainGlibc) Cflags() string {
258	return "${config.LinuxGlibcCflags}"
259}
260
261func (toolchainGlibc) Ldflags() string {
262	return "${config.LinuxGlibcLdflags}"
263}
264
265func (toolchainGlibc) Lldflags() string {
266	return "${config.LinuxGlibcLldflags}"
267}
268
269type toolchainLinuxGlibcX86 struct {
270	toolchainLinuxX86
271	toolchainGlibc
272}
273
274type toolchainLinuxGlibcX8664 struct {
275	toolchainLinuxX8664
276	toolchainGlibc
277}
278
279func (t *toolchainLinuxGlibcX86) ClangTriple() string {
280	return "i686-linux-gnu"
281}
282
283func (t *toolchainLinuxGlibcX86) Cflags() string {
284	return t.toolchainLinuxX86.Cflags() + " " + t.toolchainGlibc.Cflags()
285}
286
287func (t *toolchainLinuxGlibcX86) Ldflags() string {
288	return t.toolchainLinuxX86.Ldflags() + " " + t.toolchainGlibc.Ldflags()
289}
290
291func (t *toolchainLinuxGlibcX86) Lldflags() string {
292	return t.toolchainLinuxX86.Lldflags() + " " + t.toolchainGlibc.Lldflags()
293}
294
295func (t *toolchainLinuxGlibcX8664) ClangTriple() string {
296	return "x86_64-linux-gnu"
297}
298
299func (t *toolchainLinuxGlibcX8664) Cflags() string {
300	return t.toolchainLinuxX8664.Cflags() + " " + t.toolchainGlibc.Cflags()
301}
302
303func (t *toolchainLinuxGlibcX8664) Ldflags() string {
304	return t.toolchainLinuxX8664.Ldflags() + " " + t.toolchainGlibc.Ldflags()
305}
306
307func (t *toolchainLinuxGlibcX8664) Lldflags() string {
308	return t.toolchainLinuxX8664.Lldflags() + " " + t.toolchainGlibc.Lldflags()
309}
310
311var toolchainLinuxGlibcX86Singleton Toolchain = &toolchainLinuxGlibcX86{}
312var toolchainLinuxGlibcX8664Singleton Toolchain = &toolchainLinuxGlibcX8664{}
313
314func linuxGlibcX86ToolchainFactory(arch android.Arch) Toolchain {
315	return toolchainLinuxGlibcX86Singleton
316}
317
318func linuxGlibcX8664ToolchainFactory(arch android.Arch) Toolchain {
319	return toolchainLinuxGlibcX8664Singleton
320}
321
322// musl specialization of the linux toolchain
323
324type toolchainMusl struct {
325}
326
327func (toolchainMusl) Musl() bool { return true }
328
329func (toolchainMusl) CrtBeginStaticBinary() []string  { return muslCrtBeginStaticBinary }
330func (toolchainMusl) CrtBeginSharedBinary() []string  { return muslCrtBeginSharedBinary }
331func (toolchainMusl) CrtBeginSharedLibrary() []string { return muslCrtBeginSharedLibrary }
332func (toolchainMusl) CrtEndStaticBinary() []string    { return muslCrtEndStaticBinary }
333func (toolchainMusl) CrtEndSharedBinary() []string    { return muslCrtEndSharedBinary }
334func (toolchainMusl) CrtEndSharedLibrary() []string   { return muslCrtEndSharedLibrary }
335
336func (toolchainMusl) DefaultSharedLibraries() []string { return muslDefaultSharedLibraries }
337
338func (toolchainMusl) Cflags() string {
339	return "${config.LinuxMuslCflags}"
340}
341
342func (toolchainMusl) Ldflags() string {
343	return "${config.LinuxMuslLdflags}"
344}
345
346func (toolchainMusl) Lldflags() string {
347	return "${config.LinuxMuslLldflags}"
348}
349
350type toolchainLinuxMuslX86 struct {
351	toolchainLinuxX86
352	toolchainMusl
353}
354
355type toolchainLinuxMuslX8664 struct {
356	toolchainLinuxX8664
357	toolchainMusl
358}
359
360func (t *toolchainLinuxMuslX86) ClangTriple() string {
361	return "i686-linux-musl"
362}
363
364func (t *toolchainLinuxMuslX86) Cflags() string {
365	return t.toolchainLinuxX86.Cflags() + " " + t.toolchainMusl.Cflags()
366}
367
368func (t *toolchainLinuxMuslX86) Ldflags() string {
369	return t.toolchainLinuxX86.Ldflags() + " " + t.toolchainMusl.Ldflags()
370}
371
372func (t *toolchainLinuxMuslX86) Lldflags() string {
373	return t.toolchainLinuxX86.Lldflags() + " " + t.toolchainMusl.Lldflags()
374}
375
376func (t *toolchainLinuxMuslX8664) ClangTriple() string {
377	return "x86_64-linux-musl"
378}
379
380func (t *toolchainLinuxMuslX8664) Cflags() string {
381	return t.toolchainLinuxX8664.Cflags() + " " + t.toolchainMusl.Cflags()
382}
383
384func (t *toolchainLinuxMuslX8664) Ldflags() string {
385	return t.toolchainLinuxX8664.Ldflags() + " " + t.toolchainMusl.Ldflags()
386}
387
388func (t *toolchainLinuxMuslX8664) Lldflags() string {
389	return t.toolchainLinuxX8664.Lldflags() + " " + t.toolchainMusl.Lldflags()
390}
391
392var toolchainLinuxMuslX86Singleton Toolchain = &toolchainLinuxMuslX86{}
393var toolchainLinuxMuslX8664Singleton Toolchain = &toolchainLinuxMuslX8664{}
394
395func linuxMuslX86ToolchainFactory(arch android.Arch) Toolchain {
396	return toolchainLinuxMuslX86Singleton
397}
398
399func linuxMuslX8664ToolchainFactory(arch android.Arch) Toolchain {
400	return toolchainLinuxMuslX8664Singleton
401}
402
403func init() {
404	registerToolchainFactory(android.Linux, android.X86, linuxGlibcX86ToolchainFactory)
405	registerToolchainFactory(android.Linux, android.X86_64, linuxGlibcX8664ToolchainFactory)
406	registerToolchainFactory(android.LinuxMusl, android.X86, linuxMuslX86ToolchainFactory)
407	registerToolchainFactory(android.LinuxMusl, android.X86_64, linuxMuslX8664ToolchainFactory)
408}
409