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 "sync" 23 24 "android/soong/android" 25) 26 27var ( 28 darwinCflags = []string{ 29 "-fdiagnostics-color", 30 31 "-fPIC", 32 "-funwind-tables", 33 34 // Workaround differences in inttypes.h between host and target. 35 //See bug 12708004. 36 "-D__STDC_FORMAT_MACROS", 37 "-D__STDC_CONSTANT_MACROS", 38 39 "-isysroot ${macSdkRoot}", 40 "-mmacosx-version-min=${macMinVersion}", 41 "-DMACOSX_DEPLOYMENT_TARGET=${macMinVersion}", 42 43 "-m64", 44 } 45 46 darwinLdflags = []string{ 47 "-isysroot ${macSdkRoot}", 48 "-Wl,-syslibroot,${macSdkRoot}", 49 "-mmacosx-version-min=${macMinVersion}", 50 "-m64", 51 } 52 53 darwinClangCflags = append(ClangFilterUnknownCflags(darwinCflags), []string{ 54 "-integrated-as", 55 "-fstack-protector-strong", 56 }...) 57 58 darwinClangLdflags = ClangFilterUnknownCflags(darwinLdflags) 59 60 darwinClangLldflags = ClangFilterUnknownLldflags(darwinClangLdflags) 61 62 darwinSupportedSdkVersions = []string{ 63 "10.10", 64 "10.11", 65 "10.12", 66 "10.13", 67 "10.14", 68 "10.15", 69 } 70 71 darwinAvailableLibraries = append( 72 addPrefix([]string{ 73 "c", 74 "dl", 75 "m", 76 "ncurses", 77 "objc", 78 "pthread", 79 }, "-l"), 80 "-framework AppKit", 81 "-framework CoreFoundation", 82 "-framework Foundation", 83 "-framework IOKit", 84 "-framework Security", 85 "-framework SystemConfiguration", 86 ) 87) 88 89const ( 90 darwinGccVersion = "4.2.1" 91) 92 93func init() { 94 pctx.VariableFunc("macSdkRoot", func(ctx android.PackageVarContext) string { 95 return getMacTools(ctx).sdkRoot 96 }) 97 pctx.StaticVariable("macMinVersion", "10.10") 98 pctx.VariableFunc("MacArPath", func(ctx android.PackageVarContext) string { 99 return getMacTools(ctx).arPath 100 }) 101 102 pctx.VariableFunc("MacStripPath", func(ctx android.PackageVarContext) string { 103 return getMacTools(ctx).stripPath 104 }) 105 106 pctx.VariableFunc("MacToolPath", func(ctx android.PackageVarContext) string { 107 return getMacTools(ctx).toolPath 108 }) 109 110 pctx.StaticVariable("DarwinGccVersion", darwinGccVersion) 111 pctx.SourcePathVariable("DarwinGccRoot", 112 "prebuilts/gcc/${HostPrebuiltTag}/host/i686-apple-darwin-${DarwinGccVersion}") 113 114 pctx.StaticVariable("DarwinGccTriple", "i686-apple-darwin11") 115 116 pctx.StaticVariable("DarwinClangCflags", strings.Join(darwinClangCflags, " ")) 117 pctx.StaticVariable("DarwinClangLdflags", strings.Join(darwinClangLdflags, " ")) 118 pctx.StaticVariable("DarwinClangLldflags", strings.Join(darwinClangLldflags, " ")) 119 120 pctx.StaticVariable("DarwinYasmFlags", "-f macho -m amd64") 121} 122 123type macPlatformTools struct { 124 once sync.Once 125 err error 126 127 sdkRoot string 128 arPath string 129 stripPath string 130 toolPath string 131} 132 133var macTools = &macPlatformTools{} 134 135func getMacTools(ctx android.PackageVarContext) *macPlatformTools { 136 macTools.once.Do(func() { 137 xcrunTool := ctx.Config().HostSystemTool("xcrun") 138 139 xcrun := func(args ...string) string { 140 if macTools.err != nil { 141 return "" 142 } 143 144 bytes, err := exec.Command(xcrunTool, args...).Output() 145 if err != nil { 146 macTools.err = fmt.Errorf("xcrun %q failed with: %q", args, err) 147 return "" 148 } 149 150 return strings.TrimSpace(string(bytes)) 151 } 152 153 xcrunSdk := func(arg string) string { 154 if selected := ctx.Config().Getenv("MAC_SDK_VERSION"); selected != "" { 155 if !inList(selected, darwinSupportedSdkVersions) { 156 macTools.err = fmt.Errorf("MAC_SDK_VERSION %s isn't supported: %q", selected, darwinSupportedSdkVersions) 157 return "" 158 } 159 160 return xcrun("--sdk", "macosx"+selected, arg) 161 } 162 163 for _, sdk := range darwinSupportedSdkVersions { 164 bytes, err := exec.Command(xcrunTool, "--sdk", "macosx"+sdk, arg).Output() 165 if err == nil { 166 return strings.TrimSpace(string(bytes)) 167 } 168 } 169 macTools.err = fmt.Errorf("Could not find a supported mac sdk: %q", darwinSupportedSdkVersions) 170 return "" 171 } 172 173 macTools.sdkRoot = xcrunSdk("--show-sdk-path") 174 175 macTools.arPath = xcrun("--find", "ar") 176 macTools.stripPath = xcrun("--find", "strip") 177 macTools.toolPath = filepath.Dir(xcrun("--find", "ld")) 178 }) 179 if macTools.err != nil { 180 ctx.Errorf("%q", macTools.err) 181 } 182 return macTools 183} 184 185type toolchainDarwin struct { 186 cFlags, ldFlags string 187 toolchain64Bit 188} 189 190func (t *toolchainDarwin) Name() string { 191 return "x86_64" 192} 193 194func (t *toolchainDarwin) GccRoot() string { 195 return "${config.DarwinGccRoot}" 196} 197 198func (t *toolchainDarwin) GccTriple() string { 199 return "${config.DarwinGccTriple}" 200} 201 202func (t *toolchainDarwin) GccVersion() string { 203 return darwinGccVersion 204} 205 206func (t *toolchainDarwin) IncludeFlags() string { 207 return "" 208} 209 210func (t *toolchainDarwin) ClangTriple() string { 211 return "x86_64-apple-darwin" 212} 213 214func (t *toolchainDarwin) ClangCflags() string { 215 return "${config.DarwinClangCflags}" 216} 217 218func (t *toolchainDarwin) ClangCppflags() string { 219 return "" 220} 221 222func (t *toolchainDarwin) ClangLdflags() string { 223 return "${config.DarwinClangLdflags}" 224} 225 226func (t *toolchainDarwin) ClangLldflags() string { 227 return "${config.DarwinClangLldflags}" 228} 229 230func (t *toolchainDarwin) YasmFlags() string { 231 return "${config.DarwinYasmFlags}" 232} 233 234func (t *toolchainDarwin) ShlibSuffix() string { 235 return ".dylib" 236} 237 238func (t *toolchainDarwin) AvailableLibraries() []string { 239 return darwinAvailableLibraries 240} 241 242func (t *toolchainDarwin) Bionic() bool { 243 return false 244} 245 246func (t *toolchainDarwin) ToolPath() string { 247 return "${config.MacToolPath}" 248} 249 250var toolchainDarwinSingleton Toolchain = &toolchainDarwin{} 251 252func darwinToolchainFactory(arch android.Arch) Toolchain { 253 return toolchainDarwinSingleton 254} 255 256func init() { 257 registerToolchainFactory(android.Darwin, android.X86_64, darwinToolchainFactory) 258} 259