blob: 8f24b056ac5a4e6fe3bc4196fe5c8ee01753afc9 [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",
Colin Cross3f40fa42015-01-30 17:27:36 -080019
Colin Cross3f40fa42015-01-30 17:27:36 -080020 "-U_FORTIFY_SOURCE",
Dan Willemsen3bf6b472015-09-11 17:41:10 -070021 "-D_FORTIFY_SOURCE=2",
Colin Cross74d1ec02015-04-28 13:30:13 -070022 "-fstack-protector",
Colin Cross3f40fa42015-01-30 17:27:36 -080023
24 // Workaround differences in inttypes.h between host and target.
25 //See bug 12708004.
26 "-D__STDC_FORMAT_MACROS",
27 "-D__STDC_CONSTANT_MACROS",
28
29 // HOST_RELEASE_CFLAGS
30 "-O2", // from build/core/combo/select.mk
31 "-g", // from build/core/combo/select.mk
32 "-fno-strict-aliasing", // from build/core/combo/select.mk
33 }
34
35 linuxLdflags = []string{
36 "-Wl,-z,noexecstack",
37 "-Wl,-z,relro",
38 "-Wl,-z,now",
Colin Cross3f40fa42015-01-30 17:27:36 -080039 }
40
41 // Extended cflags
42 linuxX86Cflags = []string{
43 "-msse3",
44 "-mfpmath=sse",
45 "-m32",
46 "-march=prescott",
Dan Willemsen3bf6b472015-09-11 17:41:10 -070047 "-D_FILE_OFFSET_BITS=64",
48 "-D_LARGEFILE_SOURCE=1",
Colin Cross3f40fa42015-01-30 17:27:36 -080049 }
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`,
Dan Willemsen3bf6b472015-09-11 17:41:10 -070058 `-Wl,-rpath,\$$ORIGIN/lib`,
Colin Cross3f40fa42015-01-30 17:27:36 -080059 }
60
61 linuxX8664Ldflags = []string{
62 "-m64",
Colin Cross8df14ac2015-04-07 16:52:05 -070063 `-Wl,-rpath,\$$ORIGIN/../lib64`,
Dan Willemsen3bf6b472015-09-11 17:41:10 -070064 `-Wl,-rpath,\$$ORIGIN/lib64`,
Colin Cross3f40fa42015-01-30 17:27:36 -080065 }
66
67 linuxClangCflags = append([]string{
68 "--gcc-toolchain=${linuxGccRoot}",
69 "--sysroot=${linuxGccRoot}/sysroot",
70 }, clangFilterUnknownCflags(linuxCflags)...)
71
72 linuxClangLdflags = append([]string{
73 "--gcc-toolchain=${linuxGccRoot}",
74 "--sysroot=${linuxGccRoot}/sysroot",
75 }, clangFilterUnknownCflags(linuxLdflags)...)
76
77 linuxX86ClangLdflags = append([]string{
78 "-B${linuxGccRoot}/lib/gcc/${linuxGccTriple}/${linuxGccVersion}/32",
79 "-L${linuxGccRoot}/lib/gcc/${linuxGccTriple}/${linuxGccVersion}/32",
80 "-L${linuxGccRoot}/${linuxGccTriple}/lib32",
81 }, clangFilterUnknownCflags(linuxX86Ldflags)...)
82
83 linuxX8664ClangLdflags = append([]string{
84 "-B${linuxGccRoot}/lib/gcc/${linuxGccTriple}/${linuxGccVersion}",
85 "-L${linuxGccRoot}/lib/gcc/${linuxGccTriple}/${linuxGccVersion}",
86 "-L${linuxGccRoot}/${linuxGccTriple}/lib64",
87 }, clangFilterUnknownCflags(linuxX8664Ldflags)...)
88
89 linuxClangCppflags = []string{
90 "-isystem ${linuxGccRoot}/${linuxGccTriple}/include/c++/${linuxGccVersion}",
91 "-isystem ${linuxGccRoot}/${linuxGccTriple}/include/c++/${linuxGccVersion}/backward",
92 }
93
94 linuxX86ClangCppflags = []string{
95 "-isystem ${linuxGccRoot}/${linuxGccTriple}/include/c++/${linuxGccVersion}/${linuxGccTriple}/32",
96 }
97
98 linuxX8664ClangCppflags = []string{
99 "-isystem ${linuxGccRoot}/${linuxGccTriple}/include/c++/${linuxGccVersion}/${linuxGccTriple}",
100 }
101)
102
103func init() {
104 pctx.StaticVariable("linuxGccVersion", "4.8")
105
106 pctx.StaticVariable("linuxGccRoot",
107 "${SrcDir}/prebuilts/gcc/${HostPrebuiltTag}/host/x86_64-linux-glibc2.15-${linuxGccVersion}")
108
109 pctx.StaticVariable("linuxGccTriple", "x86_64-linux")
110
111 pctx.StaticVariable("linuxCflags", strings.Join(linuxCflags, " "))
112 pctx.StaticVariable("linuxLdflags", strings.Join(linuxLdflags, " "))
113
114 pctx.StaticVariable("linuxClangCflags", strings.Join(linuxClangCflags, " "))
115 pctx.StaticVariable("linuxClangLdflags", strings.Join(linuxClangLdflags, " "))
116 pctx.StaticVariable("linuxClangCppflags", strings.Join(linuxClangCppflags, " "))
117
118 // Extended cflags
119 pctx.StaticVariable("linuxX86Cflags", strings.Join(linuxX86Cflags, " "))
120 pctx.StaticVariable("linuxX8664Cflags", strings.Join(linuxX8664Cflags, " "))
121 pctx.StaticVariable("linuxX86Ldflags", strings.Join(linuxX86Ldflags, " "))
122 pctx.StaticVariable("linuxX8664Ldflags", strings.Join(linuxX8664Ldflags, " "))
123
124 pctx.StaticVariable("linuxX86ClangCflags",
125 strings.Join(clangFilterUnknownCflags(linuxX86Cflags), " "))
126 pctx.StaticVariable("linuxX8664ClangCflags",
127 strings.Join(clangFilterUnknownCflags(linuxX8664Cflags), " "))
128 pctx.StaticVariable("linuxX86ClangLdflags", strings.Join(linuxX86ClangLdflags, " "))
129 pctx.StaticVariable("linuxX8664ClangLdflags", strings.Join(linuxX8664ClangLdflags, " "))
130 pctx.StaticVariable("linuxX86ClangCppflags", strings.Join(linuxX86ClangCppflags, " "))
131 pctx.StaticVariable("linuxX8664ClangCppflags", strings.Join(linuxX8664ClangCppflags, " "))
132}
133
134type toolchainLinux struct {
135 cFlags, ldFlags string
136}
137
138type toolchainLinuxX86 struct {
139 toolchain32Bit
140 toolchainLinux
141}
142
143type toolchainLinuxX8664 struct {
144 toolchain64Bit
145 toolchainLinux
146}
147
Dan Albertbe961682015-03-18 23:38:50 -0700148func (t *toolchainLinuxX86) Name() string {
149 return "x86"
150}
151
152func (t *toolchainLinuxX8664) Name() string {
153 return "x86_64"
154}
155
Colin Cross3f40fa42015-01-30 17:27:36 -0800156func (t *toolchainLinux) GccRoot() string {
157 return "${linuxGccRoot}"
158}
159
160func (t *toolchainLinux) GccTriple() string {
161 return "${linuxGccTriple}"
162}
163
Dan Albertbe961682015-03-18 23:38:50 -0700164func (t *toolchainLinux) GccVersion() string {
165 return "${linuxGccVersion}"
166}
167
Colin Cross3f40fa42015-01-30 17:27:36 -0800168func (t *toolchainLinuxX86) Cflags() string {
169 return "${linuxCflags} ${linuxX86Cflags}"
170}
171
172func (t *toolchainLinuxX8664) Cflags() string {
173 return "${linuxCflags} ${linuxX8664Cflags}"
174}
175
176func (t *toolchainLinux) Cppflags() string {
177 return ""
178}
179
180func (t *toolchainLinuxX86) Ldflags() string {
181 return "${linuxLdflags} ${linuxX86Ldflags}"
182}
183
184func (t *toolchainLinuxX8664) Ldflags() string {
185 return "${linuxLdflags} ${linuxX8664Ldflags}"
186}
187
188func (t *toolchainLinux) IncludeFlags() string {
189 return ""
190}
191
192func (t *toolchainLinuxX86) ClangTriple() string {
193 return "i686-linux-gnu"
194}
195
196func (t *toolchainLinuxX86) ClangCflags() string {
197 return "${linuxClangCflags} ${linuxX86ClangCflags}"
198}
199
200func (t *toolchainLinuxX86) ClangCppflags() string {
201 return "${linuxClangCppflags} ${linuxX86ClangCppflags}"
202}
203
204func (t *toolchainLinuxX8664) ClangTriple() string {
205 return "x86_64-linux-gnu"
206}
207
208func (t *toolchainLinuxX8664) ClangCflags() string {
209 return "${linuxClangCflags} ${linuxX8664ClangCflags}"
210}
211
212func (t *toolchainLinuxX8664) ClangCppflags() string {
213 return "${linuxClangCppflags} ${linuxX8664ClangCppflags}"
214}
215
216func (t *toolchainLinuxX86) ClangLdflags() string {
217 return "${linuxClangLdflags} ${linuxX86ClangLdflags}"
218}
219
220func (t *toolchainLinuxX8664) ClangLdflags() string {
221 return "${linuxClangLdflags} ${linuxX8664ClangLdflags}"
222}
223
Colin Cross97ba0732015-03-23 17:50:24 -0700224var toolchainLinuxX86Singleton Toolchain = &toolchainLinuxX86{}
225var toolchainLinuxX8664Singleton Toolchain = &toolchainLinuxX8664{}
Colin Cross3f40fa42015-01-30 17:27:36 -0800226
Colin Cross97ba0732015-03-23 17:50:24 -0700227func linuxX86ToolchainFactory(archVariant string, cpuVariant string) Toolchain {
Colin Cross3f40fa42015-01-30 17:27:36 -0800228 return toolchainLinuxX86Singleton
229}
230
Colin Cross97ba0732015-03-23 17:50:24 -0700231func linuxX8664ToolchainFactory(archVariant string, cpuVariant string) Toolchain {
Colin Cross3f40fa42015-01-30 17:27:36 -0800232 return toolchainLinuxX8664Singleton
233}
234
235func init() {
236 if runtime.GOOS == "linux" {
237 registerToolchainFactory(common.Host, common.X86, linuxX86ToolchainFactory)
238 registerToolchainFactory(common.Host, common.X86_64, linuxX8664ToolchainFactory)
239 }
240}