1*333d2b36SAndroid Build Coastguard Worker// Copyright 2016 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 "fmt" 19*333d2b36SAndroid Build Coastguard Worker "os/exec" 20*333d2b36SAndroid Build Coastguard Worker "path/filepath" 21*333d2b36SAndroid Build Coastguard Worker "runtime" 22*333d2b36SAndroid Build Coastguard Worker "strings" 23*333d2b36SAndroid Build Coastguard Worker "sync" 24*333d2b36SAndroid Build Coastguard Worker 25*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 26*333d2b36SAndroid Build Coastguard Worker) 27*333d2b36SAndroid Build Coastguard Worker 28*333d2b36SAndroid Build Coastguard Workervar ( 29*333d2b36SAndroid Build Coastguard Worker darwinCflags = []string{ 30*333d2b36SAndroid Build Coastguard Worker "-fPIC", 31*333d2b36SAndroid Build Coastguard Worker "-funwind-tables", 32*333d2b36SAndroid Build Coastguard Worker "-fno-omit-frame-pointer", 33*333d2b36SAndroid Build Coastguard Worker 34*333d2b36SAndroid Build Coastguard Worker "-isysroot ${macSdkRoot}", 35*333d2b36SAndroid Build Coastguard Worker "-mmacosx-version-min=${macMinVersion}", 36*333d2b36SAndroid Build Coastguard Worker "-DMACOSX_DEPLOYMENT_TARGET=${macMinVersion}", 37*333d2b36SAndroid Build Coastguard Worker 38*333d2b36SAndroid Build Coastguard Worker "-m64", 39*333d2b36SAndroid Build Coastguard Worker 40*333d2b36SAndroid Build Coastguard Worker "-integrated-as", 41*333d2b36SAndroid Build Coastguard Worker "-fstack-protector-strong", 42*333d2b36SAndroid Build Coastguard Worker } 43*333d2b36SAndroid Build Coastguard Worker 44*333d2b36SAndroid Build Coastguard Worker darwinLdflags = []string{ 45*333d2b36SAndroid Build Coastguard Worker "-isysroot ${macSdkRoot}", 46*333d2b36SAndroid Build Coastguard Worker "-Wl,-syslibroot,${macSdkRoot}", 47*333d2b36SAndroid Build Coastguard Worker "-mmacosx-version-min=${macMinVersion}", 48*333d2b36SAndroid Build Coastguard Worker "-m64", 49*333d2b36SAndroid Build Coastguard Worker "-mlinker-version=305", 50*333d2b36SAndroid Build Coastguard Worker } 51*333d2b36SAndroid Build Coastguard Worker 52*333d2b36SAndroid Build Coastguard Worker darwinSupportedSdkVersions = []string{ 53*333d2b36SAndroid Build Coastguard Worker "11", 54*333d2b36SAndroid Build Coastguard Worker "12", 55*333d2b36SAndroid Build Coastguard Worker "13", 56*333d2b36SAndroid Build Coastguard Worker "14", 57*333d2b36SAndroid Build Coastguard Worker } 58*333d2b36SAndroid Build Coastguard Worker 59*333d2b36SAndroid Build Coastguard Worker darwinAvailableLibraries = append( 60*333d2b36SAndroid Build Coastguard Worker addPrefix([]string{ 61*333d2b36SAndroid Build Coastguard Worker "c", 62*333d2b36SAndroid Build Coastguard Worker "dl", 63*333d2b36SAndroid Build Coastguard Worker "m", 64*333d2b36SAndroid Build Coastguard Worker "ncurses", 65*333d2b36SAndroid Build Coastguard Worker "objc", 66*333d2b36SAndroid Build Coastguard Worker "pthread", 67*333d2b36SAndroid Build Coastguard Worker }, "-l"), 68*333d2b36SAndroid Build Coastguard Worker "-framework AppKit", 69*333d2b36SAndroid Build Coastguard Worker "-framework CoreFoundation", 70*333d2b36SAndroid Build Coastguard Worker "-framework Foundation", 71*333d2b36SAndroid Build Coastguard Worker "-framework IOKit", 72*333d2b36SAndroid Build Coastguard Worker "-framework Security", 73*333d2b36SAndroid Build Coastguard Worker "-framework SystemConfiguration", 74*333d2b36SAndroid Build Coastguard Worker ) 75*333d2b36SAndroid Build Coastguard Worker) 76*333d2b36SAndroid Build Coastguard Worker 77*333d2b36SAndroid Build Coastguard Workerfunc init() { 78*333d2b36SAndroid Build Coastguard Worker if runtime.GOOS == "darwin" { 79*333d2b36SAndroid Build Coastguard Worker pctx.VariableFunc("macSdkRoot", func(ctx android.PackageVarContext) string { 80*333d2b36SAndroid Build Coastguard Worker return getMacTools(ctx).sdkRoot 81*333d2b36SAndroid Build Coastguard Worker }) 82*333d2b36SAndroid Build Coastguard Worker pctx.StaticVariable("macMinVersion", "10.14") 83*333d2b36SAndroid Build Coastguard Worker pctx.VariableFunc("MacArPath", func(ctx android.PackageVarContext) string { 84*333d2b36SAndroid Build Coastguard Worker return getMacTools(ctx).arPath 85*333d2b36SAndroid Build Coastguard Worker }) 86*333d2b36SAndroid Build Coastguard Worker 87*333d2b36SAndroid Build Coastguard Worker pctx.VariableFunc("MacLipoPath", func(ctx android.PackageVarContext) string { 88*333d2b36SAndroid Build Coastguard Worker return getMacTools(ctx).lipoPath 89*333d2b36SAndroid Build Coastguard Worker }) 90*333d2b36SAndroid Build Coastguard Worker 91*333d2b36SAndroid Build Coastguard Worker pctx.VariableFunc("MacStripPath", func(ctx android.PackageVarContext) string { 92*333d2b36SAndroid Build Coastguard Worker return getMacTools(ctx).stripPath 93*333d2b36SAndroid Build Coastguard Worker }) 94*333d2b36SAndroid Build Coastguard Worker 95*333d2b36SAndroid Build Coastguard Worker pctx.VariableFunc("MacToolPath", func(ctx android.PackageVarContext) string { 96*333d2b36SAndroid Build Coastguard Worker return getMacTools(ctx).toolPath 97*333d2b36SAndroid Build Coastguard Worker }) 98*333d2b36SAndroid Build Coastguard Worker 99*333d2b36SAndroid Build Coastguard Worker pctx.StaticVariable("DarwinCflags", strings.Join(darwinCflags, " ")) 100*333d2b36SAndroid Build Coastguard Worker pctx.StaticVariable("DarwinLdflags", strings.Join(darwinLdflags, " ")) 101*333d2b36SAndroid Build Coastguard Worker pctx.StaticVariable("DarwinLldflags", strings.Join(darwinLdflags, " ")) 102*333d2b36SAndroid Build Coastguard Worker 103*333d2b36SAndroid Build Coastguard Worker pctx.StaticVariable("DarwinYasmFlags", "-f macho -m amd64") 104*333d2b36SAndroid Build Coastguard Worker } 105*333d2b36SAndroid Build Coastguard Worker} 106*333d2b36SAndroid Build Coastguard Worker 107*333d2b36SAndroid Build Coastguard Workerfunc MacStripPath(ctx android.PathContext) string { 108*333d2b36SAndroid Build Coastguard Worker return getMacTools(ctx).stripPath 109*333d2b36SAndroid Build Coastguard Worker} 110*333d2b36SAndroid Build Coastguard Worker 111*333d2b36SAndroid Build Coastguard Workertype macPlatformTools struct { 112*333d2b36SAndroid Build Coastguard Worker once sync.Once 113*333d2b36SAndroid Build Coastguard Worker err error 114*333d2b36SAndroid Build Coastguard Worker 115*333d2b36SAndroid Build Coastguard Worker sdkRoot string 116*333d2b36SAndroid Build Coastguard Worker arPath string 117*333d2b36SAndroid Build Coastguard Worker lipoPath string 118*333d2b36SAndroid Build Coastguard Worker stripPath string 119*333d2b36SAndroid Build Coastguard Worker toolPath string 120*333d2b36SAndroid Build Coastguard Worker} 121*333d2b36SAndroid Build Coastguard Worker 122*333d2b36SAndroid Build Coastguard Workervar macTools = &macPlatformTools{} 123*333d2b36SAndroid Build Coastguard Worker 124*333d2b36SAndroid Build Coastguard Workerfunc getMacTools(ctx android.PathContext) *macPlatformTools { 125*333d2b36SAndroid Build Coastguard Worker macTools.once.Do(func() { 126*333d2b36SAndroid Build Coastguard Worker xcrunTool := "/usr/bin/xcrun" 127*333d2b36SAndroid Build Coastguard Worker 128*333d2b36SAndroid Build Coastguard Worker xcrun := func(args ...string) string { 129*333d2b36SAndroid Build Coastguard Worker if macTools.err != nil { 130*333d2b36SAndroid Build Coastguard Worker return "" 131*333d2b36SAndroid Build Coastguard Worker } 132*333d2b36SAndroid Build Coastguard Worker 133*333d2b36SAndroid Build Coastguard Worker bytes, err := exec.Command(xcrunTool, append([]string{"--sdk", "macosx"}, args...)...).Output() 134*333d2b36SAndroid Build Coastguard Worker if err != nil { 135*333d2b36SAndroid Build Coastguard Worker macTools.err = fmt.Errorf("xcrun %q failed with: %q", args, err) 136*333d2b36SAndroid Build Coastguard Worker return "" 137*333d2b36SAndroid Build Coastguard Worker } 138*333d2b36SAndroid Build Coastguard Worker 139*333d2b36SAndroid Build Coastguard Worker return strings.TrimSpace(string(bytes)) 140*333d2b36SAndroid Build Coastguard Worker } 141*333d2b36SAndroid Build Coastguard Worker 142*333d2b36SAndroid Build Coastguard Worker sdkVersion := xcrun("--show-sdk-version") 143*333d2b36SAndroid Build Coastguard Worker sdkVersionSupported := false 144*333d2b36SAndroid Build Coastguard Worker for _, version := range darwinSupportedSdkVersions { 145*333d2b36SAndroid Build Coastguard Worker if version == sdkVersion || strings.HasPrefix(sdkVersion, version+".") { 146*333d2b36SAndroid Build Coastguard Worker sdkVersionSupported = true 147*333d2b36SAndroid Build Coastguard Worker } 148*333d2b36SAndroid Build Coastguard Worker } 149*333d2b36SAndroid Build Coastguard Worker if !sdkVersionSupported { 150*333d2b36SAndroid Build Coastguard Worker macTools.err = fmt.Errorf("Unsupported macOS SDK version %q not in %v", sdkVersion, darwinSupportedSdkVersions) 151*333d2b36SAndroid Build Coastguard Worker return 152*333d2b36SAndroid Build Coastguard Worker } 153*333d2b36SAndroid Build Coastguard Worker 154*333d2b36SAndroid Build Coastguard Worker macTools.sdkRoot = xcrun("--show-sdk-path") 155*333d2b36SAndroid Build Coastguard Worker 156*333d2b36SAndroid Build Coastguard Worker macTools.arPath = xcrun("--find", "ar") 157*333d2b36SAndroid Build Coastguard Worker macTools.lipoPath = xcrun("--find", "lipo") 158*333d2b36SAndroid Build Coastguard Worker macTools.stripPath = xcrun("--find", "strip") 159*333d2b36SAndroid Build Coastguard Worker macTools.toolPath = filepath.Dir(xcrun("--find", "ld")) 160*333d2b36SAndroid Build Coastguard Worker }) 161*333d2b36SAndroid Build Coastguard Worker if macTools.err != nil { 162*333d2b36SAndroid Build Coastguard Worker android.ReportPathErrorf(ctx, "%q", macTools.err) 163*333d2b36SAndroid Build Coastguard Worker } 164*333d2b36SAndroid Build Coastguard Worker return macTools 165*333d2b36SAndroid Build Coastguard Worker} 166*333d2b36SAndroid Build Coastguard Worker 167*333d2b36SAndroid Build Coastguard Workertype toolchainDarwin struct { 168*333d2b36SAndroid Build Coastguard Worker cFlags, ldFlags string 169*333d2b36SAndroid Build Coastguard Worker toolchain64Bit 170*333d2b36SAndroid Build Coastguard Worker toolchainNoCrt 171*333d2b36SAndroid Build Coastguard Worker toolchainBase 172*333d2b36SAndroid Build Coastguard Worker} 173*333d2b36SAndroid Build Coastguard Worker 174*333d2b36SAndroid Build Coastguard Workertype toolchainDarwinX86 struct { 175*333d2b36SAndroid Build Coastguard Worker toolchainDarwin 176*333d2b36SAndroid Build Coastguard Worker} 177*333d2b36SAndroid Build Coastguard Worker 178*333d2b36SAndroid Build Coastguard Workertype toolchainDarwinArm struct { 179*333d2b36SAndroid Build Coastguard Worker toolchainDarwin 180*333d2b36SAndroid Build Coastguard Worker} 181*333d2b36SAndroid Build Coastguard Worker 182*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainDarwinArm) Name() string { 183*333d2b36SAndroid Build Coastguard Worker return "arm64" 184*333d2b36SAndroid Build Coastguard Worker} 185*333d2b36SAndroid Build Coastguard Worker 186*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainDarwinX86) Name() string { 187*333d2b36SAndroid Build Coastguard Worker return "x86_64" 188*333d2b36SAndroid Build Coastguard Worker} 189*333d2b36SAndroid Build Coastguard Worker 190*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainDarwin) IncludeFlags() string { 191*333d2b36SAndroid Build Coastguard Worker return "" 192*333d2b36SAndroid Build Coastguard Worker} 193*333d2b36SAndroid Build Coastguard Worker 194*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainDarwinArm) ClangTriple() string { 195*333d2b36SAndroid Build Coastguard Worker return "aarch64-apple-darwin" 196*333d2b36SAndroid Build Coastguard Worker} 197*333d2b36SAndroid Build Coastguard Worker 198*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainDarwinX86) ClangTriple() string { 199*333d2b36SAndroid Build Coastguard Worker return "x86_64-apple-darwin" 200*333d2b36SAndroid Build Coastguard Worker} 201*333d2b36SAndroid Build Coastguard Worker 202*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainDarwin) Cflags() string { 203*333d2b36SAndroid Build Coastguard Worker return "${config.DarwinCflags}" 204*333d2b36SAndroid Build Coastguard Worker} 205*333d2b36SAndroid Build Coastguard Worker 206*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainDarwin) Cppflags() string { 207*333d2b36SAndroid Build Coastguard Worker return "" 208*333d2b36SAndroid Build Coastguard Worker} 209*333d2b36SAndroid Build Coastguard Worker 210*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainDarwin) Ldflags() string { 211*333d2b36SAndroid Build Coastguard Worker return "${config.DarwinLdflags}" 212*333d2b36SAndroid Build Coastguard Worker} 213*333d2b36SAndroid Build Coastguard Worker 214*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainDarwin) Lldflags() string { 215*333d2b36SAndroid Build Coastguard Worker return "${config.DarwinLldflags}" 216*333d2b36SAndroid Build Coastguard Worker} 217*333d2b36SAndroid Build Coastguard Worker 218*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainDarwin) YasmFlags() string { 219*333d2b36SAndroid Build Coastguard Worker return "${config.DarwinYasmFlags}" 220*333d2b36SAndroid Build Coastguard Worker} 221*333d2b36SAndroid Build Coastguard Worker 222*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainDarwin) ShlibSuffix() string { 223*333d2b36SAndroid Build Coastguard Worker return ".dylib" 224*333d2b36SAndroid Build Coastguard Worker} 225*333d2b36SAndroid Build Coastguard Worker 226*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainDarwin) ExecutableSuffix() string { 227*333d2b36SAndroid Build Coastguard Worker return "" 228*333d2b36SAndroid Build Coastguard Worker} 229*333d2b36SAndroid Build Coastguard Worker 230*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainDarwin) AvailableLibraries() []string { 231*333d2b36SAndroid Build Coastguard Worker return darwinAvailableLibraries 232*333d2b36SAndroid Build Coastguard Worker} 233*333d2b36SAndroid Build Coastguard Worker 234*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainDarwin) ToolchainCflags() string { 235*333d2b36SAndroid Build Coastguard Worker return "-B${config.MacToolPath}" 236*333d2b36SAndroid Build Coastguard Worker} 237*333d2b36SAndroid Build Coastguard Worker 238*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainDarwin) ToolchainLdflags() string { 239*333d2b36SAndroid Build Coastguard Worker return "-B${config.MacToolPath}" 240*333d2b36SAndroid Build Coastguard Worker} 241*333d2b36SAndroid Build Coastguard Worker 242*333d2b36SAndroid Build Coastguard Workervar toolchainDarwinArmSingleton Toolchain = &toolchainDarwinArm{} 243*333d2b36SAndroid Build Coastguard Workervar toolchainDarwinX86Singleton Toolchain = &toolchainDarwinX86{} 244*333d2b36SAndroid Build Coastguard Worker 245*333d2b36SAndroid Build Coastguard Workerfunc darwinArmToolchainFactory(arch android.Arch) Toolchain { 246*333d2b36SAndroid Build Coastguard Worker return toolchainDarwinArmSingleton 247*333d2b36SAndroid Build Coastguard Worker} 248*333d2b36SAndroid Build Coastguard Worker 249*333d2b36SAndroid Build Coastguard Workerfunc darwinX86ToolchainFactory(arch android.Arch) Toolchain { 250*333d2b36SAndroid Build Coastguard Worker return toolchainDarwinX86Singleton 251*333d2b36SAndroid Build Coastguard Worker} 252*333d2b36SAndroid Build Coastguard Worker 253*333d2b36SAndroid Build Coastguard Workerfunc init() { 254*333d2b36SAndroid Build Coastguard Worker registerToolchainFactory(android.Darwin, android.Arm64, darwinArmToolchainFactory) 255*333d2b36SAndroid Build Coastguard Worker registerToolchainFactory(android.Darwin, android.X86_64, darwinX86ToolchainFactory) 256*333d2b36SAndroid Build Coastguard Worker} 257