blob: b5b5553224519fac869cfbb705c7069fca6b4868 [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",
Jerome Gaillard82bb8b12018-12-04 12:36:49 +000036 // Admit to using >= Windows 7. Both are needed because of <_mingw.h>.
37 "-D_WIN32_WINNT=0x0601",
38 "-DWINVER=0x0601",
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",
Dan Willemsen490fd492015-11-24 17:53:15 -080048 }
49
Pirama Arumuga Nainara403cc72018-08-08 10:28:12 -070050 windowsClangCppflags = []string{}
Dan Willemsen01f388c2017-11-30 13:31:26 -080051
Pirama Arumuga Nainaraf683372020-09-09 17:54:32 -070052 windowsX86ClangCppflags = []string{
53 // Use SjLj exceptions for 32-bit. libgcc_eh implements SjLj
54 // exception model for 32-bit.
55 "-fsjlj-exceptions",
56 }
Dan Willemsen01f388c2017-11-30 13:31:26 -080057
Pirama Arumuga Nainara403cc72018-08-08 10:28:12 -070058 windowsX8664ClangCppflags = []string{}
Dan Willemsen01f388c2017-11-30 13:31:26 -080059
Dan Willemsen490fd492015-11-24 17:53:15 -080060 windowsLdflags = []string{
Dan Willemsen490fd492015-11-24 17:53:15 -080061 "--enable-stdcall-fixup",
Pirama Arumuga Nainar191f6462018-08-30 12:37:56 -070062 "-Wl,--dynamicbase",
63 "-Wl,--nxcompat",
Dan Willemsen490fd492015-11-24 17:53:15 -080064 }
Yi Konga3c22e72020-04-09 00:11:53 +080065 windowsLldflags = []string{
66 "-Wl,--Xlink=-Brepro", // Enable deterministic build
67 }
Chih-Hung Hsieh3101a962018-04-17 14:16:05 -070068 windowsClangLdflags = append(ClangFilterUnknownCflags(windowsLdflags), []string{}...)
Yi Konga3c22e72020-04-09 00:11:53 +080069 windowsClangLldflags = append(ClangFilterUnknownLldflags(windowsClangLdflags), windowsLldflags...)
Dan Willemsen07cd0512016-02-03 23:16:33 -080070
71 windowsX86Cflags = []string{
72 "-m32",
73 }
74
75 windowsX8664Cflags = []string{
76 "-m64",
77 }
78
79 windowsX86Ldflags = []string{
80 "-m32",
Dan Willemsen7752bca2017-03-14 13:36:23 -070081 "-Wl,--large-address-aware",
Colin Crossb98c8b02016-07-29 13:44:28 -070082 "-L${WindowsGccRoot}/${WindowsGccTriple}/lib32",
Pirama Arumuga Nainar105cab22019-10-15 13:56:29 -070083 "-static-libgcc",
Dan Willemsen07cd0512016-02-03 23:16:33 -080084 }
Dan Willemsen01f388c2017-11-30 13:31:26 -080085 windowsX86ClangLdflags = append(ClangFilterUnknownCflags(windowsX86Ldflags), []string{
Pirama Arumuga Nainar8a852e72018-06-19 20:07:54 -070086 "-B${WindowsGccRoot}/${WindowsGccTriple}/bin",
Dan Willemsen01f388c2017-11-30 13:31:26 -080087 "-B${WindowsGccRoot}/lib/gcc/${WindowsGccTriple}/4.8.3/32",
88 "-L${WindowsGccRoot}/lib/gcc/${WindowsGccTriple}/4.8.3/32",
89 "-B${WindowsGccRoot}/${WindowsGccTriple}/lib32",
90 }...)
Chih-Hung Hsieh3101a962018-04-17 14:16:05 -070091 windowsX86ClangLldflags = ClangFilterUnknownLldflags(windowsX86ClangLdflags)
Dan Willemsen07cd0512016-02-03 23:16:33 -080092
93 windowsX8664Ldflags = []string{
94 "-m64",
Colin Crossb98c8b02016-07-29 13:44:28 -070095 "-L${WindowsGccRoot}/${WindowsGccTriple}/lib64",
Pirama Arumuga Nainar191f6462018-08-30 12:37:56 -070096 "-Wl,--high-entropy-va",
Pirama Arumuga Nainar105cab22019-10-15 13:56:29 -070097 "-static-libgcc",
Dan Willemsen07cd0512016-02-03 23:16:33 -080098 }
Dan Willemsen01f388c2017-11-30 13:31:26 -080099 windowsX8664ClangLdflags = append(ClangFilterUnknownCflags(windowsX8664Ldflags), []string{
Pirama Arumuga Nainar8a852e72018-06-19 20:07:54 -0700100 "-B${WindowsGccRoot}/${WindowsGccTriple}/bin",
Dan Willemsen01f388c2017-11-30 13:31:26 -0800101 "-B${WindowsGccRoot}/lib/gcc/${WindowsGccTriple}/4.8.3",
102 "-L${WindowsGccRoot}/lib/gcc/${WindowsGccTriple}/4.8.3",
103 "-B${WindowsGccRoot}/${WindowsGccTriple}/lib64",
104 }...)
Chih-Hung Hsieh3101a962018-04-17 14:16:05 -0700105 windowsX8664ClangLldflags = ClangFilterUnknownLldflags(windowsX8664ClangLdflags)
Dan Willemsen2b1f0942016-07-20 12:47:47 -0700106
107 windowsAvailableLibraries = addPrefix([]string{
108 "gdi32",
109 "imagehlp",
Dan Willemsenb18cf7a2017-09-09 01:42:00 -0700110 "iphlpapi",
111 "netapi32",
Jerome Gaillard7f7f34f2019-01-18 17:14:08 +0000112 "oleaut32",
Dan Willemsen2b1f0942016-07-20 12:47:47 -0700113 "ole32",
Jerome Gaillard7f7f34f2019-01-18 17:14:08 +0000114 "opengl32",
Dan Willemsenb18cf7a2017-09-09 01:42:00 -0700115 "powrprof",
Dan Willemsen2b1f0942016-07-20 12:47:47 -0700116 "psapi",
Kenny Rootb9123492016-09-20 14:49:33 -0700117 "pthread",
Dan Willemsen2b1f0942016-07-20 12:47:47 -0700118 "userenv",
119 "uuid",
Colin Cross124fd9a2016-11-21 17:31:08 -0800120 "version",
Dan Willemsen2b1f0942016-07-20 12:47:47 -0700121 "ws2_32",
Jerome Gaillard7f7f34f2019-01-18 17:14:08 +0000122 "windowscodecs",
Dan Willemsen2b1f0942016-07-20 12:47:47 -0700123 }, "-l")
Dan Willemsen490fd492015-11-24 17:53:15 -0800124)
125
Dan Willemsen34fc3b12015-12-07 12:30:44 -0800126const (
127 windowsGccVersion = "4.8"
128)
129
Dan Willemsen490fd492015-11-24 17:53:15 -0800130func init() {
Colin Crossb98c8b02016-07-29 13:44:28 -0700131 pctx.StaticVariable("WindowsGccVersion", windowsGccVersion)
Dan Willemsen490fd492015-11-24 17:53:15 -0800132
Colin Crossb98c8b02016-07-29 13:44:28 -0700133 pctx.SourcePathVariable("WindowsGccRoot",
134 "prebuilts/gcc/${HostPrebuiltTag}/host/x86_64-w64-mingw32-${WindowsGccVersion}")
Dan Willemsen490fd492015-11-24 17:53:15 -0800135
Colin Crossb98c8b02016-07-29 13:44:28 -0700136 pctx.StaticVariable("WindowsGccTriple", "x86_64-w64-mingw32")
Dan Willemsen490fd492015-11-24 17:53:15 -0800137
Dan Willemsen01f388c2017-11-30 13:31:26 -0800138 pctx.StaticVariable("WindowsClangCflags", strings.Join(windowsClangCflags, " "))
139 pctx.StaticVariable("WindowsClangLdflags", strings.Join(windowsClangLdflags, " "))
Chih-Hung Hsieh3101a962018-04-17 14:16:05 -0700140 pctx.StaticVariable("WindowsClangLldflags", strings.Join(windowsClangLldflags, " "))
Dan Willemsen01f388c2017-11-30 13:31:26 -0800141 pctx.StaticVariable("WindowsClangCppflags", strings.Join(windowsClangCppflags, " "))
142
Dan Willemsen01f388c2017-11-30 13:31:26 -0800143 pctx.StaticVariable("WindowsX86ClangCflags",
144 strings.Join(ClangFilterUnknownCflags(windowsX86Cflags), " "))
145 pctx.StaticVariable("WindowsX8664ClangCflags",
146 strings.Join(ClangFilterUnknownCflags(windowsX8664Cflags), " "))
147 pctx.StaticVariable("WindowsX86ClangLdflags", strings.Join(windowsX86ClangLdflags, " "))
Chih-Hung Hsieh3101a962018-04-17 14:16:05 -0700148 pctx.StaticVariable("WindowsX86ClangLldflags", strings.Join(windowsX86ClangLldflags, " "))
Dan Willemsen01f388c2017-11-30 13:31:26 -0800149 pctx.StaticVariable("WindowsX8664ClangLdflags", strings.Join(windowsX8664ClangLdflags, " "))
Chih-Hung Hsieh3101a962018-04-17 14:16:05 -0700150 pctx.StaticVariable("WindowsX8664ClangLldflags", strings.Join(windowsX8664ClangLldflags, " "))
Dan Willemsen01f388c2017-11-30 13:31:26 -0800151 pctx.StaticVariable("WindowsX86ClangCppflags", strings.Join(windowsX86ClangCppflags, " "))
152 pctx.StaticVariable("WindowsX8664ClangCppflags", strings.Join(windowsX8664ClangCppflags, " "))
153
Colin Crossb98c8b02016-07-29 13:44:28 -0700154 pctx.StaticVariable("WindowsIncludeFlags", strings.Join(windowsIncludeFlags, " "))
Jerome Gaillard80fec092018-11-29 15:34:32 +0000155 // Yasm flags
156 pctx.StaticVariable("WindowsX86YasmFlags", "-f win32 -m x86")
157 pctx.StaticVariable("WindowsX8664YasmFlags", "-f win64 -m amd64")
Dan Willemsen490fd492015-11-24 17:53:15 -0800158}
159
160type toolchainWindows struct {
Dan Willemsen490fd492015-11-24 17:53:15 -0800161 cFlags, ldFlags string
162}
163
Dan Willemsen07cd0512016-02-03 23:16:33 -0800164type toolchainWindowsX86 struct {
165 toolchain32Bit
166 toolchainWindows
167}
168
169type toolchainWindowsX8664 struct {
170 toolchain64Bit
171 toolchainWindows
172}
173
174func (t *toolchainWindowsX86) Name() string {
Dan Willemsen490fd492015-11-24 17:53:15 -0800175 return "x86"
176}
177
Dan Willemsen07cd0512016-02-03 23:16:33 -0800178func (t *toolchainWindowsX8664) Name() string {
179 return "x86_64"
180}
181
Dan Willemsen490fd492015-11-24 17:53:15 -0800182func (t *toolchainWindows) GccRoot() string {
Colin Crossb98c8b02016-07-29 13:44:28 -0700183 return "${config.WindowsGccRoot}"
Dan Willemsen490fd492015-11-24 17:53:15 -0800184}
185
186func (t *toolchainWindows) GccTriple() string {
Colin Crossb98c8b02016-07-29 13:44:28 -0700187 return "${config.WindowsGccTriple}"
Dan Willemsen490fd492015-11-24 17:53:15 -0800188}
189
190func (t *toolchainWindows) GccVersion() string {
Dan Willemsen34fc3b12015-12-07 12:30:44 -0800191 return windowsGccVersion
Dan Willemsen490fd492015-11-24 17:53:15 -0800192}
193
Dan Willemsen490fd492015-11-24 17:53:15 -0800194func (t *toolchainWindows) IncludeFlags() string {
Colin Crossb98c8b02016-07-29 13:44:28 -0700195 return "${config.WindowsIncludeFlags}"
Dan Willemsen490fd492015-11-24 17:53:15 -0800196}
197
Dan Willemsen4f1c3d42017-09-09 01:15:26 -0700198func (t *toolchainWindowsX86) WindresFlags() string {
199 return "-F pe-i386"
200}
201
202func (t *toolchainWindowsX8664) WindresFlags() string {
203 return "-F pe-x86-64"
204}
205
Dan Willemsen01f388c2017-11-30 13:31:26 -0800206func (t *toolchainWindowsX86) ClangTriple() string {
207 return "i686-windows-gnu"
Dan Willemsen490fd492015-11-24 17:53:15 -0800208}
209
Dan Willemsen01f388c2017-11-30 13:31:26 -0800210func (t *toolchainWindowsX8664) ClangTriple() string {
211 return "x86_64-pc-windows-gnu"
Dan Willemsen490fd492015-11-24 17:53:15 -0800212}
213
Dan Willemsen01f388c2017-11-30 13:31:26 -0800214func (t *toolchainWindowsX86) ClangCflags() string {
215 return "${config.WindowsClangCflags} ${config.WindowsX86ClangCflags}"
Dan Willemsen490fd492015-11-24 17:53:15 -0800216}
217
Dan Willemsen01f388c2017-11-30 13:31:26 -0800218func (t *toolchainWindowsX8664) ClangCflags() string {
219 return "${config.WindowsClangCflags} ${config.WindowsX8664ClangCflags}"
220}
221
222func (t *toolchainWindowsX86) ClangCppflags() string {
223 return "${config.WindowsClangCppflags} ${config.WindowsX86ClangCppflags}"
224}
225
226func (t *toolchainWindowsX8664) ClangCppflags() string {
227 return "${config.WindowsClangCppflags} ${config.WindowsX8664ClangCppflags}"
228}
229
230func (t *toolchainWindowsX86) ClangLdflags() string {
231 return "${config.WindowsClangLdflags} ${config.WindowsX86ClangLdflags}"
232}
233
Chih-Hung Hsieh02b4da52018-04-03 11:33:34 -0700234func (t *toolchainWindowsX86) ClangLldflags() string {
Chih-Hung Hsieh3101a962018-04-17 14:16:05 -0700235 return "${config.WindowsClangLldflags} ${config.WindowsX86ClangLldflags}"
Chih-Hung Hsieh02b4da52018-04-03 11:33:34 -0700236}
237
Dan Willemsen01f388c2017-11-30 13:31:26 -0800238func (t *toolchainWindowsX8664) ClangLdflags() string {
239 return "${config.WindowsClangLdflags} ${config.WindowsX8664ClangLdflags}"
Dan Willemsen490fd492015-11-24 17:53:15 -0800240}
241
Chih-Hung Hsieh02b4da52018-04-03 11:33:34 -0700242func (t *toolchainWindowsX8664) ClangLldflags() string {
Chih-Hung Hsieh3101a962018-04-17 14:16:05 -0700243 return "${config.WindowsClangLldflags} ${config.WindowsX8664ClangLldflags}"
Chih-Hung Hsieh02b4da52018-04-03 11:33:34 -0700244}
245
Jerome Gaillard80fec092018-11-29 15:34:32 +0000246func (t *toolchainWindowsX86) YasmFlags() string {
247 return "${config.WindowsX86YasmFlags}"
248}
249
250func (t *toolchainWindowsX8664) YasmFlags() string {
251 return "${config.WindowsX8664YasmFlags}"
252}
253
Dan Willemsen490fd492015-11-24 17:53:15 -0800254func (t *toolchainWindows) ShlibSuffix() string {
255 return ".dll"
256}
257
258func (t *toolchainWindows) ExecutableSuffix() string {
259 return ".exe"
260}
261
Dan Willemsen2b1f0942016-07-20 12:47:47 -0700262func (t *toolchainWindows) AvailableLibraries() []string {
263 return windowsAvailableLibraries
264}
265
Dan Willemsen2e47b342016-11-17 01:02:25 -0800266func (t *toolchainWindows) Bionic() bool {
267 return false
268}
269
Dan Willemsen07cd0512016-02-03 23:16:33 -0800270var toolchainWindowsX86Singleton Toolchain = &toolchainWindowsX86{}
271var toolchainWindowsX8664Singleton Toolchain = &toolchainWindowsX8664{}
Dan Willemsen490fd492015-11-24 17:53:15 -0800272
Colin Cross635c3b02016-05-18 15:37:25 -0700273func windowsX86ToolchainFactory(arch android.Arch) Toolchain {
Dan Willemsen07cd0512016-02-03 23:16:33 -0800274 return toolchainWindowsX86Singleton
275}
276
Colin Cross635c3b02016-05-18 15:37:25 -0700277func windowsX8664ToolchainFactory(arch android.Arch) Toolchain {
Dan Willemsen07cd0512016-02-03 23:16:33 -0800278 return toolchainWindowsX8664Singleton
Dan Willemsen490fd492015-11-24 17:53:15 -0800279}
280
281func init() {
Colin Crossa1ad8d12016-06-01 17:09:44 -0700282 registerToolchainFactory(android.Windows, android.X86, windowsX86ToolchainFactory)
283 registerToolchainFactory(android.Windows, android.X86_64, windowsX8664ToolchainFactory)
Dan Willemsen490fd492015-11-24 17:53:15 -0800284}