blob: 795620b3a414f3a77f13cacae686f355bb0551af [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",
40 "-Wl,--build-id=md5",
41 "-Wl,--warn-shared-textrel",
42 "-Wl,--fatal-warnings",
43 "-Wl,-icf=safe",
44 "-Wl,--hash-style=gnu",
45
46 // Disable transitive dependency library symbol resolving.
47 "-Wl,--allow-shlib-undefined",
48 }
49
50 // Extended cflags
51 linuxX86Cflags = []string{
52 "-msse3",
53 "-mfpmath=sse",
54 "-m32",
55 "-march=prescott",
56 }
57
58 linuxX8664Cflags = []string{
59 "-m64",
60 }
61
62 linuxX86Ldflags = []string{
63 "-m32",
64 }
65
66 linuxX8664Ldflags = []string{
67 "-m64",
68 }
69
70 linuxClangCflags = append([]string{
71 "--gcc-toolchain=${linuxGccRoot}",
72 "--sysroot=${linuxGccRoot}/sysroot",
73 }, clangFilterUnknownCflags(linuxCflags)...)
74
75 linuxClangLdflags = append([]string{
76 "--gcc-toolchain=${linuxGccRoot}",
77 "--sysroot=${linuxGccRoot}/sysroot",
78 }, clangFilterUnknownCflags(linuxLdflags)...)
79
80 linuxX86ClangLdflags = append([]string{
81 "-B${linuxGccRoot}/lib/gcc/${linuxGccTriple}/${linuxGccVersion}/32",
82 "-L${linuxGccRoot}/lib/gcc/${linuxGccTriple}/${linuxGccVersion}/32",
83 "-L${linuxGccRoot}/${linuxGccTriple}/lib32",
84 }, clangFilterUnknownCflags(linuxX86Ldflags)...)
85
86 linuxX8664ClangLdflags = append([]string{
87 "-B${linuxGccRoot}/lib/gcc/${linuxGccTriple}/${linuxGccVersion}",
88 "-L${linuxGccRoot}/lib/gcc/${linuxGccTriple}/${linuxGccVersion}",
89 "-L${linuxGccRoot}/${linuxGccTriple}/lib64",
90 }, clangFilterUnknownCflags(linuxX8664Ldflags)...)
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
106func init() {
107 pctx.StaticVariable("linuxGccVersion", "4.8")
108
109 pctx.StaticVariable("linuxGccRoot",
110 "${SrcDir}/prebuilts/gcc/${HostPrebuiltTag}/host/x86_64-linux-glibc2.15-${linuxGccVersion}")
111
112 pctx.StaticVariable("linuxGccTriple", "x86_64-linux")
113
114 pctx.StaticVariable("linuxCflags", strings.Join(linuxCflags, " "))
115 pctx.StaticVariable("linuxLdflags", strings.Join(linuxLdflags, " "))
116
117 pctx.StaticVariable("linuxClangCflags", strings.Join(linuxClangCflags, " "))
118 pctx.StaticVariable("linuxClangLdflags", strings.Join(linuxClangLdflags, " "))
119 pctx.StaticVariable("linuxClangCppflags", strings.Join(linuxClangCppflags, " "))
120
121 // Extended cflags
122 pctx.StaticVariable("linuxX86Cflags", strings.Join(linuxX86Cflags, " "))
123 pctx.StaticVariable("linuxX8664Cflags", strings.Join(linuxX8664Cflags, " "))
124 pctx.StaticVariable("linuxX86Ldflags", strings.Join(linuxX86Ldflags, " "))
125 pctx.StaticVariable("linuxX8664Ldflags", strings.Join(linuxX8664Ldflags, " "))
126
127 pctx.StaticVariable("linuxX86ClangCflags",
128 strings.Join(clangFilterUnknownCflags(linuxX86Cflags), " "))
129 pctx.StaticVariable("linuxX8664ClangCflags",
130 strings.Join(clangFilterUnknownCflags(linuxX8664Cflags), " "))
131 pctx.StaticVariable("linuxX86ClangLdflags", strings.Join(linuxX86ClangLdflags, " "))
132 pctx.StaticVariable("linuxX8664ClangLdflags", strings.Join(linuxX8664ClangLdflags, " "))
133 pctx.StaticVariable("linuxX86ClangCppflags", strings.Join(linuxX86ClangCppflags, " "))
134 pctx.StaticVariable("linuxX8664ClangCppflags", strings.Join(linuxX8664ClangCppflags, " "))
135}
136
137type toolchainLinux struct {
138 cFlags, ldFlags string
139}
140
141type toolchainLinuxX86 struct {
142 toolchain32Bit
143 toolchainLinux
144}
145
146type toolchainLinuxX8664 struct {
147 toolchain64Bit
148 toolchainLinux
149}
150
151func (t *toolchainLinux) GccRoot() string {
152 return "${linuxGccRoot}"
153}
154
155func (t *toolchainLinux) GccTriple() string {
156 return "${linuxGccTriple}"
157}
158
159func (t *toolchainLinuxX86) Cflags() string {
160 return "${linuxCflags} ${linuxX86Cflags}"
161}
162
163func (t *toolchainLinuxX8664) Cflags() string {
164 return "${linuxCflags} ${linuxX8664Cflags}"
165}
166
167func (t *toolchainLinux) Cppflags() string {
168 return ""
169}
170
171func (t *toolchainLinuxX86) Ldflags() string {
172 return "${linuxLdflags} ${linuxX86Ldflags}"
173}
174
175func (t *toolchainLinuxX8664) Ldflags() string {
176 return "${linuxLdflags} ${linuxX8664Ldflags}"
177}
178
179func (t *toolchainLinux) IncludeFlags() string {
180 return ""
181}
182
183func (t *toolchainLinuxX86) ClangTriple() string {
184 return "i686-linux-gnu"
185}
186
187func (t *toolchainLinuxX86) ClangCflags() string {
188 return "${linuxClangCflags} ${linuxX86ClangCflags}"
189}
190
191func (t *toolchainLinuxX86) ClangCppflags() string {
192 return "${linuxClangCppflags} ${linuxX86ClangCppflags}"
193}
194
195func (t *toolchainLinuxX8664) ClangTriple() string {
196 return "x86_64-linux-gnu"
197}
198
199func (t *toolchainLinuxX8664) ClangCflags() string {
200 return "${linuxClangCflags} ${linuxX8664ClangCflags}"
201}
202
203func (t *toolchainLinuxX8664) ClangCppflags() string {
204 return "${linuxClangCppflags} ${linuxX8664ClangCppflags}"
205}
206
207func (t *toolchainLinuxX86) ClangLdflags() string {
208 return "${linuxClangLdflags} ${linuxX86ClangLdflags}"
209}
210
211func (t *toolchainLinuxX8664) ClangLdflags() string {
212 return "${linuxClangLdflags} ${linuxX8664ClangLdflags}"
213}
214
Colin Cross97ba0732015-03-23 17:50:24 -0700215var toolchainLinuxX86Singleton Toolchain = &toolchainLinuxX86{}
216var toolchainLinuxX8664Singleton Toolchain = &toolchainLinuxX8664{}
Colin Cross3f40fa42015-01-30 17:27:36 -0800217
Colin Cross97ba0732015-03-23 17:50:24 -0700218func linuxX86ToolchainFactory(archVariant string, cpuVariant string) Toolchain {
Colin Cross3f40fa42015-01-30 17:27:36 -0800219 return toolchainLinuxX86Singleton
220}
221
Colin Cross97ba0732015-03-23 17:50:24 -0700222func linuxX8664ToolchainFactory(archVariant string, cpuVariant string) Toolchain {
Colin Cross3f40fa42015-01-30 17:27:36 -0800223 return toolchainLinuxX8664Singleton
224}
225
226func init() {
227 if runtime.GOOS == "linux" {
228 registerToolchainFactory(common.Host, common.X86, linuxX86ToolchainFactory)
229 registerToolchainFactory(common.Host, common.X86_64, linuxX8664ToolchainFactory)
230 }
231}