xref: /aosp_15_r20/build/soong/cc/config/darwin_host.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
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