1package cc
2
3import (
4	"strings"
5
6	"android/soong/common"
7)
8
9var (
10	linuxCflags = []string{
11		"-fno-exceptions", // from build/core/combo/select.mk
12		"-Wno-multichar",  // from build/core/combo/select.mk
13
14		"-fdiagnostics-color",
15
16		"-Wa,--noexecstack",
17
18		"-fPIC",
19		"-no-canonical-prefixes",
20
21		"-U_FORTIFY_SOURCE",
22		"-D_FORTIFY_SOURCE=2",
23		"-fstack-protector",
24
25		// Workaround differences in inttypes.h between host and target.
26		//See bug 12708004.
27		"-D__STDC_FORMAT_MACROS",
28		"-D__STDC_CONSTANT_MACROS",
29
30		// HOST_RELEASE_CFLAGS
31		"-O2", // from build/core/combo/select.mk
32		"-g",  // from build/core/combo/select.mk
33		"-fno-strict-aliasing", // from build/core/combo/select.mk
34	}
35
36	linuxLdflags = []string{
37		"-Wl,-z,noexecstack",
38		"-Wl,-z,relro",
39		"-Wl,-z,now",
40		"-Wl,--no-undefined-version",
41	}
42
43	// Extended cflags
44	linuxX86Cflags = []string{
45		"-msse3",
46		"-mfpmath=sse",
47		"-m32",
48		"-march=prescott",
49		"-D_FILE_OFFSET_BITS=64",
50		"-D_LARGEFILE_SOURCE=1",
51	}
52
53	linuxX8664Cflags = []string{
54		"-m64",
55	}
56
57	linuxX86Ldflags = []string{
58		"-m32",
59		`-Wl,-rpath,\$$ORIGIN/../lib`,
60		`-Wl,-rpath,\$$ORIGIN/lib`,
61	}
62
63	linuxX8664Ldflags = []string{
64		"-m64",
65		`-Wl,-rpath,\$$ORIGIN/../lib64`,
66		`-Wl,-rpath,\$$ORIGIN/lib64`,
67	}
68
69	linuxClangCflags = append(clangFilterUnknownCflags(linuxCflags), []string{
70		"--gcc-toolchain=${linuxGccRoot}",
71		"--sysroot=${linuxGccRoot}/sysroot",
72		"-fstack-protector-strong",
73	}...)
74
75	linuxClangLdflags = append(clangFilterUnknownCflags(linuxLdflags), []string{
76		"--gcc-toolchain=${linuxGccRoot}",
77		"--sysroot=${linuxGccRoot}/sysroot",
78	}...)
79
80	linuxX86ClangLdflags = append(clangFilterUnknownCflags(linuxX86Ldflags), []string{
81		"-B${linuxGccRoot}/lib/gcc/${linuxGccTriple}/${linuxGccVersion}/32",
82		"-L${linuxGccRoot}/lib/gcc/${linuxGccTriple}/${linuxGccVersion}/32",
83		"-L${linuxGccRoot}/${linuxGccTriple}/lib32",
84	}...)
85
86	linuxX8664ClangLdflags = append(clangFilterUnknownCflags(linuxX8664Ldflags), []string{
87		"-B${linuxGccRoot}/lib/gcc/${linuxGccTriple}/${linuxGccVersion}",
88		"-L${linuxGccRoot}/lib/gcc/${linuxGccTriple}/${linuxGccVersion}",
89		"-L${linuxGccRoot}/${linuxGccTriple}/lib64",
90	}...)
91
92	linuxClangCppflags = []string{
93		"-isystem ${linuxGccRoot}/${linuxGccTriple}/include/c++/${linuxGccVersion}",
94		"-isystem ${linuxGccRoot}/${linuxGccTriple}/include/c++/${linuxGccVersion}/backward",
95	}
96
97	linuxX86ClangCppflags = []string{
98		"-isystem ${linuxGccRoot}/${linuxGccTriple}/include/c++/${linuxGccVersion}/${linuxGccTriple}/32",
99	}
100
101	linuxX8664ClangCppflags = []string{
102		"-isystem ${linuxGccRoot}/${linuxGccTriple}/include/c++/${linuxGccVersion}/${linuxGccTriple}",
103	}
104)
105
106const (
107	linuxGccVersion = "4.8"
108)
109
110func init() {
111	pctx.StaticVariable("linuxGccVersion", linuxGccVersion)
112
113	pctx.SourcePathVariable("linuxGccRoot",
114		"prebuilts/gcc/${HostPrebuiltTag}/host/x86_64-linux-glibc2.15-${linuxGccVersion}")
115
116	pctx.StaticVariable("linuxGccTriple", "x86_64-linux")
117
118	pctx.StaticVariable("linuxCflags", strings.Join(linuxCflags, " "))
119	pctx.StaticVariable("linuxLdflags", strings.Join(linuxLdflags, " "))
120
121	pctx.StaticVariable("linuxClangCflags", strings.Join(linuxClangCflags, " "))
122	pctx.StaticVariable("linuxClangLdflags", strings.Join(linuxClangLdflags, " "))
123	pctx.StaticVariable("linuxClangCppflags", strings.Join(linuxClangCppflags, " "))
124
125	// Extended cflags
126	pctx.StaticVariable("linuxX86Cflags", strings.Join(linuxX86Cflags, " "))
127	pctx.StaticVariable("linuxX8664Cflags", strings.Join(linuxX8664Cflags, " "))
128	pctx.StaticVariable("linuxX86Ldflags", strings.Join(linuxX86Ldflags, " "))
129	pctx.StaticVariable("linuxX8664Ldflags", strings.Join(linuxX8664Ldflags, " "))
130
131	pctx.StaticVariable("linuxX86ClangCflags",
132		strings.Join(clangFilterUnknownCflags(linuxX86Cflags), " "))
133	pctx.StaticVariable("linuxX8664ClangCflags",
134		strings.Join(clangFilterUnknownCflags(linuxX8664Cflags), " "))
135	pctx.StaticVariable("linuxX86ClangLdflags", strings.Join(linuxX86ClangLdflags, " "))
136	pctx.StaticVariable("linuxX8664ClangLdflags", strings.Join(linuxX8664ClangLdflags, " "))
137	pctx.StaticVariable("linuxX86ClangCppflags", strings.Join(linuxX86ClangCppflags, " "))
138	pctx.StaticVariable("linuxX8664ClangCppflags", strings.Join(linuxX8664ClangCppflags, " "))
139}
140
141type toolchainLinux struct {
142	cFlags, ldFlags string
143}
144
145type toolchainLinuxX86 struct {
146	toolchain32Bit
147	toolchainLinux
148}
149
150type toolchainLinuxX8664 struct {
151	toolchain64Bit
152	toolchainLinux
153}
154
155func (t *toolchainLinuxX86) Name() string {
156	return "x86"
157}
158
159func (t *toolchainLinuxX8664) Name() string {
160	return "x86_64"
161}
162
163func (t *toolchainLinux) GccRoot() string {
164	return "${linuxGccRoot}"
165}
166
167func (t *toolchainLinux) GccTriple() string {
168	return "${linuxGccTriple}"
169}
170
171func (t *toolchainLinux) GccVersion() string {
172	return linuxGccVersion
173}
174
175func (t *toolchainLinuxX86) Cflags() string {
176	return "${linuxCflags} ${linuxX86Cflags}"
177}
178
179func (t *toolchainLinuxX8664) Cflags() string {
180	return "${linuxCflags} ${linuxX8664Cflags}"
181}
182
183func (t *toolchainLinux) Cppflags() string {
184	return ""
185}
186
187func (t *toolchainLinuxX86) Ldflags() string {
188	return "${linuxLdflags} ${linuxX86Ldflags}"
189}
190
191func (t *toolchainLinuxX8664) Ldflags() string {
192	return "${linuxLdflags} ${linuxX8664Ldflags}"
193}
194
195func (t *toolchainLinux) IncludeFlags() string {
196	return ""
197}
198
199func (t *toolchainLinuxX86) ClangTriple() string {
200	return "i686-linux-gnu"
201}
202
203func (t *toolchainLinuxX86) ClangCflags() string {
204	return "${linuxClangCflags} ${linuxX86ClangCflags}"
205}
206
207func (t *toolchainLinuxX86) ClangCppflags() string {
208	return "${linuxClangCppflags} ${linuxX86ClangCppflags}"
209}
210
211func (t *toolchainLinuxX8664) ClangTriple() string {
212	return "x86_64-linux-gnu"
213}
214
215func (t *toolchainLinuxX8664) ClangCflags() string {
216	return "${linuxClangCflags} ${linuxX8664ClangCflags}"
217}
218
219func (t *toolchainLinuxX8664) ClangCppflags() string {
220	return "${linuxClangCppflags} ${linuxX8664ClangCppflags}"
221}
222
223func (t *toolchainLinuxX86) ClangLdflags() string {
224	return "${linuxClangLdflags} ${linuxX86ClangLdflags}"
225}
226
227func (t *toolchainLinuxX8664) ClangLdflags() string {
228	return "${linuxClangLdflags} ${linuxX8664ClangLdflags}"
229}
230
231var toolchainLinuxX86Singleton Toolchain = &toolchainLinuxX86{}
232var toolchainLinuxX8664Singleton Toolchain = &toolchainLinuxX8664{}
233
234func linuxX86ToolchainFactory(arch common.Arch) Toolchain {
235	return toolchainLinuxX86Singleton
236}
237
238func linuxX8664ToolchainFactory(arch common.Arch) Toolchain {
239	return toolchainLinuxX8664Singleton
240}
241
242func init() {
243	registerHostToolchainFactory(common.Linux, common.X86, linuxX86ToolchainFactory)
244	registerHostToolchainFactory(common.Linux, common.X86_64, linuxX8664ToolchainFactory)
245}
246