xref: /aosp_15_r20/build/soong/cc/config/x86_windows_host.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2015 Google Inc. All rights reserved.
2*333d2b36SAndroid Build Coastguard Worker//
3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*333d2b36SAndroid Build Coastguard Worker//
7*333d2b36SAndroid Build Coastguard Worker//     http://www.apache.org/licenses/LICENSE-2.0
8*333d2b36SAndroid Build Coastguard Worker//
9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*333d2b36SAndroid Build Coastguard Worker// limitations under the License.
14*333d2b36SAndroid Build Coastguard Worker
15*333d2b36SAndroid Build Coastguard Workerpackage config
16*333d2b36SAndroid Build Coastguard Worker
17*333d2b36SAndroid Build Coastguard Workerimport (
18*333d2b36SAndroid Build Coastguard Worker	"path/filepath"
19*333d2b36SAndroid Build Coastguard Worker	"strings"
20*333d2b36SAndroid Build Coastguard Worker
21*333d2b36SAndroid Build Coastguard Worker	"android/soong/android"
22*333d2b36SAndroid Build Coastguard Worker)
23*333d2b36SAndroid Build Coastguard Worker
24*333d2b36SAndroid Build Coastguard Workervar (
25*333d2b36SAndroid Build Coastguard Worker	windowsCflags = []string{
26*333d2b36SAndroid Build Coastguard Worker		"-DUSE_MINGW",
27*333d2b36SAndroid Build Coastguard Worker		"-DWIN32_LEAN_AND_MEAN",
28*333d2b36SAndroid Build Coastguard Worker		"-Wno-unused-parameter",
29*333d2b36SAndroid Build Coastguard Worker
30*333d2b36SAndroid Build Coastguard Worker		// Workaround differences in <stdint.h> between host and target.
31*333d2b36SAndroid Build Coastguard Worker		// Context: http://b/12708004
32*333d2b36SAndroid Build Coastguard Worker		"-D__STDC_CONSTANT_MACROS",
33*333d2b36SAndroid Build Coastguard Worker
34*333d2b36SAndroid Build Coastguard Worker		// Use C99-compliant printf functions (%zd).
35*333d2b36SAndroid Build Coastguard Worker		"-D__USE_MINGW_ANSI_STDIO=1",
36*333d2b36SAndroid Build Coastguard Worker		// Admit to using >= Windows 7. Both are needed because of <_mingw.h>.
37*333d2b36SAndroid Build Coastguard Worker		"-D_WIN32_WINNT=0x0601",
38*333d2b36SAndroid Build Coastguard Worker		"-DWINVER=0x0601",
39*333d2b36SAndroid Build Coastguard Worker		// Get 64-bit off_t and related functions.
40*333d2b36SAndroid Build Coastguard Worker		"-D_FILE_OFFSET_BITS=64",
41*333d2b36SAndroid Build Coastguard Worker
42*333d2b36SAndroid Build Coastguard Worker		// Don't adjust the layout of bitfields like msvc does.
43*333d2b36SAndroid Build Coastguard Worker		"-mno-ms-bitfields",
44*333d2b36SAndroid Build Coastguard Worker
45*333d2b36SAndroid Build Coastguard Worker		"--sysroot ${WindowsGccRoot}/${WindowsGccTriple}",
46*333d2b36SAndroid Build Coastguard Worker
47*333d2b36SAndroid Build Coastguard Worker		// Windows flags to generate PDB
48*333d2b36SAndroid Build Coastguard Worker		"-g",
49*333d2b36SAndroid Build Coastguard Worker		"-gcodeview",
50*333d2b36SAndroid Build Coastguard Worker
51*333d2b36SAndroid Build Coastguard Worker		"-fno-omit-frame-pointer",
52*333d2b36SAndroid Build Coastguard Worker	}
53*333d2b36SAndroid Build Coastguard Worker
54*333d2b36SAndroid Build Coastguard Worker	windowsIncludeFlags = []string{
55*333d2b36SAndroid Build Coastguard Worker		"-isystem ${WindowsGccRoot}/${WindowsGccTriple}/include",
56*333d2b36SAndroid Build Coastguard Worker	}
57*333d2b36SAndroid Build Coastguard Worker
58*333d2b36SAndroid Build Coastguard Worker	windowsCppflags = []string{}
59*333d2b36SAndroid Build Coastguard Worker
60*333d2b36SAndroid Build Coastguard Worker	windowsX86Cppflags = []string{
61*333d2b36SAndroid Build Coastguard Worker		// Use SjLj exceptions for 32-bit.  libgcc_eh implements SjLj
62*333d2b36SAndroid Build Coastguard Worker		// exception model for 32-bit.
63*333d2b36SAndroid Build Coastguard Worker		"-fsjlj-exceptions",
64*333d2b36SAndroid Build Coastguard Worker	}
65*333d2b36SAndroid Build Coastguard Worker
66*333d2b36SAndroid Build Coastguard Worker	windowsX8664Cppflags = []string{}
67*333d2b36SAndroid Build Coastguard Worker
68*333d2b36SAndroid Build Coastguard Worker	windowsLdflags = []string{
69*333d2b36SAndroid Build Coastguard Worker		"-Wl,--dynamicbase",
70*333d2b36SAndroid Build Coastguard Worker		"-Wl,--nxcompat",
71*333d2b36SAndroid Build Coastguard Worker	}
72*333d2b36SAndroid Build Coastguard Worker	windowsLldflags = append(windowsLdflags, []string{
73*333d2b36SAndroid Build Coastguard Worker		"-Wl,--Xlink=-Brepro", // Enable deterministic build
74*333d2b36SAndroid Build Coastguard Worker	}...)
75*333d2b36SAndroid Build Coastguard Worker
76*333d2b36SAndroid Build Coastguard Worker	windowsX86Cflags = []string{
77*333d2b36SAndroid Build Coastguard Worker		"-m32",
78*333d2b36SAndroid Build Coastguard Worker	}
79*333d2b36SAndroid Build Coastguard Worker
80*333d2b36SAndroid Build Coastguard Worker	windowsX8664Cflags = []string{
81*333d2b36SAndroid Build Coastguard Worker		"-m64",
82*333d2b36SAndroid Build Coastguard Worker	}
83*333d2b36SAndroid Build Coastguard Worker
84*333d2b36SAndroid Build Coastguard Worker	windowsX86Ldflags = []string{
85*333d2b36SAndroid Build Coastguard Worker		"-m32",
86*333d2b36SAndroid Build Coastguard Worker		"-Wl,--large-address-aware",
87*333d2b36SAndroid Build Coastguard Worker		"-L${WindowsGccRoot}/${WindowsGccTriple}/lib32",
88*333d2b36SAndroid Build Coastguard Worker		"-static-libgcc",
89*333d2b36SAndroid Build Coastguard Worker
90*333d2b36SAndroid Build Coastguard Worker		"-B${WindowsGccRoot}/${WindowsGccTriple}/bin",
91*333d2b36SAndroid Build Coastguard Worker		"-B${WindowsGccRoot}/lib/gcc/${WindowsGccTriple}/4.8.3/32",
92*333d2b36SAndroid Build Coastguard Worker		"-L${WindowsGccRoot}/lib/gcc/${WindowsGccTriple}/4.8.3/32",
93*333d2b36SAndroid Build Coastguard Worker		"-B${WindowsGccRoot}/${WindowsGccTriple}/lib32",
94*333d2b36SAndroid Build Coastguard Worker	}
95*333d2b36SAndroid Build Coastguard Worker
96*333d2b36SAndroid Build Coastguard Worker	windowsX8664Ldflags = []string{
97*333d2b36SAndroid Build Coastguard Worker		"-m64",
98*333d2b36SAndroid Build Coastguard Worker		"-L${WindowsGccRoot}/${WindowsGccTriple}/lib64",
99*333d2b36SAndroid Build Coastguard Worker		"-Wl,--high-entropy-va",
100*333d2b36SAndroid Build Coastguard Worker		"-static-libgcc",
101*333d2b36SAndroid Build Coastguard Worker
102*333d2b36SAndroid Build Coastguard Worker		"-B${WindowsGccRoot}/${WindowsGccTriple}/bin",
103*333d2b36SAndroid Build Coastguard Worker		"-B${WindowsGccRoot}/lib/gcc/${WindowsGccTriple}/4.8.3",
104*333d2b36SAndroid Build Coastguard Worker		"-L${WindowsGccRoot}/lib/gcc/${WindowsGccTriple}/4.8.3",
105*333d2b36SAndroid Build Coastguard Worker		"-B${WindowsGccRoot}/${WindowsGccTriple}/lib64",
106*333d2b36SAndroid Build Coastguard Worker	}
107*333d2b36SAndroid Build Coastguard Worker
108*333d2b36SAndroid Build Coastguard Worker	windowsAvailableLibraries = addPrefix([]string{
109*333d2b36SAndroid Build Coastguard Worker		"gdi32",
110*333d2b36SAndroid Build Coastguard Worker		"imagehlp",
111*333d2b36SAndroid Build Coastguard Worker		"iphlpapi",
112*333d2b36SAndroid Build Coastguard Worker		"netapi32",
113*333d2b36SAndroid Build Coastguard Worker		"oleaut32",
114*333d2b36SAndroid Build Coastguard Worker		"ole32",
115*333d2b36SAndroid Build Coastguard Worker		"opengl32",
116*333d2b36SAndroid Build Coastguard Worker		"powrprof",
117*333d2b36SAndroid Build Coastguard Worker		"psapi",
118*333d2b36SAndroid Build Coastguard Worker		"pthread",
119*333d2b36SAndroid Build Coastguard Worker		"userenv",
120*333d2b36SAndroid Build Coastguard Worker		"uuid",
121*333d2b36SAndroid Build Coastguard Worker		"version",
122*333d2b36SAndroid Build Coastguard Worker		"ws2_32",
123*333d2b36SAndroid Build Coastguard Worker		"windowscodecs",
124*333d2b36SAndroid Build Coastguard Worker	}, "-l")
125*333d2b36SAndroid Build Coastguard Worker)
126*333d2b36SAndroid Build Coastguard Worker
127*333d2b36SAndroid Build Coastguard Workerconst (
128*333d2b36SAndroid Build Coastguard Worker	windowsGccVersion = "4.8"
129*333d2b36SAndroid Build Coastguard Worker)
130*333d2b36SAndroid Build Coastguard Worker
131*333d2b36SAndroid Build Coastguard Workerfunc init() {
132*333d2b36SAndroid Build Coastguard Worker	pctx.StaticVariable("WindowsGccVersion", windowsGccVersion)
133*333d2b36SAndroid Build Coastguard Worker
134*333d2b36SAndroid Build Coastguard Worker	pctx.SourcePathVariable("WindowsGccRoot",
135*333d2b36SAndroid Build Coastguard Worker		"prebuilts/gcc/${HostPrebuiltTag}/host/x86_64-w64-mingw32-${WindowsGccVersion}")
136*333d2b36SAndroid Build Coastguard Worker
137*333d2b36SAndroid Build Coastguard Worker	pctx.StaticVariable("WindowsGccTriple", "x86_64-w64-mingw32")
138*333d2b36SAndroid Build Coastguard Worker
139*333d2b36SAndroid Build Coastguard Worker	pctx.StaticVariable("WindowsCflags", strings.Join(windowsCflags, " "))
140*333d2b36SAndroid Build Coastguard Worker	pctx.StaticVariable("WindowsLdflags", strings.Join(windowsLdflags, " "))
141*333d2b36SAndroid Build Coastguard Worker	pctx.StaticVariable("WindowsLldflags", strings.Join(windowsLldflags, " "))
142*333d2b36SAndroid Build Coastguard Worker	pctx.StaticVariable("WindowsCppflags", strings.Join(windowsCppflags, " "))
143*333d2b36SAndroid Build Coastguard Worker
144*333d2b36SAndroid Build Coastguard Worker	pctx.StaticVariable("WindowsX86Cflags", strings.Join(windowsX86Cflags, " "))
145*333d2b36SAndroid Build Coastguard Worker	pctx.StaticVariable("WindowsX8664Cflags", strings.Join(windowsX8664Cflags, " "))
146*333d2b36SAndroid Build Coastguard Worker	pctx.StaticVariable("WindowsX86Ldflags", strings.Join(windowsX86Ldflags, " "))
147*333d2b36SAndroid Build Coastguard Worker	pctx.StaticVariable("WindowsX86Lldflags", strings.Join(windowsX86Ldflags, " "))
148*333d2b36SAndroid Build Coastguard Worker	pctx.StaticVariable("WindowsX8664Ldflags", strings.Join(windowsX8664Ldflags, " "))
149*333d2b36SAndroid Build Coastguard Worker	pctx.StaticVariable("WindowsX8664Lldflags", strings.Join(windowsX8664Ldflags, " "))
150*333d2b36SAndroid Build Coastguard Worker	pctx.StaticVariable("WindowsX86Cppflags", strings.Join(windowsX86Cppflags, " "))
151*333d2b36SAndroid Build Coastguard Worker	pctx.StaticVariable("WindowsX8664Cppflags", strings.Join(windowsX8664Cppflags, " "))
152*333d2b36SAndroid Build Coastguard Worker
153*333d2b36SAndroid Build Coastguard Worker	pctx.StaticVariable("WindowsIncludeFlags", strings.Join(windowsIncludeFlags, " "))
154*333d2b36SAndroid Build Coastguard Worker	// Yasm flags
155*333d2b36SAndroid Build Coastguard Worker	pctx.StaticVariable("WindowsX86YasmFlags", "-f win32 -m x86")
156*333d2b36SAndroid Build Coastguard Worker	pctx.StaticVariable("WindowsX8664YasmFlags", "-f win64 -m amd64")
157*333d2b36SAndroid Build Coastguard Worker}
158*333d2b36SAndroid Build Coastguard Worker
159*333d2b36SAndroid Build Coastguard Workertype toolchainWindows struct {
160*333d2b36SAndroid Build Coastguard Worker	cFlags, ldFlags string
161*333d2b36SAndroid Build Coastguard Worker	toolchainBase
162*333d2b36SAndroid Build Coastguard Worker	toolchainNoCrt
163*333d2b36SAndroid Build Coastguard Worker}
164*333d2b36SAndroid Build Coastguard Worker
165*333d2b36SAndroid Build Coastguard Workertype toolchainWindowsX86 struct {
166*333d2b36SAndroid Build Coastguard Worker	toolchain32Bit
167*333d2b36SAndroid Build Coastguard Worker	toolchainWindows
168*333d2b36SAndroid Build Coastguard Worker}
169*333d2b36SAndroid Build Coastguard Worker
170*333d2b36SAndroid Build Coastguard Workertype toolchainWindowsX8664 struct {
171*333d2b36SAndroid Build Coastguard Worker	toolchain64Bit
172*333d2b36SAndroid Build Coastguard Worker	toolchainWindows
173*333d2b36SAndroid Build Coastguard Worker}
174*333d2b36SAndroid Build Coastguard Worker
175*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainWindowsX86) Name() string {
176*333d2b36SAndroid Build Coastguard Worker	return "x86"
177*333d2b36SAndroid Build Coastguard Worker}
178*333d2b36SAndroid Build Coastguard Worker
179*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainWindowsX8664) Name() string {
180*333d2b36SAndroid Build Coastguard Worker	return "x86_64"
181*333d2b36SAndroid Build Coastguard Worker}
182*333d2b36SAndroid Build Coastguard Worker
183*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainWindows) ToolchainCflags() string {
184*333d2b36SAndroid Build Coastguard Worker	return "-B" + filepath.Join("${config.WindowsGccRoot}", "${config.WindowsGccTriple}", "bin")
185*333d2b36SAndroid Build Coastguard Worker}
186*333d2b36SAndroid Build Coastguard Worker
187*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainWindows) ToolchainLdflags() string {
188*333d2b36SAndroid Build Coastguard Worker	return "-B" + filepath.Join("${config.WindowsGccRoot}", "${config.WindowsGccTriple}", "bin")
189*333d2b36SAndroid Build Coastguard Worker}
190*333d2b36SAndroid Build Coastguard Worker
191*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainWindows) IncludeFlags() string {
192*333d2b36SAndroid Build Coastguard Worker	return "${config.WindowsIncludeFlags}"
193*333d2b36SAndroid Build Coastguard Worker}
194*333d2b36SAndroid Build Coastguard Worker
195*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainWindowsX86) ClangTriple() string {
196*333d2b36SAndroid Build Coastguard Worker	return "i686-windows-gnu"
197*333d2b36SAndroid Build Coastguard Worker}
198*333d2b36SAndroid Build Coastguard Worker
199*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainWindowsX8664) ClangTriple() string {
200*333d2b36SAndroid Build Coastguard Worker	return "x86_64-pc-windows-gnu"
201*333d2b36SAndroid Build Coastguard Worker}
202*333d2b36SAndroid Build Coastguard Worker
203*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainWindowsX86) Cflags() string {
204*333d2b36SAndroid Build Coastguard Worker	return "${config.WindowsCflags} ${config.WindowsX86Cflags}"
205*333d2b36SAndroid Build Coastguard Worker}
206*333d2b36SAndroid Build Coastguard Worker
207*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainWindowsX8664) Cflags() string {
208*333d2b36SAndroid Build Coastguard Worker	return "${config.WindowsCflags} ${config.WindowsX8664Cflags}"
209*333d2b36SAndroid Build Coastguard Worker}
210*333d2b36SAndroid Build Coastguard Worker
211*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainWindowsX86) Cppflags() string {
212*333d2b36SAndroid Build Coastguard Worker	return "${config.WindowsCppflags} ${config.WindowsX86Cppflags}"
213*333d2b36SAndroid Build Coastguard Worker}
214*333d2b36SAndroid Build Coastguard Worker
215*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainWindowsX8664) Cppflags() string {
216*333d2b36SAndroid Build Coastguard Worker	return "${config.WindowsCppflags} ${config.WindowsX8664Cppflags}"
217*333d2b36SAndroid Build Coastguard Worker}
218*333d2b36SAndroid Build Coastguard Worker
219*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainWindowsX86) Ldflags() string {
220*333d2b36SAndroid Build Coastguard Worker	return "${config.WindowsLdflags} ${config.WindowsX86Ldflags}"
221*333d2b36SAndroid Build Coastguard Worker}
222*333d2b36SAndroid Build Coastguard Worker
223*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainWindowsX86) Lldflags() string {
224*333d2b36SAndroid Build Coastguard Worker	return "${config.WindowsLldflags} ${config.WindowsX86Lldflags}"
225*333d2b36SAndroid Build Coastguard Worker}
226*333d2b36SAndroid Build Coastguard Worker
227*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainWindowsX8664) Ldflags() string {
228*333d2b36SAndroid Build Coastguard Worker	return "${config.WindowsLdflags} ${config.WindowsX8664Ldflags}"
229*333d2b36SAndroid Build Coastguard Worker}
230*333d2b36SAndroid Build Coastguard Worker
231*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainWindowsX8664) Lldflags() string {
232*333d2b36SAndroid Build Coastguard Worker	return "${config.WindowsLldflags} ${config.WindowsX8664Lldflags}"
233*333d2b36SAndroid Build Coastguard Worker}
234*333d2b36SAndroid Build Coastguard Worker
235*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainWindowsX86) YasmFlags() string {
236*333d2b36SAndroid Build Coastguard Worker	return "${config.WindowsX86YasmFlags}"
237*333d2b36SAndroid Build Coastguard Worker}
238*333d2b36SAndroid Build Coastguard Worker
239*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainWindowsX8664) YasmFlags() string {
240*333d2b36SAndroid Build Coastguard Worker	return "${config.WindowsX8664YasmFlags}"
241*333d2b36SAndroid Build Coastguard Worker}
242*333d2b36SAndroid Build Coastguard Worker
243*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainWindows) ShlibSuffix() string {
244*333d2b36SAndroid Build Coastguard Worker	return ".dll"
245*333d2b36SAndroid Build Coastguard Worker}
246*333d2b36SAndroid Build Coastguard Worker
247*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainWindows) ExecutableSuffix() string {
248*333d2b36SAndroid Build Coastguard Worker	return ".exe"
249*333d2b36SAndroid Build Coastguard Worker}
250*333d2b36SAndroid Build Coastguard Worker
251*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainWindows) AvailableLibraries() []string {
252*333d2b36SAndroid Build Coastguard Worker	return windowsAvailableLibraries
253*333d2b36SAndroid Build Coastguard Worker}
254*333d2b36SAndroid Build Coastguard Worker
255*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainWindows) Bionic() bool {
256*333d2b36SAndroid Build Coastguard Worker	return false
257*333d2b36SAndroid Build Coastguard Worker}
258*333d2b36SAndroid Build Coastguard Worker
259*333d2b36SAndroid Build Coastguard Workervar toolchainWindowsX86Singleton Toolchain = &toolchainWindowsX86{}
260*333d2b36SAndroid Build Coastguard Workervar toolchainWindowsX8664Singleton Toolchain = &toolchainWindowsX8664{}
261*333d2b36SAndroid Build Coastguard Worker
262*333d2b36SAndroid Build Coastguard Workerfunc windowsX86ToolchainFactory(arch android.Arch) Toolchain {
263*333d2b36SAndroid Build Coastguard Worker	return toolchainWindowsX86Singleton
264*333d2b36SAndroid Build Coastguard Worker}
265*333d2b36SAndroid Build Coastguard Worker
266*333d2b36SAndroid Build Coastguard Workerfunc windowsX8664ToolchainFactory(arch android.Arch) Toolchain {
267*333d2b36SAndroid Build Coastguard Worker	return toolchainWindowsX8664Singleton
268*333d2b36SAndroid Build Coastguard Worker}
269*333d2b36SAndroid Build Coastguard Worker
270*333d2b36SAndroid Build Coastguard Workerfunc init() {
271*333d2b36SAndroid Build Coastguard Worker	registerToolchainFactory(android.Windows, android.X86, windowsX86ToolchainFactory)
272*333d2b36SAndroid Build Coastguard Worker	registerToolchainFactory(android.Windows, android.X86_64, windowsX8664ToolchainFactory)
273*333d2b36SAndroid Build Coastguard Worker}
274