1 // 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 15 package config 16 17 import ( 18 "strings" 19 20 "android/soong/android" 21 ) 22 23 var ( 24 windowsCflags = []string{ 25 "-fno-exceptions", // from build/core/combo/select.mk 26 "-Wno-multichar", // from build/core/combo/select.mk 27 28 "-DUSE_MINGW", 29 "-DWIN32_LEAN_AND_MEAN", 30 "-Wno-unused-parameter", 31 32 // Workaround differences in inttypes.h between host and target. 33 //See bug 12708004. 34 "-D__STDC_FORMAT_MACROS", 35 "-D__STDC_CONSTANT_MACROS", 36 37 // Use C99-compliant printf functions (%zd). 38 "-D__USE_MINGW_ANSI_STDIO=1", 39 // Admit to using >= Vista. Both are needed because of <_mingw.h>. 40 "-D_WIN32_WINNT=0x0600", 41 "-DWINVER=0x0600", 42 // Get 64-bit off_t and related functions. 43 "-D_FILE_OFFSET_BITS=64", 44 45 "--sysroot ${WindowsGccRoot}/${WindowsGccTriple}", 46 47 // HOST_RELEASE_CFLAGS 48 "-O2", // from build/core/combo/select.mk 49 "-g", // from build/core/combo/select.mk 50 "-fno-strict-aliasing", // from build/core/combo/select.mk 51 } 52 53 windowsIncludeFlags = []string{ 54 "-isystem ${WindowsGccRoot}/${WindowsGccTriple}/include", 55 "-isystem ${WindowsGccRoot}/lib/gcc/${WindowsGccTriple}/4.8.3/include", 56 } 57 58 windowsLdflags = []string{ 59 "--enable-stdcall-fixup", 60 } 61 62 windowsX86Cflags = []string{ 63 "-m32", 64 } 65 66 windowsX8664Cflags = []string{ 67 "-m64", 68 } 69 70 windowsX86Ldflags = []string{ 71 "-m32", 72 "-Wl,--large-address-aware", 73 "-L${WindowsGccRoot}/${WindowsGccTriple}/lib32", 74 } 75 76 windowsX8664Ldflags = []string{ 77 "-m64", 78 "-L${WindowsGccRoot}/${WindowsGccTriple}/lib64", 79 } 80 81 windowsAvailableLibraries = addPrefix([]string{ 82 "gdi32", 83 "imagehlp", 84 "ole32", 85 "psapi", 86 "pthread", 87 "userenv", 88 "uuid", 89 "version", 90 "ws2_32", 91 }, "-l") 92 ) 93 94 const ( 95 windowsGccVersion = "4.8" 96 ) 97 98 func init() { 99 pctx.StaticVariable("WindowsGccVersion", windowsGccVersion) 100 101 pctx.SourcePathVariable("WindowsGccRoot", 102 "prebuilts/gcc/${HostPrebuiltTag}/host/x86_64-w64-mingw32-${WindowsGccVersion}") 103 104 pctx.StaticVariable("WindowsGccTriple", "x86_64-w64-mingw32") 105 106 pctx.StaticVariable("WindowsCflags", strings.Join(windowsCflags, " ")) 107 pctx.StaticVariable("WindowsLdflags", strings.Join(windowsLdflags, " ")) 108 109 pctx.StaticVariable("WindowsX86Cflags", strings.Join(windowsX86Cflags, " ")) 110 pctx.StaticVariable("WindowsX8664Cflags", strings.Join(windowsX8664Cflags, " ")) 111 pctx.StaticVariable("WindowsX86Ldflags", strings.Join(windowsX86Ldflags, " ")) 112 pctx.StaticVariable("WindowsX8664Ldflags", strings.Join(windowsX8664Ldflags, " ")) 113 114 pctx.StaticVariable("WindowsIncludeFlags", strings.Join(windowsIncludeFlags, " ")) 115 } 116 117 type toolchainWindows struct { 118 cFlags, ldFlags string 119 } 120 121 type toolchainWindowsX86 struct { 122 toolchain32Bit 123 toolchainWindows 124 } 125 126 type toolchainWindowsX8664 struct { 127 toolchain64Bit 128 toolchainWindows 129 } 130 131 func (t *toolchainWindowsX86) Name() string { 132 return "x86" 133 } 134 135 func (t *toolchainWindowsX8664) Name() string { 136 return "x86_64" 137 } 138 139 func (t *toolchainWindows) GccRoot() string { 140 return "${config.WindowsGccRoot}" 141 } 142 143 func (t *toolchainWindows) GccTriple() string { 144 return "${config.WindowsGccTriple}" 145 } 146 147 func (t *toolchainWindows) GccVersion() string { 148 return windowsGccVersion 149 } 150 151 func (t *toolchainWindowsX86) Cflags() string { 152 return "${config.WindowsCflags} ${config.WindowsX86Cflags}" 153 } 154 155 func (t *toolchainWindowsX8664) Cflags() string { 156 return "${config.WindowsCflags} ${config.WindowsX8664Cflags}" 157 } 158 159 func (t *toolchainWindows) Cppflags() string { 160 return "" 161 } 162 163 func (t *toolchainWindowsX86) Ldflags() string { 164 return "${config.WindowsLdflags} ${config.WindowsX86Ldflags}" 165 } 166 167 func (t *toolchainWindowsX8664) Ldflags() string { 168 return "${config.WindowsLdflags} ${config.WindowsX8664Ldflags}" 169 } 170 171 func (t *toolchainWindows) IncludeFlags() string { 172 return "${config.WindowsIncludeFlags}" 173 } 174 175 func (t *toolchainWindows) ClangSupported() bool { 176 return false 177 } 178 179 func (t *toolchainWindows) ClangTriple() string { 180 panic("Clang is not supported under mingw") 181 } 182 183 func (t *toolchainWindows) ClangCflags() string { 184 panic("Clang is not supported under mingw") 185 } 186 187 func (t *toolchainWindows) ClangCppflags() string { 188 panic("Clang is not supported under mingw") 189 } 190 191 func (t *toolchainWindows) ClangLdflags() string { 192 panic("Clang is not supported under mingw") 193 } 194 195 func (t *toolchainWindows) ShlibSuffix() string { 196 return ".dll" 197 } 198 199 func (t *toolchainWindows) ExecutableSuffix() string { 200 return ".exe" 201 } 202 203 func (t *toolchainWindows) AvailableLibraries() []string { 204 return windowsAvailableLibraries 205 } 206 207 func (t *toolchainWindows) Bionic() bool { 208 return false 209 } 210 211 var toolchainWindowsX86Singleton Toolchain = &toolchainWindowsX86{} 212 var toolchainWindowsX8664Singleton Toolchain = &toolchainWindowsX8664{} 213 214 func windowsX86ToolchainFactory(arch android.Arch) Toolchain { 215 return toolchainWindowsX86Singleton 216 } 217 218 func windowsX8664ToolchainFactory(arch android.Arch) Toolchain { 219 return toolchainWindowsX8664Singleton 220 } 221 222 func init() { 223 registerToolchainFactory(android.Windows, android.X86, windowsX86ToolchainFactory) 224 registerToolchainFactory(android.Windows, android.X86_64, windowsX8664ToolchainFactory) 225 } 226