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