blob: 05e572007acc546fa34db682cf77d404093ad27c [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
21 // Disable new longjmp in glibc 2.11 and later. See bug 2967937. Same for 2.15?
22 "-U_FORTIFY_SOURCE",
23 "-D_FORTIFY_SOURCE=0",
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",
Colin Cross3f40fa42015-01-30 17:27:36 -080040 }
41
42 // Extended cflags
43 linuxX86Cflags = []string{
44 "-msse3",
45 "-mfpmath=sse",
46 "-m32",
47 "-march=prescott",
48 }
49
50 linuxX8664Cflags = []string{
51 "-m64",
52 }
53
54 linuxX86Ldflags = []string{
55 "-m32",
Colin Cross8df14ac2015-04-07 16:52:05 -070056 `-Wl,-rpath,\$$ORIGIN/../lib`,
Colin Cross3f40fa42015-01-30 17:27:36 -080057 }
58
59 linuxX8664Ldflags = []string{
60 "-m64",
Colin Cross8df14ac2015-04-07 16:52:05 -070061 `-Wl,-rpath,\$$ORIGIN/../lib64`,
Colin Cross3f40fa42015-01-30 17:27:36 -080062 }
63
64 linuxClangCflags = append([]string{
65 "--gcc-toolchain=${linuxGccRoot}",
66 "--sysroot=${linuxGccRoot}/sysroot",
67 }, clangFilterUnknownCflags(linuxCflags)...)
68
69 linuxClangLdflags = append([]string{
70 "--gcc-toolchain=${linuxGccRoot}",
71 "--sysroot=${linuxGccRoot}/sysroot",
72 }, clangFilterUnknownCflags(linuxLdflags)...)
73
74 linuxX86ClangLdflags = append([]string{
75 "-B${linuxGccRoot}/lib/gcc/${linuxGccTriple}/${linuxGccVersion}/32",
76 "-L${linuxGccRoot}/lib/gcc/${linuxGccTriple}/${linuxGccVersion}/32",
77 "-L${linuxGccRoot}/${linuxGccTriple}/lib32",
78 }, clangFilterUnknownCflags(linuxX86Ldflags)...)
79
80 linuxX8664ClangLdflags = append([]string{
81 "-B${linuxGccRoot}/lib/gcc/${linuxGccTriple}/${linuxGccVersion}",
82 "-L${linuxGccRoot}/lib/gcc/${linuxGccTriple}/${linuxGccVersion}",
83 "-L${linuxGccRoot}/${linuxGccTriple}/lib64",
84 }, clangFilterUnknownCflags(linuxX8664Ldflags)...)
85
86 linuxClangCppflags = []string{
87 "-isystem ${linuxGccRoot}/${linuxGccTriple}/include/c++/${linuxGccVersion}",
88 "-isystem ${linuxGccRoot}/${linuxGccTriple}/include/c++/${linuxGccVersion}/backward",
89 }
90
91 linuxX86ClangCppflags = []string{
92 "-isystem ${linuxGccRoot}/${linuxGccTriple}/include/c++/${linuxGccVersion}/${linuxGccTriple}/32",
93 }
94
95 linuxX8664ClangCppflags = []string{
96 "-isystem ${linuxGccRoot}/${linuxGccTriple}/include/c++/${linuxGccVersion}/${linuxGccTriple}",
97 }
98)
99
100func init() {
101 pctx.StaticVariable("linuxGccVersion", "4.8")
102
103 pctx.StaticVariable("linuxGccRoot",
104 "${SrcDir}/prebuilts/gcc/${HostPrebuiltTag}/host/x86_64-linux-glibc2.15-${linuxGccVersion}")
105
106 pctx.StaticVariable("linuxGccTriple", "x86_64-linux")
107
108 pctx.StaticVariable("linuxCflags", strings.Join(linuxCflags, " "))
109 pctx.StaticVariable("linuxLdflags", strings.Join(linuxLdflags, " "))
110
111 pctx.StaticVariable("linuxClangCflags", strings.Join(linuxClangCflags, " "))
112 pctx.StaticVariable("linuxClangLdflags", strings.Join(linuxClangLdflags, " "))
113 pctx.StaticVariable("linuxClangCppflags", strings.Join(linuxClangCppflags, " "))
114
115 // Extended cflags
116 pctx.StaticVariable("linuxX86Cflags", strings.Join(linuxX86Cflags, " "))
117 pctx.StaticVariable("linuxX8664Cflags", strings.Join(linuxX8664Cflags, " "))
118 pctx.StaticVariable("linuxX86Ldflags", strings.Join(linuxX86Ldflags, " "))
119 pctx.StaticVariable("linuxX8664Ldflags", strings.Join(linuxX8664Ldflags, " "))
120
121 pctx.StaticVariable("linuxX86ClangCflags",
122 strings.Join(clangFilterUnknownCflags(linuxX86Cflags), " "))
123 pctx.StaticVariable("linuxX8664ClangCflags",
124 strings.Join(clangFilterUnknownCflags(linuxX8664Cflags), " "))
125 pctx.StaticVariable("linuxX86ClangLdflags", strings.Join(linuxX86ClangLdflags, " "))
126 pctx.StaticVariable("linuxX8664ClangLdflags", strings.Join(linuxX8664ClangLdflags, " "))
127 pctx.StaticVariable("linuxX86ClangCppflags", strings.Join(linuxX86ClangCppflags, " "))
128 pctx.StaticVariable("linuxX8664ClangCppflags", strings.Join(linuxX8664ClangCppflags, " "))
129}
130
131type toolchainLinux struct {
132 cFlags, ldFlags string
133}
134
135type toolchainLinuxX86 struct {
136 toolchain32Bit
137 toolchainLinux
138}
139
140type toolchainLinuxX8664 struct {
141 toolchain64Bit
142 toolchainLinux
143}
144
Dan Albertbe961682015-03-18 23:38:50 -0700145func (t *toolchainLinuxX86) Name() string {
146 return "x86"
147}
148
149func (t *toolchainLinuxX8664) Name() string {
150 return "x86_64"
151}
152
Colin Cross3f40fa42015-01-30 17:27:36 -0800153func (t *toolchainLinux) GccRoot() string {
154 return "${linuxGccRoot}"
155}
156
157func (t *toolchainLinux) GccTriple() string {
158 return "${linuxGccTriple}"
159}
160
Dan Albertbe961682015-03-18 23:38:50 -0700161func (t *toolchainLinux) GccVersion() string {
162 return "${linuxGccVersion}"
163}
164
Colin Cross3f40fa42015-01-30 17:27:36 -0800165func (t *toolchainLinuxX86) Cflags() string {
166 return "${linuxCflags} ${linuxX86Cflags}"
167}
168
169func (t *toolchainLinuxX8664) Cflags() string {
170 return "${linuxCflags} ${linuxX8664Cflags}"
171}
172
173func (t *toolchainLinux) Cppflags() string {
174 return ""
175}
176
177func (t *toolchainLinuxX86) Ldflags() string {
178 return "${linuxLdflags} ${linuxX86Ldflags}"
179}
180
181func (t *toolchainLinuxX8664) Ldflags() string {
182 return "${linuxLdflags} ${linuxX8664Ldflags}"
183}
184
185func (t *toolchainLinux) IncludeFlags() string {
186 return ""
187}
188
189func (t *toolchainLinuxX86) ClangTriple() string {
190 return "i686-linux-gnu"
191}
192
193func (t *toolchainLinuxX86) ClangCflags() string {
194 return "${linuxClangCflags} ${linuxX86ClangCflags}"
195}
196
197func (t *toolchainLinuxX86) ClangCppflags() string {
198 return "${linuxClangCppflags} ${linuxX86ClangCppflags}"
199}
200
201func (t *toolchainLinuxX8664) ClangTriple() string {
202 return "x86_64-linux-gnu"
203}
204
205func (t *toolchainLinuxX8664) ClangCflags() string {
206 return "${linuxClangCflags} ${linuxX8664ClangCflags}"
207}
208
209func (t *toolchainLinuxX8664) ClangCppflags() string {
210 return "${linuxClangCppflags} ${linuxX8664ClangCppflags}"
211}
212
213func (t *toolchainLinuxX86) ClangLdflags() string {
214 return "${linuxClangLdflags} ${linuxX86ClangLdflags}"
215}
216
217func (t *toolchainLinuxX8664) ClangLdflags() string {
218 return "${linuxClangLdflags} ${linuxX8664ClangLdflags}"
219}
220
Colin Cross97ba0732015-03-23 17:50:24 -0700221var toolchainLinuxX86Singleton Toolchain = &toolchainLinuxX86{}
222var toolchainLinuxX8664Singleton Toolchain = &toolchainLinuxX8664{}
Colin Cross3f40fa42015-01-30 17:27:36 -0800223
Colin Cross97ba0732015-03-23 17:50:24 -0700224func linuxX86ToolchainFactory(archVariant string, cpuVariant string) Toolchain {
Colin Cross3f40fa42015-01-30 17:27:36 -0800225 return toolchainLinuxX86Singleton
226}
227
Colin Cross97ba0732015-03-23 17:50:24 -0700228func linuxX8664ToolchainFactory(archVariant string, cpuVariant string) Toolchain {
Colin Cross3f40fa42015-01-30 17:27:36 -0800229 return toolchainLinuxX8664Singleton
230}
231
232func init() {
233 if runtime.GOOS == "linux" {
234 registerToolchainFactory(common.Host, common.X86, linuxX86ToolchainFactory)
235 registerToolchainFactory(common.Host, common.X86_64, linuxX8664ToolchainFactory)
236 }
237}