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 15package cc 16 17import ( 18 "strings" 19 20 "android/soong/common" 21) 22 23var ( 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 "-m32", 32 33 // Workaround differences in inttypes.h between host and target. 34 //See bug 12708004. 35 "-D__STDC_FORMAT_MACROS", 36 "-D__STDC_CONSTANT_MACROS", 37 38 // Use C99-compliant printf functions (%zd). 39 "-D__USE_MINGW_ANSI_STDIO=1", 40 // Admit to using >= Win2K. Both are needed because of <_mingw.h>. 41 "-D_WIN32_WINNT=0x0500", 42 "-DWINVER=0x0500", 43 // Get 64-bit off_t and related functions. 44 "-D_FILE_OFFSET_BITS=64", 45 46 // HOST_RELEASE_CFLAGS 47 "-O2", // from build/core/combo/select.mk 48 "-g", // from build/core/combo/select.mk 49 "-fno-strict-aliasing", // from build/core/combo/select.mk 50 } 51 52 windowsIncludeFlags = []string{ 53 "-I${windowsGccRoot}/${windowsGccTriple}/include", 54 "-I${windowsGccRoot}/lib/gcc/${windowsGccTriple}/4.8.3/include", 55 } 56 57 windowsLdflags = []string{ 58 "-L${windowsGccRoot}/${windowsGccTriple}", 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 } 73 74 windowsX8664Ldflags = []string{ 75 "-m64", 76 } 77) 78 79const ( 80 windowsGccVersion = "4.8" 81) 82 83func init() { 84 pctx.StaticVariable("windowsGccVersion", windowsGccVersion) 85 86 pctx.SourcePathVariable("windowsGccRoot", 87 "prebuilts/gcc/${HostPrebuiltTag}/host/x86_64-w64-mingw32-${windowsGccVersion}") 88 89 pctx.StaticVariable("windowsGccTriple", "x86_64-w64-mingw32") 90 91 pctx.StaticVariable("windowsCflags", strings.Join(windowsCflags, " ")) 92 pctx.StaticVariable("windowsLdflags", strings.Join(windowsLdflags, " ")) 93 94 pctx.StaticVariable("windowsX86Cflags", strings.Join(windowsX86Cflags, " ")) 95 pctx.StaticVariable("windowsX8664Cflags", strings.Join(windowsX8664Cflags, " ")) 96 pctx.StaticVariable("windowsX86Ldflags", strings.Join(windowsX86Ldflags, " ")) 97 pctx.StaticVariable("windowsX8664Ldflags", strings.Join(windowsX8664Ldflags, " ")) 98} 99 100type toolchainWindows struct { 101 cFlags, ldFlags string 102} 103 104type toolchainWindowsX86 struct { 105 toolchain32Bit 106 toolchainWindows 107} 108 109type toolchainWindowsX8664 struct { 110 toolchain64Bit 111 toolchainWindows 112} 113 114func (t *toolchainWindowsX86) Name() string { 115 return "x86" 116} 117 118func (t *toolchainWindowsX8664) Name() string { 119 return "x86_64" 120} 121 122func (t *toolchainWindows) GccRoot() string { 123 return "${windowsGccRoot}" 124} 125 126func (t *toolchainWindows) GccTriple() string { 127 return "${windowsGccTriple}" 128} 129 130func (t *toolchainWindows) GccVersion() string { 131 return windowsGccVersion 132} 133 134func (t *toolchainWindowsX86) Cflags() string { 135 return "${windowsCflags} ${windowsX86Cflags}" 136} 137 138func (t *toolchainWindowsX8664) Cflags() string { 139 return "${windowsCflags} ${windowsX8664Cflags}" 140} 141 142func (t *toolchainWindows) Cppflags() string { 143 return "" 144} 145 146func (t *toolchainWindowsX86) Ldflags() string { 147 return "${windowsLdflags} ${windowsX86Ldflags}" 148} 149 150func (t *toolchainWindowsX8664) Ldflags() string { 151 return "${windowsLdflags} ${windowsX8664Ldflags}" 152} 153 154func (t *toolchainWindows) IncludeFlags() string { 155 return "" 156} 157 158func (t *toolchainWindows) ClangSupported() bool { 159 return false 160} 161 162func (t *toolchainWindows) ClangTriple() string { 163 panic("Clang is not supported under mingw") 164} 165 166func (t *toolchainWindows) ClangCflags() string { 167 panic("Clang is not supported under mingw") 168} 169 170func (t *toolchainWindows) ClangCppflags() string { 171 panic("Clang is not supported under mingw") 172} 173 174func (t *toolchainWindows) ClangLdflags() string { 175 panic("Clang is not supported under mingw") 176} 177 178func (t *toolchainWindows) ShlibSuffix() string { 179 return ".dll" 180} 181 182func (t *toolchainWindows) ExecutableSuffix() string { 183 return ".exe" 184} 185 186var toolchainWindowsX86Singleton Toolchain = &toolchainWindowsX86{} 187var toolchainWindowsX8664Singleton Toolchain = &toolchainWindowsX8664{} 188 189func windowsX86ToolchainFactory(arch common.Arch) Toolchain { 190 return toolchainWindowsX86Singleton 191} 192 193func windowsX8664ToolchainFactory(arch common.Arch) Toolchain { 194 return toolchainWindowsX8664Singleton 195} 196 197func init() { 198 registerHostToolchainFactory(common.Windows, common.X86, windowsX86ToolchainFactory) 199 registerHostToolchainFactory(common.Windows, common.X86_64, windowsX8664ToolchainFactory) 200} 201