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