blob: b2d84625168b4a2a46fe8bd8b9681cc3900e4918 [file] [log] [blame]
Colin Cross3f40fa42015-01-30 17:27:36 -08001package cc
2
3import (
Colin Cross3f40fa42015-01-30 17:27:36 -08004 "strings"
5
Colin Cross635c3b02016-05-18 15:37:25 -07006 "android/soong/android"
Colin Cross3f40fa42015-01-30 17:27:36 -08007)
8
9var (
10 linuxCflags = []string{
11 "-fno-exceptions", // from build/core/combo/select.mk
12 "-Wno-multichar", // from build/core/combo/select.mk
13
Dan Willemsen490fd492015-11-24 17:53:15 -080014 "-fdiagnostics-color",
15
Colin Cross3f40fa42015-01-30 17:27:36 -080016 "-Wa,--noexecstack",
17
18 "-fPIC",
19 "-no-canonical-prefixes",
Colin Cross3f40fa42015-01-30 17:27:36 -080020
Colin Cross3f40fa42015-01-30 17:27:36 -080021 "-U_FORTIFY_SOURCE",
Dan Willemsen3bf6b472015-09-11 17:41:10 -070022 "-D_FORTIFY_SOURCE=2",
Colin Cross74d1ec02015-04-28 13:30:13 -070023 "-fstack-protector",
Colin Cross3f40fa42015-01-30 17:27:36 -080024
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",
Dan Willemsenc7e45972015-12-09 13:05:28 -080040 "-Wl,--no-undefined-version",
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",
Dan Willemsen3bf6b472015-09-11 17:41:10 -070049 "-D_FILE_OFFSET_BITS=64",
50 "-D_LARGEFILE_SOURCE=1",
Colin Cross3f40fa42015-01-30 17:27:36 -080051 }
52
53 linuxX8664Cflags = []string{
54 "-m64",
55 }
56
57 linuxX86Ldflags = []string{
58 "-m32",
59 }
60
61 linuxX8664Ldflags = []string{
62 "-m64",
63 }
64
Dan Willemsenf534a102016-03-03 17:22:39 -080065 linuxClangCflags = append(clangFilterUnknownCflags(linuxCflags), []string{
Colin Cross3f40fa42015-01-30 17:27:36 -080066 "--gcc-toolchain=${linuxGccRoot}",
Dan Willemsen01fdd3d2016-03-30 00:01:12 -070067 "--sysroot ${linuxGccRoot}/sysroot",
Dan Willemsen7a0f8482016-01-12 16:22:40 -080068 "-fstack-protector-strong",
Dan Willemsenf534a102016-03-03 17:22:39 -080069 }...)
Colin Cross3f40fa42015-01-30 17:27:36 -080070
Dan Willemsenf534a102016-03-03 17:22:39 -080071 linuxClangLdflags = append(clangFilterUnknownCflags(linuxLdflags), []string{
Colin Cross3f40fa42015-01-30 17:27:36 -080072 "--gcc-toolchain=${linuxGccRoot}",
Dan Willemsen01fdd3d2016-03-30 00:01:12 -070073 "--sysroot ${linuxGccRoot}/sysroot",
Dan Willemsenf534a102016-03-03 17:22:39 -080074 }...)
Colin Cross3f40fa42015-01-30 17:27:36 -080075
Dan Willemsenf534a102016-03-03 17:22:39 -080076 linuxX86ClangLdflags = append(clangFilterUnknownCflags(linuxX86Ldflags), []string{
Colin Cross3f40fa42015-01-30 17:27:36 -080077 "-B${linuxGccRoot}/lib/gcc/${linuxGccTriple}/${linuxGccVersion}/32",
78 "-L${linuxGccRoot}/lib/gcc/${linuxGccTriple}/${linuxGccVersion}/32",
79 "-L${linuxGccRoot}/${linuxGccTriple}/lib32",
Dan Willemsenf534a102016-03-03 17:22:39 -080080 }...)
Colin Cross3f40fa42015-01-30 17:27:36 -080081
Dan Willemsenf534a102016-03-03 17:22:39 -080082 linuxX8664ClangLdflags = append(clangFilterUnknownCflags(linuxX8664Ldflags), []string{
Colin Cross3f40fa42015-01-30 17:27:36 -080083 "-B${linuxGccRoot}/lib/gcc/${linuxGccTriple}/${linuxGccVersion}",
84 "-L${linuxGccRoot}/lib/gcc/${linuxGccTriple}/${linuxGccVersion}",
85 "-L${linuxGccRoot}/${linuxGccTriple}/lib64",
Dan Willemsenf534a102016-03-03 17:22:39 -080086 }...)
Colin Cross3f40fa42015-01-30 17:27:36 -080087
88 linuxClangCppflags = []string{
89 "-isystem ${linuxGccRoot}/${linuxGccTriple}/include/c++/${linuxGccVersion}",
90 "-isystem ${linuxGccRoot}/${linuxGccTriple}/include/c++/${linuxGccVersion}/backward",
91 }
92
93 linuxX86ClangCppflags = []string{
94 "-isystem ${linuxGccRoot}/${linuxGccTriple}/include/c++/${linuxGccVersion}/${linuxGccTriple}/32",
95 }
96
97 linuxX8664ClangCppflags = []string{
98 "-isystem ${linuxGccRoot}/${linuxGccTriple}/include/c++/${linuxGccVersion}/${linuxGccTriple}",
99 }
Dan Willemsen20acc5c2016-05-25 14:47:21 -0700100
101 linuxAvailableLibraries = addPrefix([]string{
102 "c",
103 "dl",
104 "gcc",
105 "gcc_s",
106 "m",
107 "ncurses",
108 "pthread",
109 "resolv",
110 "rt",
111 "util",
112 "z",
113 }, "-l")
Colin Cross3f40fa42015-01-30 17:27:36 -0800114)
115
Dan Willemsen34fc3b12015-12-07 12:30:44 -0800116const (
117 linuxGccVersion = "4.8"
118)
119
Colin Cross3f40fa42015-01-30 17:27:36 -0800120func init() {
Dan Willemsen34fc3b12015-12-07 12:30:44 -0800121 pctx.StaticVariable("linuxGccVersion", linuxGccVersion)
Colin Cross3f40fa42015-01-30 17:27:36 -0800122
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700123 pctx.SourcePathVariable("linuxGccRoot",
124 "prebuilts/gcc/${HostPrebuiltTag}/host/x86_64-linux-glibc2.15-${linuxGccVersion}")
Colin Cross3f40fa42015-01-30 17:27:36 -0800125
126 pctx.StaticVariable("linuxGccTriple", "x86_64-linux")
127
128 pctx.StaticVariable("linuxCflags", strings.Join(linuxCflags, " "))
129 pctx.StaticVariable("linuxLdflags", strings.Join(linuxLdflags, " "))
130
131 pctx.StaticVariable("linuxClangCflags", strings.Join(linuxClangCflags, " "))
132 pctx.StaticVariable("linuxClangLdflags", strings.Join(linuxClangLdflags, " "))
133 pctx.StaticVariable("linuxClangCppflags", strings.Join(linuxClangCppflags, " "))
134
135 // Extended cflags
136 pctx.StaticVariable("linuxX86Cflags", strings.Join(linuxX86Cflags, " "))
137 pctx.StaticVariable("linuxX8664Cflags", strings.Join(linuxX8664Cflags, " "))
138 pctx.StaticVariable("linuxX86Ldflags", strings.Join(linuxX86Ldflags, " "))
139 pctx.StaticVariable("linuxX8664Ldflags", strings.Join(linuxX8664Ldflags, " "))
140
141 pctx.StaticVariable("linuxX86ClangCflags",
142 strings.Join(clangFilterUnknownCflags(linuxX86Cflags), " "))
143 pctx.StaticVariable("linuxX8664ClangCflags",
144 strings.Join(clangFilterUnknownCflags(linuxX8664Cflags), " "))
145 pctx.StaticVariable("linuxX86ClangLdflags", strings.Join(linuxX86ClangLdflags, " "))
146 pctx.StaticVariable("linuxX8664ClangLdflags", strings.Join(linuxX8664ClangLdflags, " "))
147 pctx.StaticVariable("linuxX86ClangCppflags", strings.Join(linuxX86ClangCppflags, " "))
148 pctx.StaticVariable("linuxX8664ClangCppflags", strings.Join(linuxX8664ClangCppflags, " "))
149}
150
151type toolchainLinux struct {
152 cFlags, ldFlags string
153}
154
155type toolchainLinuxX86 struct {
156 toolchain32Bit
157 toolchainLinux
158}
159
160type toolchainLinuxX8664 struct {
161 toolchain64Bit
162 toolchainLinux
163}
164
Dan Albertbe961682015-03-18 23:38:50 -0700165func (t *toolchainLinuxX86) Name() string {
166 return "x86"
167}
168
169func (t *toolchainLinuxX8664) Name() string {
170 return "x86_64"
171}
172
Colin Cross3f40fa42015-01-30 17:27:36 -0800173func (t *toolchainLinux) GccRoot() string {
174 return "${linuxGccRoot}"
175}
176
177func (t *toolchainLinux) GccTriple() string {
178 return "${linuxGccTriple}"
179}
180
Dan Albertbe961682015-03-18 23:38:50 -0700181func (t *toolchainLinux) GccVersion() string {
Dan Willemsen34fc3b12015-12-07 12:30:44 -0800182 return linuxGccVersion
Dan Albertbe961682015-03-18 23:38:50 -0700183}
184
Colin Cross3f40fa42015-01-30 17:27:36 -0800185func (t *toolchainLinuxX86) Cflags() string {
186 return "${linuxCflags} ${linuxX86Cflags}"
187}
188
189func (t *toolchainLinuxX8664) Cflags() string {
190 return "${linuxCflags} ${linuxX8664Cflags}"
191}
192
193func (t *toolchainLinux) Cppflags() string {
194 return ""
195}
196
197func (t *toolchainLinuxX86) Ldflags() string {
198 return "${linuxLdflags} ${linuxX86Ldflags}"
199}
200
201func (t *toolchainLinuxX8664) Ldflags() string {
202 return "${linuxLdflags} ${linuxX8664Ldflags}"
203}
204
205func (t *toolchainLinux) IncludeFlags() string {
206 return ""
207}
208
209func (t *toolchainLinuxX86) ClangTriple() string {
210 return "i686-linux-gnu"
211}
212
213func (t *toolchainLinuxX86) ClangCflags() string {
214 return "${linuxClangCflags} ${linuxX86ClangCflags}"
215}
216
217func (t *toolchainLinuxX86) ClangCppflags() string {
218 return "${linuxClangCppflags} ${linuxX86ClangCppflags}"
219}
220
221func (t *toolchainLinuxX8664) ClangTriple() string {
222 return "x86_64-linux-gnu"
223}
224
225func (t *toolchainLinuxX8664) ClangCflags() string {
226 return "${linuxClangCflags} ${linuxX8664ClangCflags}"
227}
228
229func (t *toolchainLinuxX8664) ClangCppflags() string {
230 return "${linuxClangCppflags} ${linuxX8664ClangCppflags}"
231}
232
233func (t *toolchainLinuxX86) ClangLdflags() string {
234 return "${linuxClangLdflags} ${linuxX86ClangLdflags}"
235}
236
237func (t *toolchainLinuxX8664) ClangLdflags() string {
238 return "${linuxClangLdflags} ${linuxX8664ClangLdflags}"
239}
240
Dan Willemsen20acc5c2016-05-25 14:47:21 -0700241func (t *toolchainLinux) AvailableLibraries() []string {
242 return linuxAvailableLibraries
243}
244
Colin Cross97ba0732015-03-23 17:50:24 -0700245var toolchainLinuxX86Singleton Toolchain = &toolchainLinuxX86{}
246var toolchainLinuxX8664Singleton Toolchain = &toolchainLinuxX8664{}
Colin Cross3f40fa42015-01-30 17:27:36 -0800247
Colin Cross635c3b02016-05-18 15:37:25 -0700248func linuxX86ToolchainFactory(arch android.Arch) Toolchain {
Colin Cross3f40fa42015-01-30 17:27:36 -0800249 return toolchainLinuxX86Singleton
250}
251
Colin Cross635c3b02016-05-18 15:37:25 -0700252func linuxX8664ToolchainFactory(arch android.Arch) Toolchain {
Colin Cross3f40fa42015-01-30 17:27:36 -0800253 return toolchainLinuxX8664Singleton
254}
255
256func init() {
Colin Crossa1ad8d12016-06-01 17:09:44 -0700257 registerToolchainFactory(android.Linux, android.X86, linuxX86ToolchainFactory)
258 registerToolchainFactory(android.Linux, android.X86_64, linuxX8664ToolchainFactory)
Colin Cross3f40fa42015-01-30 17:27:36 -0800259}