blob: fea6291092059fdb097c8d34d860e894b1fb481c [file] [log] [blame]
Dan Willemsen490fd492015-11-24 17:53:15 -08001// Copyright 2015 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
Colin Crossb98c8b02016-07-29 13:44:28 -070015package config
Dan Willemsen490fd492015-11-24 17:53:15 -080016
17import (
18 "strings"
19
Colin Cross635c3b02016-05-18 15:37:25 -070020 "android/soong/android"
Dan Willemsen490fd492015-11-24 17:53:15 -080021)
22
23var (
24 windowsCflags = []string{
Dan Willemsen490fd492015-11-24 17:53:15 -080025 "-DUSE_MINGW",
26 "-DWIN32_LEAN_AND_MEAN",
27 "-Wno-unused-parameter",
Dan Willemsen490fd492015-11-24 17:53:15 -080028
29 // Workaround differences in inttypes.h between host and target.
30 //See bug 12708004.
31 "-D__STDC_FORMAT_MACROS",
32 "-D__STDC_CONSTANT_MACROS",
33
34 // Use C99-compliant printf functions (%zd).
35 "-D__USE_MINGW_ANSI_STDIO=1",
Dan Willemsen01fdd3d2016-03-30 00:01:12 -070036 // Admit to using >= Vista. Both are needed because of <_mingw.h>.
37 "-D_WIN32_WINNT=0x0600",
38 "-DWINVER=0x0600",
Dan Willemsen490fd492015-11-24 17:53:15 -080039 // Get 64-bit off_t and related functions.
40 "-D_FILE_OFFSET_BITS=64",
41
Colin Crossb98c8b02016-07-29 13:44:28 -070042 "--sysroot ${WindowsGccRoot}/${WindowsGccTriple}",
Dan Willemsen490fd492015-11-24 17:53:15 -080043 }
Dan Willemsen01f388c2017-11-30 13:31:26 -080044 windowsClangCflags = append(ClangFilterUnknownCflags(windowsCflags), []string{}...)
Dan Willemsen490fd492015-11-24 17:53:15 -080045
46 windowsIncludeFlags = []string{
Colin Crossb98c8b02016-07-29 13:44:28 -070047 "-isystem ${WindowsGccRoot}/${WindowsGccTriple}/include",
48 "-isystem ${WindowsGccRoot}/lib/gcc/${WindowsGccTriple}/4.8.3/include",
Dan Willemsen490fd492015-11-24 17:53:15 -080049 }
50
Dan Willemsen01f388c2017-11-30 13:31:26 -080051 windowsClangCppflags = []string{
52 "-isystem ${WindowsGccRoot}/${WindowsGccTriple}/include/c++/4.8.3",
53 "-isystem ${WindowsGccRoot}/${WindowsGccTriple}/include/c++/4.8.3/backward",
54 }
55
56 windowsX86ClangCppflags = []string{
57 "-isystem ${WindowsGccRoot}/${WindowsGccTriple}/include/c++/4.8.3/${WindowsGccTriple}/32",
58 }
59
60 windowsX8664ClangCppflags = []string{
61 "-isystem ${WindowsGccRoot}/${WindowsGccTriple}/include/c++/4.8.3/${WindowsGccTriple}",
62 }
63
Dan Willemsen490fd492015-11-24 17:53:15 -080064 windowsLdflags = []string{
Dan Willemsen490fd492015-11-24 17:53:15 -080065 "--enable-stdcall-fixup",
66 }
Dan Willemsen01f388c2017-11-30 13:31:26 -080067 windowsClangLdflags = append(ClangFilterUnknownCflags(windowsLdflags), []string{}...)
Dan Willemsen07cd0512016-02-03 23:16:33 -080068
69 windowsX86Cflags = []string{
70 "-m32",
71 }
72
73 windowsX8664Cflags = []string{
74 "-m64",
75 }
76
77 windowsX86Ldflags = []string{
78 "-m32",
Dan Willemsen7752bca2017-03-14 13:36:23 -070079 "-Wl,--large-address-aware",
Colin Crossb98c8b02016-07-29 13:44:28 -070080 "-L${WindowsGccRoot}/${WindowsGccTriple}/lib32",
Dan Willemsen07cd0512016-02-03 23:16:33 -080081 }
Dan Willemsen01f388c2017-11-30 13:31:26 -080082 windowsX86ClangLdflags = append(ClangFilterUnknownCflags(windowsX86Ldflags), []string{
83 "-B${WindowsGccRoot}/lib/gcc/${WindowsGccTriple}/4.8.3/32",
84 "-L${WindowsGccRoot}/lib/gcc/${WindowsGccTriple}/4.8.3/32",
85 "-B${WindowsGccRoot}/${WindowsGccTriple}/lib32",
86 }...)
Dan Willemsen07cd0512016-02-03 23:16:33 -080087
88 windowsX8664Ldflags = []string{
89 "-m64",
Colin Crossb98c8b02016-07-29 13:44:28 -070090 "-L${WindowsGccRoot}/${WindowsGccTriple}/lib64",
Dan Willemsen07cd0512016-02-03 23:16:33 -080091 }
Dan Willemsen01f388c2017-11-30 13:31:26 -080092 windowsX8664ClangLdflags = append(ClangFilterUnknownCflags(windowsX8664Ldflags), []string{
93 "-B${WindowsGccRoot}/lib/gcc/${WindowsGccTriple}/4.8.3",
94 "-L${WindowsGccRoot}/lib/gcc/${WindowsGccTriple}/4.8.3",
95 "-B${WindowsGccRoot}/${WindowsGccTriple}/lib64",
96 }...)
Dan Willemsen2b1f0942016-07-20 12:47:47 -070097
98 windowsAvailableLibraries = addPrefix([]string{
99 "gdi32",
100 "imagehlp",
Dan Willemsenb18cf7a2017-09-09 01:42:00 -0700101 "iphlpapi",
102 "netapi32",
Dan Willemsen2b1f0942016-07-20 12:47:47 -0700103 "ole32",
Dan Willemsenb18cf7a2017-09-09 01:42:00 -0700104 "powrprof",
Dan Willemsen2b1f0942016-07-20 12:47:47 -0700105 "psapi",
Kenny Rootb9123492016-09-20 14:49:33 -0700106 "pthread",
Dan Willemsen2b1f0942016-07-20 12:47:47 -0700107 "userenv",
108 "uuid",
Colin Cross124fd9a2016-11-21 17:31:08 -0800109 "version",
Dan Willemsen2b1f0942016-07-20 12:47:47 -0700110 "ws2_32",
111 }, "-l")
Dan Willemsen490fd492015-11-24 17:53:15 -0800112)
113
Dan Willemsen34fc3b12015-12-07 12:30:44 -0800114const (
115 windowsGccVersion = "4.8"
116)
117
Dan Willemsen490fd492015-11-24 17:53:15 -0800118func init() {
Colin Crossb98c8b02016-07-29 13:44:28 -0700119 pctx.StaticVariable("WindowsGccVersion", windowsGccVersion)
Dan Willemsen490fd492015-11-24 17:53:15 -0800120
Colin Crossb98c8b02016-07-29 13:44:28 -0700121 pctx.SourcePathVariable("WindowsGccRoot",
122 "prebuilts/gcc/${HostPrebuiltTag}/host/x86_64-w64-mingw32-${WindowsGccVersion}")
Dan Willemsen490fd492015-11-24 17:53:15 -0800123
Colin Crossb98c8b02016-07-29 13:44:28 -0700124 pctx.StaticVariable("WindowsGccTriple", "x86_64-w64-mingw32")
Dan Willemsen490fd492015-11-24 17:53:15 -0800125
Colin Crossb98c8b02016-07-29 13:44:28 -0700126 pctx.StaticVariable("WindowsCflags", strings.Join(windowsCflags, " "))
127 pctx.StaticVariable("WindowsLdflags", strings.Join(windowsLdflags, " "))
Dan Willemsen07cd0512016-02-03 23:16:33 -0800128
Dan Willemsen01f388c2017-11-30 13:31:26 -0800129 pctx.StaticVariable("WindowsClangCflags", strings.Join(windowsClangCflags, " "))
130 pctx.StaticVariable("WindowsClangLdflags", strings.Join(windowsClangLdflags, " "))
131 pctx.StaticVariable("WindowsClangCppflags", strings.Join(windowsClangCppflags, " "))
132
Colin Crossb98c8b02016-07-29 13:44:28 -0700133 pctx.StaticVariable("WindowsX86Cflags", strings.Join(windowsX86Cflags, " "))
134 pctx.StaticVariable("WindowsX8664Cflags", strings.Join(windowsX8664Cflags, " "))
135 pctx.StaticVariable("WindowsX86Ldflags", strings.Join(windowsX86Ldflags, " "))
136 pctx.StaticVariable("WindowsX8664Ldflags", strings.Join(windowsX8664Ldflags, " "))
Dan Willemsend352edf2016-05-18 16:06:10 -0700137
Dan Willemsen01f388c2017-11-30 13:31:26 -0800138 pctx.StaticVariable("WindowsX86ClangCflags",
139 strings.Join(ClangFilterUnknownCflags(windowsX86Cflags), " "))
140 pctx.StaticVariable("WindowsX8664ClangCflags",
141 strings.Join(ClangFilterUnknownCflags(windowsX8664Cflags), " "))
142 pctx.StaticVariable("WindowsX86ClangLdflags", strings.Join(windowsX86ClangLdflags, " "))
143 pctx.StaticVariable("WindowsX8664ClangLdflags", strings.Join(windowsX8664ClangLdflags, " "))
144 pctx.StaticVariable("WindowsX86ClangCppflags", strings.Join(windowsX86ClangCppflags, " "))
145 pctx.StaticVariable("WindowsX8664ClangCppflags", strings.Join(windowsX8664ClangCppflags, " "))
146
Colin Crossb98c8b02016-07-29 13:44:28 -0700147 pctx.StaticVariable("WindowsIncludeFlags", strings.Join(windowsIncludeFlags, " "))
Dan Willemsen490fd492015-11-24 17:53:15 -0800148}
149
150type toolchainWindows struct {
Dan Willemsen490fd492015-11-24 17:53:15 -0800151 cFlags, ldFlags string
152}
153
Dan Willemsen07cd0512016-02-03 23:16:33 -0800154type toolchainWindowsX86 struct {
155 toolchain32Bit
156 toolchainWindows
157}
158
159type toolchainWindowsX8664 struct {
160 toolchain64Bit
161 toolchainWindows
162}
163
164func (t *toolchainWindowsX86) Name() string {
Dan Willemsen490fd492015-11-24 17:53:15 -0800165 return "x86"
166}
167
Dan Willemsen07cd0512016-02-03 23:16:33 -0800168func (t *toolchainWindowsX8664) Name() string {
169 return "x86_64"
170}
171
Dan Willemsen490fd492015-11-24 17:53:15 -0800172func (t *toolchainWindows) GccRoot() string {
Colin Crossb98c8b02016-07-29 13:44:28 -0700173 return "${config.WindowsGccRoot}"
Dan Willemsen490fd492015-11-24 17:53:15 -0800174}
175
176func (t *toolchainWindows) GccTriple() string {
Colin Crossb98c8b02016-07-29 13:44:28 -0700177 return "${config.WindowsGccTriple}"
Dan Willemsen490fd492015-11-24 17:53:15 -0800178}
179
180func (t *toolchainWindows) GccVersion() string {
Dan Willemsen34fc3b12015-12-07 12:30:44 -0800181 return windowsGccVersion
Dan Willemsen490fd492015-11-24 17:53:15 -0800182}
183
Dan Willemsen07cd0512016-02-03 23:16:33 -0800184func (t *toolchainWindowsX86) Cflags() string {
Colin Crossb98c8b02016-07-29 13:44:28 -0700185 return "${config.WindowsCflags} ${config.WindowsX86Cflags}"
Dan Willemsen07cd0512016-02-03 23:16:33 -0800186}
187
188func (t *toolchainWindowsX8664) Cflags() string {
Colin Crossb98c8b02016-07-29 13:44:28 -0700189 return "${config.WindowsCflags} ${config.WindowsX8664Cflags}"
Dan Willemsen490fd492015-11-24 17:53:15 -0800190}
191
192func (t *toolchainWindows) Cppflags() string {
193 return ""
194}
195
Dan Willemsen07cd0512016-02-03 23:16:33 -0800196func (t *toolchainWindowsX86) Ldflags() string {
Colin Crossb98c8b02016-07-29 13:44:28 -0700197 return "${config.WindowsLdflags} ${config.WindowsX86Ldflags}"
Dan Willemsen07cd0512016-02-03 23:16:33 -0800198}
199
200func (t *toolchainWindowsX8664) Ldflags() string {
Colin Crossb98c8b02016-07-29 13:44:28 -0700201 return "${config.WindowsLdflags} ${config.WindowsX8664Ldflags}"
Dan Willemsen490fd492015-11-24 17:53:15 -0800202}
203
204func (t *toolchainWindows) IncludeFlags() string {
Colin Crossb98c8b02016-07-29 13:44:28 -0700205 return "${config.WindowsIncludeFlags}"
Dan Willemsen490fd492015-11-24 17:53:15 -0800206}
207
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700208func (t *toolchainWindowsX86) WindresFlags() string {
209 return "-F pe-i386"
210}
211
212func (t *toolchainWindowsX8664) WindresFlags() string {
213 return "-F pe-x86-64"
214}
215
Dan Willemsen490fd492015-11-24 17:53:15 -0800216func (t *toolchainWindows) ClangSupported() bool {
217 return false
218}
219
Dan Willemsen01f388c2017-11-30 13:31:26 -0800220func (t *toolchainWindowsX86) ClangTriple() string {
221 return "i686-windows-gnu"
Dan Willemsen490fd492015-11-24 17:53:15 -0800222}
223
Dan Willemsen01f388c2017-11-30 13:31:26 -0800224func (t *toolchainWindowsX8664) ClangTriple() string {
225 return "x86_64-pc-windows-gnu"
Dan Willemsen490fd492015-11-24 17:53:15 -0800226}
227
Dan Willemsen01f388c2017-11-30 13:31:26 -0800228func (t *toolchainWindowsX86) ClangCflags() string {
229 return "${config.WindowsClangCflags} ${config.WindowsX86ClangCflags}"
Dan Willemsen490fd492015-11-24 17:53:15 -0800230}
231
Dan Willemsen01f388c2017-11-30 13:31:26 -0800232func (t *toolchainWindowsX8664) ClangCflags() string {
233 return "${config.WindowsClangCflags} ${config.WindowsX8664ClangCflags}"
234}
235
236func (t *toolchainWindowsX86) ClangCppflags() string {
237 return "${config.WindowsClangCppflags} ${config.WindowsX86ClangCppflags}"
238}
239
240func (t *toolchainWindowsX8664) ClangCppflags() string {
241 return "${config.WindowsClangCppflags} ${config.WindowsX8664ClangCppflags}"
242}
243
244func (t *toolchainWindowsX86) ClangLdflags() string {
245 return "${config.WindowsClangLdflags} ${config.WindowsX86ClangLdflags}"
246}
247
Chih-Hung Hsieh02b4da52018-04-03 11:33:34 -0700248func (t *toolchainWindowsX86) ClangLldflags() string {
249 // TODO: define and use Windows*ClangLldflags
250 return "${config.WindowsClangLdflags} ${config.WindowsX86ClangLdflags}"
251}
252
Dan Willemsen01f388c2017-11-30 13:31:26 -0800253func (t *toolchainWindowsX8664) ClangLdflags() string {
254 return "${config.WindowsClangLdflags} ${config.WindowsX8664ClangLdflags}"
Dan Willemsen490fd492015-11-24 17:53:15 -0800255}
256
Chih-Hung Hsieh02b4da52018-04-03 11:33:34 -0700257func (t *toolchainWindowsX8664) ClangLldflags() string {
258 // TODO: define and use Windows*ClangLldflags
259 return "${config.WindowsClangLdflags} ${config.WindowsX8664ClangLdflags}"
260}
261
Dan Willemsen490fd492015-11-24 17:53:15 -0800262func (t *toolchainWindows) ShlibSuffix() string {
263 return ".dll"
264}
265
266func (t *toolchainWindows) ExecutableSuffix() string {
267 return ".exe"
268}
269
Dan Willemsen2b1f0942016-07-20 12:47:47 -0700270func (t *toolchainWindows) AvailableLibraries() []string {
271 return windowsAvailableLibraries
272}
273
Dan Willemsen2e47b342016-11-17 01:02:25 -0800274func (t *toolchainWindows) Bionic() bool {
275 return false
276}
277
Dan Willemsen07cd0512016-02-03 23:16:33 -0800278var toolchainWindowsX86Singleton Toolchain = &toolchainWindowsX86{}
279var toolchainWindowsX8664Singleton Toolchain = &toolchainWindowsX8664{}
Dan Willemsen490fd492015-11-24 17:53:15 -0800280
Colin Cross635c3b02016-05-18 15:37:25 -0700281func windowsX86ToolchainFactory(arch android.Arch) Toolchain {
Dan Willemsen07cd0512016-02-03 23:16:33 -0800282 return toolchainWindowsX86Singleton
283}
284
Colin Cross635c3b02016-05-18 15:37:25 -0700285func windowsX8664ToolchainFactory(arch android.Arch) Toolchain {
Dan Willemsen07cd0512016-02-03 23:16:33 -0800286 return toolchainWindowsX8664Singleton
Dan Willemsen490fd492015-11-24 17:53:15 -0800287}
288
289func init() {
Colin Crossa1ad8d12016-06-01 17:09:44 -0700290 registerToolchainFactory(android.Windows, android.X86, windowsX86ToolchainFactory)
291 registerToolchainFactory(android.Windows, android.X86_64, windowsX8664ToolchainFactory)
Dan Willemsen490fd492015-11-24 17:53:15 -0800292}