xref: /aosp_15_r20/build/soong/rust/config/toolchain.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2019 The Android Open Source Project
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	"android/soong/android"
19*333d2b36SAndroid Build Coastguard Worker)
20*333d2b36SAndroid Build Coastguard Worker
21*333d2b36SAndroid Build Coastguard Workertype Toolchain interface {
22*333d2b36SAndroid Build Coastguard Worker	RustTriple() string
23*333d2b36SAndroid Build Coastguard Worker	ToolchainRustFlags() string
24*333d2b36SAndroid Build Coastguard Worker	ToolchainLinkFlags() string
25*333d2b36SAndroid Build Coastguard Worker
26*333d2b36SAndroid Build Coastguard Worker	SharedLibSuffix() string
27*333d2b36SAndroid Build Coastguard Worker	StaticLibSuffix() string
28*333d2b36SAndroid Build Coastguard Worker	RlibSuffix() string
29*333d2b36SAndroid Build Coastguard Worker	DylibSuffix() string
30*333d2b36SAndroid Build Coastguard Worker	ProcMacroSuffix() string
31*333d2b36SAndroid Build Coastguard Worker	ExecutableSuffix() string
32*333d2b36SAndroid Build Coastguard Worker
33*333d2b36SAndroid Build Coastguard Worker	Is64Bit() bool
34*333d2b36SAndroid Build Coastguard Worker	Supported() bool
35*333d2b36SAndroid Build Coastguard Worker
36*333d2b36SAndroid Build Coastguard Worker	Bionic() bool
37*333d2b36SAndroid Build Coastguard Worker
38*333d2b36SAndroid Build Coastguard Worker	LibclangRuntimeLibraryArch() string
39*333d2b36SAndroid Build Coastguard Worker}
40*333d2b36SAndroid Build Coastguard Worker
41*333d2b36SAndroid Build Coastguard Workertype toolchainBase struct {
42*333d2b36SAndroid Build Coastguard Worker}
43*333d2b36SAndroid Build Coastguard Worker
44*333d2b36SAndroid Build Coastguard Workerfunc (toolchainBase) RustTriple() string {
45*333d2b36SAndroid Build Coastguard Worker	panic("toolchainBase does not define a triple.")
46*333d2b36SAndroid Build Coastguard Worker}
47*333d2b36SAndroid Build Coastguard Worker
48*333d2b36SAndroid Build Coastguard Workerfunc (toolchainBase) ToolchainRustFlags() string {
49*333d2b36SAndroid Build Coastguard Worker	panic("toolchainBase does not provide rust flags.")
50*333d2b36SAndroid Build Coastguard Worker}
51*333d2b36SAndroid Build Coastguard Worker
52*333d2b36SAndroid Build Coastguard Workerfunc (toolchainBase) ToolchainLinkFlags() string {
53*333d2b36SAndroid Build Coastguard Worker	panic("toolchainBase does not provide link flags.")
54*333d2b36SAndroid Build Coastguard Worker}
55*333d2b36SAndroid Build Coastguard Worker
56*333d2b36SAndroid Build Coastguard Workerfunc (toolchainBase) Is64Bit() bool {
57*333d2b36SAndroid Build Coastguard Worker	panic("toolchainBase cannot determine datapath width.")
58*333d2b36SAndroid Build Coastguard Worker}
59*333d2b36SAndroid Build Coastguard Worker
60*333d2b36SAndroid Build Coastguard Workerfunc (toolchainBase) Bionic() bool {
61*333d2b36SAndroid Build Coastguard Worker	return true
62*333d2b36SAndroid Build Coastguard Worker}
63*333d2b36SAndroid Build Coastguard Worker
64*333d2b36SAndroid Build Coastguard Workertype toolchain64Bit struct {
65*333d2b36SAndroid Build Coastguard Worker	toolchainBase
66*333d2b36SAndroid Build Coastguard Worker}
67*333d2b36SAndroid Build Coastguard Worker
68*333d2b36SAndroid Build Coastguard Workerfunc (toolchain64Bit) Is64Bit() bool {
69*333d2b36SAndroid Build Coastguard Worker	return true
70*333d2b36SAndroid Build Coastguard Worker}
71*333d2b36SAndroid Build Coastguard Worker
72*333d2b36SAndroid Build Coastguard Workertype toolchain32Bit struct {
73*333d2b36SAndroid Build Coastguard Worker	toolchainBase
74*333d2b36SAndroid Build Coastguard Worker}
75*333d2b36SAndroid Build Coastguard Worker
76*333d2b36SAndroid Build Coastguard Workerfunc (toolchain32Bit) Is64Bit() bool {
77*333d2b36SAndroid Build Coastguard Worker	return false
78*333d2b36SAndroid Build Coastguard Worker}
79*333d2b36SAndroid Build Coastguard Worker
80*333d2b36SAndroid Build Coastguard Workerfunc (toolchain32Bit) Bionic() bool {
81*333d2b36SAndroid Build Coastguard Worker	return true
82*333d2b36SAndroid Build Coastguard Worker}
83*333d2b36SAndroid Build Coastguard Worker
84*333d2b36SAndroid Build Coastguard Workerfunc (toolchainBase) ExecutableSuffix() string {
85*333d2b36SAndroid Build Coastguard Worker	return ""
86*333d2b36SAndroid Build Coastguard Worker}
87*333d2b36SAndroid Build Coastguard Worker
88*333d2b36SAndroid Build Coastguard Workerfunc (toolchainBase) SharedLibSuffix() string {
89*333d2b36SAndroid Build Coastguard Worker	return ".so"
90*333d2b36SAndroid Build Coastguard Worker}
91*333d2b36SAndroid Build Coastguard Worker
92*333d2b36SAndroid Build Coastguard Workerfunc (toolchainBase) StaticLibSuffix() string {
93*333d2b36SAndroid Build Coastguard Worker	return ".a"
94*333d2b36SAndroid Build Coastguard Worker}
95*333d2b36SAndroid Build Coastguard Worker
96*333d2b36SAndroid Build Coastguard Workerfunc (toolchainBase) RlibSuffix() string {
97*333d2b36SAndroid Build Coastguard Worker	return ".rlib"
98*333d2b36SAndroid Build Coastguard Worker}
99*333d2b36SAndroid Build Coastguard Workerfunc (toolchainBase) DylibSuffix() string {
100*333d2b36SAndroid Build Coastguard Worker	return ".dylib.so"
101*333d2b36SAndroid Build Coastguard Worker}
102*333d2b36SAndroid Build Coastguard Worker
103*333d2b36SAndroid Build Coastguard Workerfunc (toolchainBase) ProcMacroSuffix() string {
104*333d2b36SAndroid Build Coastguard Worker	return ".so"
105*333d2b36SAndroid Build Coastguard Worker}
106*333d2b36SAndroid Build Coastguard Worker
107*333d2b36SAndroid Build Coastguard Workerfunc (toolchainBase) Supported() bool {
108*333d2b36SAndroid Build Coastguard Worker	return false
109*333d2b36SAndroid Build Coastguard Worker}
110*333d2b36SAndroid Build Coastguard Worker
111*333d2b36SAndroid Build Coastguard Workerfunc (toolchainBase) LibclangRuntimeLibraryArch() string {
112*333d2b36SAndroid Build Coastguard Worker	return ""
113*333d2b36SAndroid Build Coastguard Worker}
114*333d2b36SAndroid Build Coastguard Worker
115*333d2b36SAndroid Build Coastguard Workerfunc BuiltinsRuntimeLibrary(t Toolchain) string {
116*333d2b36SAndroid Build Coastguard Worker	return LibclangRuntimeLibrary(t, "builtins")
117*333d2b36SAndroid Build Coastguard Worker}
118*333d2b36SAndroid Build Coastguard Worker
119*333d2b36SAndroid Build Coastguard Workerfunc LibFuzzerRuntimeLibrary(t Toolchain) string {
120*333d2b36SAndroid Build Coastguard Worker	return LibclangRuntimeLibrary(t, "fuzzer")
121*333d2b36SAndroid Build Coastguard Worker}
122*333d2b36SAndroid Build Coastguard Worker
123*333d2b36SAndroid Build Coastguard Workerfunc LibclangRuntimeLibrary(t Toolchain, library string) string {
124*333d2b36SAndroid Build Coastguard Worker	return "libclang_rt." + library
125*333d2b36SAndroid Build Coastguard Worker}
126*333d2b36SAndroid Build Coastguard Worker
127*333d2b36SAndroid Build Coastguard Workerfunc LibRustRuntimeLibrary(t Toolchain, library string) string {
128*333d2b36SAndroid Build Coastguard Worker	arch := t.LibclangRuntimeLibraryArch()
129*333d2b36SAndroid Build Coastguard Worker	if arch == "" {
130*333d2b36SAndroid Build Coastguard Worker		return ""
131*333d2b36SAndroid Build Coastguard Worker	}
132*333d2b36SAndroid Build Coastguard Worker	if !t.Bionic() {
133*333d2b36SAndroid Build Coastguard Worker		return "librustc_rt." + library + "-" + arch
134*333d2b36SAndroid Build Coastguard Worker	}
135*333d2b36SAndroid Build Coastguard Worker	return "librustc_rt." + library + "-" + arch + "-android"
136*333d2b36SAndroid Build Coastguard Worker}
137*333d2b36SAndroid Build Coastguard Worker
138*333d2b36SAndroid Build Coastguard Workerfunc toolchainBaseFactory() Toolchain {
139*333d2b36SAndroid Build Coastguard Worker	return &toolchainBase{}
140*333d2b36SAndroid Build Coastguard Worker}
141*333d2b36SAndroid Build Coastguard Worker
142*333d2b36SAndroid Build Coastguard Workertype toolchainFactory func(arch android.Arch) Toolchain
143*333d2b36SAndroid Build Coastguard Worker
144*333d2b36SAndroid Build Coastguard Workervar toolchainFactories = make(map[android.OsType]map[android.ArchType]toolchainFactory)
145*333d2b36SAndroid Build Coastguard Worker
146*333d2b36SAndroid Build Coastguard Workerfunc registerToolchainFactory(os android.OsType, arch android.ArchType, factory toolchainFactory) {
147*333d2b36SAndroid Build Coastguard Worker	if toolchainFactories[os] == nil {
148*333d2b36SAndroid Build Coastguard Worker		toolchainFactories[os] = make(map[android.ArchType]toolchainFactory)
149*333d2b36SAndroid Build Coastguard Worker	}
150*333d2b36SAndroid Build Coastguard Worker	toolchainFactories[os][arch] = factory
151*333d2b36SAndroid Build Coastguard Worker}
152*333d2b36SAndroid Build Coastguard Worker
153*333d2b36SAndroid Build Coastguard Workerfunc FindToolchain(os android.OsType, arch android.Arch) Toolchain {
154*333d2b36SAndroid Build Coastguard Worker	factory := toolchainFactories[os][arch.ArchType]
155*333d2b36SAndroid Build Coastguard Worker	if factory == nil {
156*333d2b36SAndroid Build Coastguard Worker		return toolchainBaseFactory()
157*333d2b36SAndroid Build Coastguard Worker	}
158*333d2b36SAndroid Build Coastguard Worker	return factory(arch)
159*333d2b36SAndroid Build Coastguard Worker}
160