1// Copyright 2016 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 config 16 17import ( 18 "fmt" 19 "os/exec" 20 "path/filepath" 21 "strings" 22 23 "android/soong/android" 24) 25 26var ( 27 darwinCflags = []string{ 28 "-fno-exceptions", // from build/core/combo/select.mk 29 "-Wno-multichar", // from build/core/combo/select.mk 30 31 "-fdiagnostics-color", 32 33 "-fPIC", 34 "-funwind-tables", 35 36 // Workaround differences in inttypes.h between host and target. 37 //See bug 12708004. 38 "-D__STDC_FORMAT_MACROS", 39 "-D__STDC_CONSTANT_MACROS", 40 41 // HOST_RELEASE_CFLAGS 42 "-O2", // from build/core/combo/select.mk 43 "-g", // from build/core/combo/select.mk 44 "-fno-strict-aliasing", // from build/core/combo/select.mk 45 "-isysroot ${macSdkRoot}", 46 "-mmacosx-version-min=${macMinVersion}", 47 "-DMACOSX_DEPLOYMENT_TARGET=${macMinVersion}", 48 } 49 50 darwinLdflags = []string{ 51 "-isysroot ${macSdkRoot}", 52 "-Wl,-syslibroot,${macSdkRoot}", 53 "-mmacosx-version-min=${macMinVersion}", 54 } 55 56 // Extended cflags 57 darwinX86Cflags = []string{ 58 "-m32", 59 } 60 61 darwinX8664Cflags = []string{ 62 "-m64", 63 } 64 65 darwinX86Ldflags = []string{ 66 "-m32", 67 } 68 69 darwinX8664Ldflags = []string{ 70 "-m64", 71 } 72 73 darwinClangCflags = append(ClangFilterUnknownCflags(darwinCflags), []string{ 74 "-integrated-as", 75 "-fstack-protector-strong", 76 }...) 77 78 darwinX86ClangCflags = append(ClangFilterUnknownCflags(darwinX86Cflags), []string{ 79 "-msse3", 80 }...) 81 82 darwinClangLdflags = ClangFilterUnknownCflags(darwinLdflags) 83 84 darwinX86ClangLdflags = ClangFilterUnknownCflags(darwinX86Ldflags) 85 86 darwinX8664ClangLdflags = ClangFilterUnknownCflags(darwinX8664Ldflags) 87 88 darwinSupportedSdkVersions = []string{ 89 "10.10", 90 "10.11", 91 "10.12", 92 } 93 94 darwinAvailableLibraries = append( 95 addPrefix([]string{ 96 "c", 97 "dl", 98 "m", 99 "ncurses", 100 "objc", 101 "pthread", 102 "z", 103 }, "-l"), 104 "-framework AppKit", 105 "-framework CoreFoundation", 106 "-framework Foundation", 107 "-framework IOKit", 108 "-framework Security", 109 ) 110) 111 112const ( 113 darwinGccVersion = "4.2.1" 114) 115 116func init() { 117 pctx.VariableFunc("macSdkPath", func(config interface{}) (string, error) { 118 bytes, err := exec.Command("xcode-select", "--print-path").Output() 119 return strings.TrimSpace(string(bytes)), err 120 }) 121 pctx.VariableFunc("macSdkRoot", func(config interface{}) (string, error) { 122 return xcrunSdk(config.(android.Config), "--show-sdk-path") 123 }) 124 pctx.StaticVariable("macMinVersion", "10.8") 125 pctx.VariableFunc("MacArPath", func(config interface{}) (string, error) { 126 bytes, err := exec.Command("xcrun", "--find", "ar").Output() 127 return strings.TrimSpace(string(bytes)), err 128 }) 129 130 pctx.VariableFunc("MacStripPath", func(config interface{}) (string, error) { 131 bytes, err := exec.Command("xcrun", "--find", "strip").Output() 132 return strings.TrimSpace(string(bytes)), err 133 }) 134 135 pctx.VariableFunc("MacToolPath", func(config interface{}) (string, error) { 136 bytes, err := exec.Command("xcrun", "--find", "ld").Output() 137 return filepath.Dir(strings.TrimSpace(string(bytes))), err 138 }) 139 140 pctx.StaticVariable("DarwinGccVersion", darwinGccVersion) 141 pctx.SourcePathVariable("DarwinGccRoot", 142 "prebuilts/gcc/${HostPrebuiltTag}/host/i686-apple-darwin-${DarwinGccVersion}") 143 144 pctx.StaticVariable("DarwinGccTriple", "i686-apple-darwin11") 145 146 pctx.StaticVariable("DarwinCflags", strings.Join(darwinCflags, " ")) 147 pctx.StaticVariable("DarwinLdflags", strings.Join(darwinLdflags, " ")) 148 149 pctx.StaticVariable("DarwinClangCflags", strings.Join(darwinClangCflags, " ")) 150 pctx.StaticVariable("DarwinClangLdflags", strings.Join(darwinClangLdflags, " ")) 151 152 // Extended cflags 153 pctx.StaticVariable("DarwinX86Cflags", strings.Join(darwinX86Cflags, " ")) 154 pctx.StaticVariable("DarwinX8664Cflags", strings.Join(darwinX8664Cflags, " ")) 155 pctx.StaticVariable("DarwinX86Ldflags", strings.Join(darwinX86Ldflags, " ")) 156 pctx.StaticVariable("DarwinX8664Ldflags", strings.Join(darwinX8664Ldflags, " ")) 157 158 pctx.StaticVariable("DarwinX86ClangCflags", strings.Join(darwinX86ClangCflags, " ")) 159 pctx.StaticVariable("DarwinX8664ClangCflags", 160 strings.Join(ClangFilterUnknownCflags(darwinX8664Cflags), " ")) 161 pctx.StaticVariable("DarwinX86ClangLdflags", strings.Join(darwinX86ClangLdflags, " ")) 162 pctx.StaticVariable("DarwinX8664ClangLdflags", strings.Join(darwinX8664ClangLdflags, " ")) 163} 164 165func xcrunSdk(config android.Config, arg string) (string, error) { 166 if selected := config.Getenv("MAC_SDK_VERSION"); selected != "" { 167 if !inList(selected, darwinSupportedSdkVersions) { 168 return "", fmt.Errorf("MAC_SDK_VERSION %s isn't supported: %q", selected, darwinSupportedSdkVersions) 169 } 170 171 bytes, err := exec.Command("xcrun", "--sdk", "macosx"+selected, arg).Output() 172 if err == nil { 173 return strings.TrimSpace(string(bytes)), err 174 } 175 return "", fmt.Errorf("MAC_SDK_VERSION %s is not installed", selected) 176 } 177 178 for _, sdk := range darwinSupportedSdkVersions { 179 bytes, err := exec.Command("xcrun", "--sdk", "macosx"+sdk, arg).Output() 180 if err == nil { 181 return strings.TrimSpace(string(bytes)), err 182 } 183 } 184 return "", fmt.Errorf("Could not find a supported mac sdk: %q", darwinSupportedSdkVersions) 185} 186 187type toolchainDarwin struct { 188 cFlags, ldFlags string 189} 190 191type toolchainDarwinX86 struct { 192 toolchain32Bit 193 toolchainDarwin 194} 195 196type toolchainDarwinX8664 struct { 197 toolchain64Bit 198 toolchainDarwin 199} 200 201func (t *toolchainDarwinX86) Name() string { 202 return "x86" 203} 204 205func (t *toolchainDarwinX8664) Name() string { 206 return "x86_64" 207} 208 209func (t *toolchainDarwin) GccRoot() string { 210 return "${config.DarwinGccRoot}" 211} 212 213func (t *toolchainDarwin) GccTriple() string { 214 return "${config.DarwinGccTriple}" 215} 216 217func (t *toolchainDarwin) GccVersion() string { 218 return darwinGccVersion 219} 220 221func (t *toolchainDarwin) Cflags() string { 222 return "${config.DarwinCflags} ${config.DarwinX86Cflags}" 223} 224 225func (t *toolchainDarwinX8664) Cflags() string { 226 return "${config.DarwinCflags} ${config.DarwinX8664Cflags}" 227} 228 229func (t *toolchainDarwin) Cppflags() string { 230 return "" 231} 232 233func (t *toolchainDarwinX86) Ldflags() string { 234 return "${config.DarwinLdflags} ${config.DarwinX86Ldflags}" 235} 236 237func (t *toolchainDarwinX8664) Ldflags() string { 238 return "${config.DarwinLdflags} ${config.DarwinX8664Ldflags}" 239} 240 241func (t *toolchainDarwin) IncludeFlags() string { 242 return "" 243} 244 245func (t *toolchainDarwinX86) ClangTriple() string { 246 return "i686-apple-darwin" 247} 248 249func (t *toolchainDarwinX86) ClangCflags() string { 250 return "${config.DarwinClangCflags} ${config.DarwinX86ClangCflags}" 251} 252 253func (t *toolchainDarwinX8664) ClangTriple() string { 254 return "x86_64-apple-darwin" 255} 256 257func (t *toolchainDarwinX8664) ClangCflags() string { 258 return "${config.DarwinClangCflags} ${config.DarwinX8664ClangCflags}" 259} 260 261func (t *toolchainDarwin) ClangCppflags() string { 262 return "" 263} 264 265func (t *toolchainDarwinX86) ClangLdflags() string { 266 return "${config.DarwinClangLdflags} ${config.DarwinX86ClangLdflags}" 267} 268 269func (t *toolchainDarwinX8664) ClangLdflags() string { 270 return "${config.DarwinClangLdflags} ${config.DarwinX8664ClangLdflags}" 271} 272 273func (t *toolchainDarwin) ShlibSuffix() string { 274 return ".dylib" 275} 276 277func (t *toolchainDarwin) AvailableLibraries() []string { 278 return darwinAvailableLibraries 279} 280 281func (t *toolchainDarwin) Bionic() bool { 282 return false 283} 284 285func (t *toolchainDarwin) ToolPath() string { 286 return "${config.MacToolPath}" 287} 288 289var toolchainDarwinX86Singleton Toolchain = &toolchainDarwinX86{} 290var toolchainDarwinX8664Singleton Toolchain = &toolchainDarwinX8664{} 291 292func darwinX86ToolchainFactory(arch android.Arch) Toolchain { 293 return toolchainDarwinX86Singleton 294} 295 296func darwinX8664ToolchainFactory(arch android.Arch) Toolchain { 297 return toolchainDarwinX8664Singleton 298} 299 300func init() { 301 registerToolchainFactory(android.Darwin, android.X86, darwinX86ToolchainFactory) 302 registerToolchainFactory(android.Darwin, android.X86_64, darwinX8664ToolchainFactory) 303} 304