xref: /aosp_15_r20/build/soong/cc/config/toolchain.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2015 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	"strings"
20*333d2b36SAndroid Build Coastguard Worker
21*333d2b36SAndroid Build Coastguard Worker	"android/soong/android"
22*333d2b36SAndroid Build Coastguard Worker)
23*333d2b36SAndroid Build Coastguard Worker
24*333d2b36SAndroid Build Coastguard Workerfunc init() {
25*333d2b36SAndroid Build Coastguard Worker	pctx.StaticVariable("DarwinAvailableLibraries", strings.Join(darwinAvailableLibraries, " "))
26*333d2b36SAndroid Build Coastguard Worker	pctx.StaticVariable("LinuxAvailableLibraries", strings.Join(linuxAvailableLibraries, " "))
27*333d2b36SAndroid Build Coastguard Worker	pctx.StaticVariable("WindowsAvailableLibraries", strings.Join(windowsAvailableLibraries, " "))
28*333d2b36SAndroid Build Coastguard Worker}
29*333d2b36SAndroid Build Coastguard Worker
30*333d2b36SAndroid Build Coastguard Workertype toolchainFactory func(arch android.Arch) Toolchain
31*333d2b36SAndroid Build Coastguard Worker
32*333d2b36SAndroid Build Coastguard Workervar toolchainFactories = make(map[android.OsType]map[android.ArchType]toolchainFactory)
33*333d2b36SAndroid Build Coastguard Worker
34*333d2b36SAndroid Build Coastguard Workerfunc registerToolchainFactory(os android.OsType, arch android.ArchType, factory toolchainFactory) {
35*333d2b36SAndroid Build Coastguard Worker	if toolchainFactories[os] == nil {
36*333d2b36SAndroid Build Coastguard Worker		toolchainFactories[os] = make(map[android.ArchType]toolchainFactory)
37*333d2b36SAndroid Build Coastguard Worker	}
38*333d2b36SAndroid Build Coastguard Worker	toolchainFactories[os][arch] = factory
39*333d2b36SAndroid Build Coastguard Worker}
40*333d2b36SAndroid Build Coastguard Worker
41*333d2b36SAndroid Build Coastguard Workertype toolchainContext interface {
42*333d2b36SAndroid Build Coastguard Worker	Os() android.OsType
43*333d2b36SAndroid Build Coastguard Worker	Arch() android.Arch
44*333d2b36SAndroid Build Coastguard Worker}
45*333d2b36SAndroid Build Coastguard Worker
46*333d2b36SAndroid Build Coastguard Workerfunc FindToolchainWithContext(ctx toolchainContext) Toolchain {
47*333d2b36SAndroid Build Coastguard Worker	t, err := findToolchain(ctx.Os(), ctx.Arch())
48*333d2b36SAndroid Build Coastguard Worker	if err != nil {
49*333d2b36SAndroid Build Coastguard Worker		panic(err)
50*333d2b36SAndroid Build Coastguard Worker	}
51*333d2b36SAndroid Build Coastguard Worker	return t
52*333d2b36SAndroid Build Coastguard Worker}
53*333d2b36SAndroid Build Coastguard Worker
54*333d2b36SAndroid Build Coastguard Workerfunc FindToolchain(os android.OsType, arch android.Arch) Toolchain {
55*333d2b36SAndroid Build Coastguard Worker	t, err := findToolchain(os, arch)
56*333d2b36SAndroid Build Coastguard Worker	if err != nil {
57*333d2b36SAndroid Build Coastguard Worker		panic(err)
58*333d2b36SAndroid Build Coastguard Worker	}
59*333d2b36SAndroid Build Coastguard Worker	return t
60*333d2b36SAndroid Build Coastguard Worker}
61*333d2b36SAndroid Build Coastguard Worker
62*333d2b36SAndroid Build Coastguard Workerfunc findToolchain(os android.OsType, arch android.Arch) (Toolchain, error) {
63*333d2b36SAndroid Build Coastguard Worker	factory := toolchainFactories[os][arch.ArchType]
64*333d2b36SAndroid Build Coastguard Worker	if factory == nil {
65*333d2b36SAndroid Build Coastguard Worker		return nil, fmt.Errorf("Toolchain not found for %s arch %q", os.String(), arch.String())
66*333d2b36SAndroid Build Coastguard Worker	}
67*333d2b36SAndroid Build Coastguard Worker	return factory(arch), nil
68*333d2b36SAndroid Build Coastguard Worker}
69*333d2b36SAndroid Build Coastguard Worker
70*333d2b36SAndroid Build Coastguard Workertype Toolchain interface {
71*333d2b36SAndroid Build Coastguard Worker	Name() string
72*333d2b36SAndroid Build Coastguard Worker
73*333d2b36SAndroid Build Coastguard Worker	IncludeFlags() string
74*333d2b36SAndroid Build Coastguard Worker
75*333d2b36SAndroid Build Coastguard Worker	ClangTriple() string
76*333d2b36SAndroid Build Coastguard Worker	ToolchainCflags() string
77*333d2b36SAndroid Build Coastguard Worker	ToolchainLdflags() string
78*333d2b36SAndroid Build Coastguard Worker	Asflags() string
79*333d2b36SAndroid Build Coastguard Worker	Cflags() string
80*333d2b36SAndroid Build Coastguard Worker	Cppflags() string
81*333d2b36SAndroid Build Coastguard Worker	Ldflags() string
82*333d2b36SAndroid Build Coastguard Worker	Lldflags() string
83*333d2b36SAndroid Build Coastguard Worker	InstructionSetFlags(string) (string, error)
84*333d2b36SAndroid Build Coastguard Worker
85*333d2b36SAndroid Build Coastguard Worker	ndkTriple() string
86*333d2b36SAndroid Build Coastguard Worker
87*333d2b36SAndroid Build Coastguard Worker	YasmFlags() string
88*333d2b36SAndroid Build Coastguard Worker
89*333d2b36SAndroid Build Coastguard Worker	Is64Bit() bool
90*333d2b36SAndroid Build Coastguard Worker
91*333d2b36SAndroid Build Coastguard Worker	ShlibSuffix() string
92*333d2b36SAndroid Build Coastguard Worker	ExecutableSuffix() string
93*333d2b36SAndroid Build Coastguard Worker
94*333d2b36SAndroid Build Coastguard Worker	LibclangRuntimeLibraryArch() string
95*333d2b36SAndroid Build Coastguard Worker
96*333d2b36SAndroid Build Coastguard Worker	AvailableLibraries() []string
97*333d2b36SAndroid Build Coastguard Worker
98*333d2b36SAndroid Build Coastguard Worker	CrtBeginStaticBinary() []string
99*333d2b36SAndroid Build Coastguard Worker	CrtBeginSharedBinary() []string
100*333d2b36SAndroid Build Coastguard Worker	CrtBeginSharedLibrary() []string
101*333d2b36SAndroid Build Coastguard Worker	CrtEndStaticBinary() []string
102*333d2b36SAndroid Build Coastguard Worker	CrtEndSharedBinary() []string
103*333d2b36SAndroid Build Coastguard Worker	CrtEndSharedLibrary() []string
104*333d2b36SAndroid Build Coastguard Worker	CrtPadSegmentSharedLibrary() []string
105*333d2b36SAndroid Build Coastguard Worker
106*333d2b36SAndroid Build Coastguard Worker	// DefaultSharedLibraries returns the list of shared libraries that will be added to all
107*333d2b36SAndroid Build Coastguard Worker	// targets unless they explicitly specify system_shared_libs.
108*333d2b36SAndroid Build Coastguard Worker	DefaultSharedLibraries() []string
109*333d2b36SAndroid Build Coastguard Worker
110*333d2b36SAndroid Build Coastguard Worker	Bionic() bool
111*333d2b36SAndroid Build Coastguard Worker	Glibc() bool
112*333d2b36SAndroid Build Coastguard Worker	Musl() bool
113*333d2b36SAndroid Build Coastguard Worker}
114*333d2b36SAndroid Build Coastguard Worker
115*333d2b36SAndroid Build Coastguard Workertype toolchainBase struct {
116*333d2b36SAndroid Build Coastguard Worker}
117*333d2b36SAndroid Build Coastguard Worker
118*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainBase) ndkTriple() string {
119*333d2b36SAndroid Build Coastguard Worker	return ""
120*333d2b36SAndroid Build Coastguard Worker}
121*333d2b36SAndroid Build Coastguard Worker
122*333d2b36SAndroid Build Coastguard Workerfunc NDKTriple(toolchain Toolchain) string {
123*333d2b36SAndroid Build Coastguard Worker	triple := toolchain.ndkTriple()
124*333d2b36SAndroid Build Coastguard Worker	if triple == "" {
125*333d2b36SAndroid Build Coastguard Worker		// Use the clang triple if there is no explicit NDK triple
126*333d2b36SAndroid Build Coastguard Worker		triple = toolchain.ClangTriple()
127*333d2b36SAndroid Build Coastguard Worker	}
128*333d2b36SAndroid Build Coastguard Worker	return triple
129*333d2b36SAndroid Build Coastguard Worker}
130*333d2b36SAndroid Build Coastguard Worker
131*333d2b36SAndroid Build Coastguard Workerfunc (toolchainBase) InstructionSetFlags(s string) (string, error) {
132*333d2b36SAndroid Build Coastguard Worker	if s != "" {
133*333d2b36SAndroid Build Coastguard Worker		return "", fmt.Errorf("instruction_set: %s is not a supported instruction set", s)
134*333d2b36SAndroid Build Coastguard Worker	}
135*333d2b36SAndroid Build Coastguard Worker	return "", nil
136*333d2b36SAndroid Build Coastguard Worker}
137*333d2b36SAndroid Build Coastguard Worker
138*333d2b36SAndroid Build Coastguard Workerfunc (toolchainBase) ToolchainCflags() string {
139*333d2b36SAndroid Build Coastguard Worker	return ""
140*333d2b36SAndroid Build Coastguard Worker}
141*333d2b36SAndroid Build Coastguard Worker
142*333d2b36SAndroid Build Coastguard Workerfunc (toolchainBase) ToolchainLdflags() string {
143*333d2b36SAndroid Build Coastguard Worker	return ""
144*333d2b36SAndroid Build Coastguard Worker}
145*333d2b36SAndroid Build Coastguard Worker
146*333d2b36SAndroid Build Coastguard Workerfunc (toolchainBase) Asflags() string {
147*333d2b36SAndroid Build Coastguard Worker	return ""
148*333d2b36SAndroid Build Coastguard Worker}
149*333d2b36SAndroid Build Coastguard Worker
150*333d2b36SAndroid Build Coastguard Workerfunc (toolchainBase) YasmFlags() string {
151*333d2b36SAndroid Build Coastguard Worker	return ""
152*333d2b36SAndroid Build Coastguard Worker}
153*333d2b36SAndroid Build Coastguard Worker
154*333d2b36SAndroid Build Coastguard Workerfunc (toolchainBase) LibclangRuntimeLibraryArch() string {
155*333d2b36SAndroid Build Coastguard Worker	return ""
156*333d2b36SAndroid Build Coastguard Worker}
157*333d2b36SAndroid Build Coastguard Worker
158*333d2b36SAndroid Build Coastguard Workertype toolchainNoCrt struct{}
159*333d2b36SAndroid Build Coastguard Worker
160*333d2b36SAndroid Build Coastguard Workerfunc (toolchainNoCrt) CrtBeginStaticBinary() []string       { return nil }
161*333d2b36SAndroid Build Coastguard Workerfunc (toolchainNoCrt) CrtBeginSharedBinary() []string       { return nil }
162*333d2b36SAndroid Build Coastguard Workerfunc (toolchainNoCrt) CrtBeginSharedLibrary() []string      { return nil }
163*333d2b36SAndroid Build Coastguard Workerfunc (toolchainNoCrt) CrtEndStaticBinary() []string         { return nil }
164*333d2b36SAndroid Build Coastguard Workerfunc (toolchainNoCrt) CrtEndSharedBinary() []string         { return nil }
165*333d2b36SAndroid Build Coastguard Workerfunc (toolchainNoCrt) CrtEndSharedLibrary() []string        { return nil }
166*333d2b36SAndroid Build Coastguard Workerfunc (toolchainNoCrt) CrtPadSegmentSharedLibrary() []string { return nil }
167*333d2b36SAndroid Build Coastguard Worker
168*333d2b36SAndroid Build Coastguard Workerfunc (toolchainBase) DefaultSharedLibraries() []string {
169*333d2b36SAndroid Build Coastguard Worker	return nil
170*333d2b36SAndroid Build Coastguard Worker}
171*333d2b36SAndroid Build Coastguard Worker
172*333d2b36SAndroid Build Coastguard Workerfunc (toolchainBase) Bionic() bool {
173*333d2b36SAndroid Build Coastguard Worker	return false
174*333d2b36SAndroid Build Coastguard Worker}
175*333d2b36SAndroid Build Coastguard Worker
176*333d2b36SAndroid Build Coastguard Workerfunc (toolchainBase) Glibc() bool {
177*333d2b36SAndroid Build Coastguard Worker	return false
178*333d2b36SAndroid Build Coastguard Worker}
179*333d2b36SAndroid Build Coastguard Worker
180*333d2b36SAndroid Build Coastguard Workerfunc (toolchainBase) Musl() bool {
181*333d2b36SAndroid Build Coastguard Worker	return false
182*333d2b36SAndroid Build Coastguard Worker}
183*333d2b36SAndroid Build Coastguard Worker
184*333d2b36SAndroid Build Coastguard Workertype toolchain64Bit struct {
185*333d2b36SAndroid Build Coastguard Worker}
186*333d2b36SAndroid Build Coastguard Worker
187*333d2b36SAndroid Build Coastguard Workerfunc (toolchain64Bit) Is64Bit() bool {
188*333d2b36SAndroid Build Coastguard Worker	return true
189*333d2b36SAndroid Build Coastguard Worker}
190*333d2b36SAndroid Build Coastguard Worker
191*333d2b36SAndroid Build Coastguard Workertype toolchain32Bit struct {
192*333d2b36SAndroid Build Coastguard Worker}
193*333d2b36SAndroid Build Coastguard Worker
194*333d2b36SAndroid Build Coastguard Workerfunc (toolchain32Bit) Is64Bit() bool {
195*333d2b36SAndroid Build Coastguard Worker	return false
196*333d2b36SAndroid Build Coastguard Worker}
197*333d2b36SAndroid Build Coastguard Worker
198*333d2b36SAndroid Build Coastguard Workerfunc variantOrDefault(variants map[string]string, choice string) string {
199*333d2b36SAndroid Build Coastguard Worker	if ret, ok := variants[choice]; ok {
200*333d2b36SAndroid Build Coastguard Worker		return ret
201*333d2b36SAndroid Build Coastguard Worker	}
202*333d2b36SAndroid Build Coastguard Worker	return variants[""]
203*333d2b36SAndroid Build Coastguard Worker}
204*333d2b36SAndroid Build Coastguard Worker
205*333d2b36SAndroid Build Coastguard Workerfunc addPrefix(list []string, prefix string) []string {
206*333d2b36SAndroid Build Coastguard Worker	for i := range list {
207*333d2b36SAndroid Build Coastguard Worker		list[i] = prefix + list[i]
208*333d2b36SAndroid Build Coastguard Worker	}
209*333d2b36SAndroid Build Coastguard Worker	return list
210*333d2b36SAndroid Build Coastguard Worker}
211*333d2b36SAndroid Build Coastguard Worker
212*333d2b36SAndroid Build Coastguard Workerfunc LibclangRuntimeLibrary(library string) string {
213*333d2b36SAndroid Build Coastguard Worker	return "libclang_rt." + library
214*333d2b36SAndroid Build Coastguard Worker}
215*333d2b36SAndroid Build Coastguard Worker
216*333d2b36SAndroid Build Coastguard Workerfunc BuiltinsRuntimeLibrary() string {
217*333d2b36SAndroid Build Coastguard Worker	return LibclangRuntimeLibrary("builtins")
218*333d2b36SAndroid Build Coastguard Worker}
219*333d2b36SAndroid Build Coastguard Worker
220*333d2b36SAndroid Build Coastguard Workerfunc AddressSanitizerRuntimeLibrary() string {
221*333d2b36SAndroid Build Coastguard Worker	return LibclangRuntimeLibrary("asan")
222*333d2b36SAndroid Build Coastguard Worker}
223*333d2b36SAndroid Build Coastguard Worker
224*333d2b36SAndroid Build Coastguard Workerfunc AddressSanitizerStaticRuntimeLibrary() string {
225*333d2b36SAndroid Build Coastguard Worker	return LibclangRuntimeLibrary("asan.static")
226*333d2b36SAndroid Build Coastguard Worker}
227*333d2b36SAndroid Build Coastguard Worker
228*333d2b36SAndroid Build Coastguard Workerfunc AddressSanitizerCXXStaticRuntimeLibrary() string {
229*333d2b36SAndroid Build Coastguard Worker	return LibclangRuntimeLibrary("asan_cxx.static")
230*333d2b36SAndroid Build Coastguard Worker}
231*333d2b36SAndroid Build Coastguard Worker
232*333d2b36SAndroid Build Coastguard Workerfunc HWAddressSanitizerRuntimeLibrary() string {
233*333d2b36SAndroid Build Coastguard Worker	return LibclangRuntimeLibrary("hwasan")
234*333d2b36SAndroid Build Coastguard Worker}
235*333d2b36SAndroid Build Coastguard Worker
236*333d2b36SAndroid Build Coastguard Workerfunc HWAddressSanitizerStaticLibrary() string {
237*333d2b36SAndroid Build Coastguard Worker	return LibclangRuntimeLibrary("hwasan_static")
238*333d2b36SAndroid Build Coastguard Worker}
239*333d2b36SAndroid Build Coastguard Worker
240*333d2b36SAndroid Build Coastguard Workerfunc UndefinedBehaviorSanitizerRuntimeLibrary() string {
241*333d2b36SAndroid Build Coastguard Worker	return LibclangRuntimeLibrary("ubsan_standalone")
242*333d2b36SAndroid Build Coastguard Worker}
243*333d2b36SAndroid Build Coastguard Worker
244*333d2b36SAndroid Build Coastguard Workerfunc UndefinedBehaviorSanitizerMinimalRuntimeLibrary() string {
245*333d2b36SAndroid Build Coastguard Worker	return LibclangRuntimeLibrary("ubsan_minimal")
246*333d2b36SAndroid Build Coastguard Worker}
247*333d2b36SAndroid Build Coastguard Worker
248*333d2b36SAndroid Build Coastguard Workerfunc ThreadSanitizerRuntimeLibrary() string {
249*333d2b36SAndroid Build Coastguard Worker	return LibclangRuntimeLibrary("tsan")
250*333d2b36SAndroid Build Coastguard Worker}
251*333d2b36SAndroid Build Coastguard Worker
252*333d2b36SAndroid Build Coastguard Workerfunc ScudoRuntimeLibrary() string {
253*333d2b36SAndroid Build Coastguard Worker	return LibclangRuntimeLibrary("scudo")
254*333d2b36SAndroid Build Coastguard Worker}
255*333d2b36SAndroid Build Coastguard Worker
256*333d2b36SAndroid Build Coastguard Workerfunc ScudoMinimalRuntimeLibrary() string {
257*333d2b36SAndroid Build Coastguard Worker	return LibclangRuntimeLibrary("scudo_minimal")
258*333d2b36SAndroid Build Coastguard Worker}
259*333d2b36SAndroid Build Coastguard Worker
260*333d2b36SAndroid Build Coastguard Workerfunc LibFuzzerRuntimeLibrary() string {
261*333d2b36SAndroid Build Coastguard Worker	return LibclangRuntimeLibrary("fuzzer")
262*333d2b36SAndroid Build Coastguard Worker}
263*333d2b36SAndroid Build Coastguard Worker
264*333d2b36SAndroid Build Coastguard Workerfunc LibFuzzerRuntimeInterceptors() string {
265*333d2b36SAndroid Build Coastguard Worker	return LibclangRuntimeLibrary("fuzzer_interceptors")
266*333d2b36SAndroid Build Coastguard Worker}
267