xref: /aosp_15_r20/build/soong/rust/library.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 rust
16*333d2b36SAndroid Build Coastguard Worker
17*333d2b36SAndroid Build Coastguard Workerimport (
18*333d2b36SAndroid Build Coastguard Worker	"errors"
19*333d2b36SAndroid Build Coastguard Worker	"fmt"
20*333d2b36SAndroid Build Coastguard Worker	"regexp"
21*333d2b36SAndroid Build Coastguard Worker	"strings"
22*333d2b36SAndroid Build Coastguard Worker
23*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint"
24*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint/depset"
25*333d2b36SAndroid Build Coastguard Worker
26*333d2b36SAndroid Build Coastguard Worker	"android/soong/android"
27*333d2b36SAndroid Build Coastguard Worker	"android/soong/cc"
28*333d2b36SAndroid Build Coastguard Worker)
29*333d2b36SAndroid Build Coastguard Worker
30*333d2b36SAndroid Build Coastguard Workervar (
31*333d2b36SAndroid Build Coastguard Worker	RlibStdlibSuffix = ".rlib-std"
32*333d2b36SAndroid Build Coastguard Worker)
33*333d2b36SAndroid Build Coastguard Worker
34*333d2b36SAndroid Build Coastguard Workerfunc init() {
35*333d2b36SAndroid Build Coastguard Worker	android.RegisterModuleType("rust_library", RustLibraryFactory)
36*333d2b36SAndroid Build Coastguard Worker	android.RegisterModuleType("rust_library_dylib", RustLibraryDylibFactory)
37*333d2b36SAndroid Build Coastguard Worker	android.RegisterModuleType("rust_library_rlib", RustLibraryRlibFactory)
38*333d2b36SAndroid Build Coastguard Worker	android.RegisterModuleType("rust_library_host", RustLibraryHostFactory)
39*333d2b36SAndroid Build Coastguard Worker	android.RegisterModuleType("rust_library_host_dylib", RustLibraryDylibHostFactory)
40*333d2b36SAndroid Build Coastguard Worker	android.RegisterModuleType("rust_library_host_rlib", RustLibraryRlibHostFactory)
41*333d2b36SAndroid Build Coastguard Worker	android.RegisterModuleType("rust_ffi", RustFFIFactory)
42*333d2b36SAndroid Build Coastguard Worker	android.RegisterModuleType("rust_ffi_shared", RustFFISharedFactory)
43*333d2b36SAndroid Build Coastguard Worker	android.RegisterModuleType("rust_ffi_rlib", RustFFIRlibFactory)
44*333d2b36SAndroid Build Coastguard Worker	android.RegisterModuleType("rust_ffi_host", RustFFIHostFactory)
45*333d2b36SAndroid Build Coastguard Worker	android.RegisterModuleType("rust_ffi_host_shared", RustFFISharedHostFactory)
46*333d2b36SAndroid Build Coastguard Worker	android.RegisterModuleType("rust_ffi_host_rlib", RustFFIRlibHostFactory)
47*333d2b36SAndroid Build Coastguard Worker
48*333d2b36SAndroid Build Coastguard Worker	// TODO: Remove when all instances of rust_ffi_static have been switched to rust_ffi_rlib
49*333d2b36SAndroid Build Coastguard Worker	// Alias rust_ffi_static to the rust_ffi_rlib factory
50*333d2b36SAndroid Build Coastguard Worker	android.RegisterModuleType("rust_ffi_static", RustFFIRlibFactory)
51*333d2b36SAndroid Build Coastguard Worker	android.RegisterModuleType("rust_ffi_host_static", RustFFIRlibHostFactory)
52*333d2b36SAndroid Build Coastguard Worker}
53*333d2b36SAndroid Build Coastguard Worker
54*333d2b36SAndroid Build Coastguard Workertype VariantLibraryProperties struct {
55*333d2b36SAndroid Build Coastguard Worker	Enabled *bool    `android:"arch_variant"`
56*333d2b36SAndroid Build Coastguard Worker	Srcs    []string `android:"path,arch_variant"`
57*333d2b36SAndroid Build Coastguard Worker}
58*333d2b36SAndroid Build Coastguard Worker
59*333d2b36SAndroid Build Coastguard Workertype LibraryCompilerProperties struct {
60*333d2b36SAndroid Build Coastguard Worker	Rlib   VariantLibraryProperties `android:"arch_variant"`
61*333d2b36SAndroid Build Coastguard Worker	Dylib  VariantLibraryProperties `android:"arch_variant"`
62*333d2b36SAndroid Build Coastguard Worker	Shared VariantLibraryProperties `android:"arch_variant"`
63*333d2b36SAndroid Build Coastguard Worker	Static VariantLibraryProperties `android:"arch_variant"`
64*333d2b36SAndroid Build Coastguard Worker
65*333d2b36SAndroid Build Coastguard Worker	// TODO: Remove this when all instances of Include_dirs have been removed from rust_ffi modules.
66*333d2b36SAndroid Build Coastguard Worker	// path to include directories to pass to cc_* modules, only relevant for static/shared variants (deprecated, use export_include_dirs instead).
67*333d2b36SAndroid Build Coastguard Worker	Include_dirs []string `android:"path,arch_variant"`
68*333d2b36SAndroid Build Coastguard Worker
69*333d2b36SAndroid Build Coastguard Worker	// path to include directories to export to cc_* modules, only relevant for static/shared variants.
70*333d2b36SAndroid Build Coastguard Worker	Export_include_dirs []string `android:"path,arch_variant"`
71*333d2b36SAndroid Build Coastguard Worker
72*333d2b36SAndroid Build Coastguard Worker	// Whether this library is part of the Rust toolchain sysroot.
73*333d2b36SAndroid Build Coastguard Worker	Sysroot *bool
74*333d2b36SAndroid Build Coastguard Worker
75*333d2b36SAndroid Build Coastguard Worker	// Exclude this rust_ffi target from being included in APEXes.
76*333d2b36SAndroid Build Coastguard Worker	// TODO(b/362509506): remove this once stubs are properly supported by rust_ffi targets.
77*333d2b36SAndroid Build Coastguard Worker	Apex_exclude *bool
78*333d2b36SAndroid Build Coastguard Worker}
79*333d2b36SAndroid Build Coastguard Worker
80*333d2b36SAndroid Build Coastguard Workertype LibraryMutatedProperties struct {
81*333d2b36SAndroid Build Coastguard Worker	// Build a dylib variant
82*333d2b36SAndroid Build Coastguard Worker	BuildDylib bool `blueprint:"mutated"`
83*333d2b36SAndroid Build Coastguard Worker	// Build an rlib variant
84*333d2b36SAndroid Build Coastguard Worker	BuildRlib bool `blueprint:"mutated"`
85*333d2b36SAndroid Build Coastguard Worker	// Build a shared library variant
86*333d2b36SAndroid Build Coastguard Worker	BuildShared bool `blueprint:"mutated"`
87*333d2b36SAndroid Build Coastguard Worker	// Build a static library variant
88*333d2b36SAndroid Build Coastguard Worker	BuildStatic bool `blueprint:"mutated"`
89*333d2b36SAndroid Build Coastguard Worker
90*333d2b36SAndroid Build Coastguard Worker	// This variant is a dylib
91*333d2b36SAndroid Build Coastguard Worker	VariantIsDylib bool `blueprint:"mutated"`
92*333d2b36SAndroid Build Coastguard Worker	// This variant is an rlib
93*333d2b36SAndroid Build Coastguard Worker	VariantIsRlib bool `blueprint:"mutated"`
94*333d2b36SAndroid Build Coastguard Worker	// This variant is a shared library
95*333d2b36SAndroid Build Coastguard Worker	VariantIsShared bool `blueprint:"mutated"`
96*333d2b36SAndroid Build Coastguard Worker	// This variant is a source provider
97*333d2b36SAndroid Build Coastguard Worker	VariantIsSource bool `blueprint:"mutated"`
98*333d2b36SAndroid Build Coastguard Worker
99*333d2b36SAndroid Build Coastguard Worker	// This variant is disabled and should not be compiled
100*333d2b36SAndroid Build Coastguard Worker	// (used for SourceProvider variants that produce only source)
101*333d2b36SAndroid Build Coastguard Worker	VariantIsDisabled bool `blueprint:"mutated"`
102*333d2b36SAndroid Build Coastguard Worker
103*333d2b36SAndroid Build Coastguard Worker	// Whether this library variant should be link libstd via rlibs
104*333d2b36SAndroid Build Coastguard Worker	VariantIsStaticStd bool `blueprint:"mutated"`
105*333d2b36SAndroid Build Coastguard Worker}
106*333d2b36SAndroid Build Coastguard Worker
107*333d2b36SAndroid Build Coastguard Workertype libraryDecorator struct {
108*333d2b36SAndroid Build Coastguard Worker	*baseCompiler
109*333d2b36SAndroid Build Coastguard Worker	*flagExporter
110*333d2b36SAndroid Build Coastguard Worker	stripper Stripper
111*333d2b36SAndroid Build Coastguard Worker
112*333d2b36SAndroid Build Coastguard Worker	Properties        LibraryCompilerProperties
113*333d2b36SAndroid Build Coastguard Worker	MutatedProperties LibraryMutatedProperties
114*333d2b36SAndroid Build Coastguard Worker	includeDirs       android.Paths
115*333d2b36SAndroid Build Coastguard Worker	sourceProvider    SourceProvider
116*333d2b36SAndroid Build Coastguard Worker
117*333d2b36SAndroid Build Coastguard Worker	isFFI bool
118*333d2b36SAndroid Build Coastguard Worker
119*333d2b36SAndroid Build Coastguard Worker	// table-of-contents file for cdylib crates to optimize out relinking when possible
120*333d2b36SAndroid Build Coastguard Worker	tocFile android.OptionalPath
121*333d2b36SAndroid Build Coastguard Worker}
122*333d2b36SAndroid Build Coastguard Worker
123*333d2b36SAndroid Build Coastguard Workertype libraryInterface interface {
124*333d2b36SAndroid Build Coastguard Worker	rlib() bool
125*333d2b36SAndroid Build Coastguard Worker	dylib() bool
126*333d2b36SAndroid Build Coastguard Worker	static() bool
127*333d2b36SAndroid Build Coastguard Worker	shared() bool
128*333d2b36SAndroid Build Coastguard Worker	sysroot() bool
129*333d2b36SAndroid Build Coastguard Worker	source() bool
130*333d2b36SAndroid Build Coastguard Worker	apexExclude() bool
131*333d2b36SAndroid Build Coastguard Worker
132*333d2b36SAndroid Build Coastguard Worker	// Returns true if the build options for the module have selected a particular build type
133*333d2b36SAndroid Build Coastguard Worker	buildRlib() bool
134*333d2b36SAndroid Build Coastguard Worker	buildDylib() bool
135*333d2b36SAndroid Build Coastguard Worker	buildShared() bool
136*333d2b36SAndroid Build Coastguard Worker	buildStatic() bool
137*333d2b36SAndroid Build Coastguard Worker
138*333d2b36SAndroid Build Coastguard Worker	// Sets a particular variant type
139*333d2b36SAndroid Build Coastguard Worker	setRlib()
140*333d2b36SAndroid Build Coastguard Worker	setDylib()
141*333d2b36SAndroid Build Coastguard Worker	setShared()
142*333d2b36SAndroid Build Coastguard Worker	setStatic()
143*333d2b36SAndroid Build Coastguard Worker	setSource()
144*333d2b36SAndroid Build Coastguard Worker
145*333d2b36SAndroid Build Coastguard Worker	// libstd linkage functions
146*333d2b36SAndroid Build Coastguard Worker	rlibStd() bool
147*333d2b36SAndroid Build Coastguard Worker	setRlibStd()
148*333d2b36SAndroid Build Coastguard Worker	setDylibStd()
149*333d2b36SAndroid Build Coastguard Worker
150*333d2b36SAndroid Build Coastguard Worker	// Build a specific library variant
151*333d2b36SAndroid Build Coastguard Worker	BuildOnlyFFI()
152*333d2b36SAndroid Build Coastguard Worker	BuildOnlyRust()
153*333d2b36SAndroid Build Coastguard Worker	BuildOnlyRlib()
154*333d2b36SAndroid Build Coastguard Worker	BuildOnlyDylib()
155*333d2b36SAndroid Build Coastguard Worker	BuildOnlyStatic()
156*333d2b36SAndroid Build Coastguard Worker	BuildOnlyShared()
157*333d2b36SAndroid Build Coastguard Worker
158*333d2b36SAndroid Build Coastguard Worker	toc() android.OptionalPath
159*333d2b36SAndroid Build Coastguard Worker
160*333d2b36SAndroid Build Coastguard Worker	isFFILibrary() bool
161*333d2b36SAndroid Build Coastguard Worker}
162*333d2b36SAndroid Build Coastguard Worker
163*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) nativeCoverage() bool {
164*333d2b36SAndroid Build Coastguard Worker	return true
165*333d2b36SAndroid Build Coastguard Worker}
166*333d2b36SAndroid Build Coastguard Worker
167*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) toc() android.OptionalPath {
168*333d2b36SAndroid Build Coastguard Worker	return library.tocFile
169*333d2b36SAndroid Build Coastguard Worker}
170*333d2b36SAndroid Build Coastguard Worker
171*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) rlib() bool {
172*333d2b36SAndroid Build Coastguard Worker	return library.MutatedProperties.VariantIsRlib
173*333d2b36SAndroid Build Coastguard Worker}
174*333d2b36SAndroid Build Coastguard Worker
175*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) sysroot() bool {
176*333d2b36SAndroid Build Coastguard Worker	return Bool(library.Properties.Sysroot)
177*333d2b36SAndroid Build Coastguard Worker}
178*333d2b36SAndroid Build Coastguard Worker
179*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) dylib() bool {
180*333d2b36SAndroid Build Coastguard Worker	return library.MutatedProperties.VariantIsDylib
181*333d2b36SAndroid Build Coastguard Worker}
182*333d2b36SAndroid Build Coastguard Worker
183*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) shared() bool {
184*333d2b36SAndroid Build Coastguard Worker	return library.MutatedProperties.VariantIsShared
185*333d2b36SAndroid Build Coastguard Worker}
186*333d2b36SAndroid Build Coastguard Worker
187*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) static() bool {
188*333d2b36SAndroid Build Coastguard Worker	return false
189*333d2b36SAndroid Build Coastguard Worker}
190*333d2b36SAndroid Build Coastguard Worker
191*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) source() bool {
192*333d2b36SAndroid Build Coastguard Worker	return library.MutatedProperties.VariantIsSource
193*333d2b36SAndroid Build Coastguard Worker}
194*333d2b36SAndroid Build Coastguard Worker
195*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) apexExclude() bool {
196*333d2b36SAndroid Build Coastguard Worker	return Bool(library.Properties.Apex_exclude)
197*333d2b36SAndroid Build Coastguard Worker}
198*333d2b36SAndroid Build Coastguard Worker
199*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) buildRlib() bool {
200*333d2b36SAndroid Build Coastguard Worker	return library.MutatedProperties.BuildRlib && BoolDefault(library.Properties.Rlib.Enabled, true)
201*333d2b36SAndroid Build Coastguard Worker}
202*333d2b36SAndroid Build Coastguard Worker
203*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) buildDylib() bool {
204*333d2b36SAndroid Build Coastguard Worker	return library.MutatedProperties.BuildDylib && BoolDefault(library.Properties.Dylib.Enabled, true)
205*333d2b36SAndroid Build Coastguard Worker}
206*333d2b36SAndroid Build Coastguard Worker
207*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) buildShared() bool {
208*333d2b36SAndroid Build Coastguard Worker	return library.MutatedProperties.BuildShared && BoolDefault(library.Properties.Shared.Enabled, true)
209*333d2b36SAndroid Build Coastguard Worker}
210*333d2b36SAndroid Build Coastguard Worker
211*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) buildStatic() bool {
212*333d2b36SAndroid Build Coastguard Worker	return library.MutatedProperties.BuildStatic && BoolDefault(library.Properties.Static.Enabled, true)
213*333d2b36SAndroid Build Coastguard Worker}
214*333d2b36SAndroid Build Coastguard Worker
215*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) setRlib() {
216*333d2b36SAndroid Build Coastguard Worker	library.MutatedProperties.VariantIsRlib = true
217*333d2b36SAndroid Build Coastguard Worker	library.MutatedProperties.VariantIsDylib = false
218*333d2b36SAndroid Build Coastguard Worker	library.MutatedProperties.VariantIsShared = false
219*333d2b36SAndroid Build Coastguard Worker}
220*333d2b36SAndroid Build Coastguard Worker
221*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) setDylib() {
222*333d2b36SAndroid Build Coastguard Worker	library.MutatedProperties.VariantIsRlib = false
223*333d2b36SAndroid Build Coastguard Worker	library.MutatedProperties.VariantIsDylib = true
224*333d2b36SAndroid Build Coastguard Worker	library.MutatedProperties.VariantIsShared = false
225*333d2b36SAndroid Build Coastguard Worker}
226*333d2b36SAndroid Build Coastguard Worker
227*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) rlibStd() bool {
228*333d2b36SAndroid Build Coastguard Worker	return library.MutatedProperties.VariantIsStaticStd
229*333d2b36SAndroid Build Coastguard Worker}
230*333d2b36SAndroid Build Coastguard Worker
231*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) setRlibStd() {
232*333d2b36SAndroid Build Coastguard Worker	library.MutatedProperties.VariantIsStaticStd = true
233*333d2b36SAndroid Build Coastguard Worker}
234*333d2b36SAndroid Build Coastguard Worker
235*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) setDylibStd() {
236*333d2b36SAndroid Build Coastguard Worker	library.MutatedProperties.VariantIsStaticStd = false
237*333d2b36SAndroid Build Coastguard Worker}
238*333d2b36SAndroid Build Coastguard Worker
239*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) setShared() {
240*333d2b36SAndroid Build Coastguard Worker	library.MutatedProperties.VariantIsShared = true
241*333d2b36SAndroid Build Coastguard Worker	library.MutatedProperties.VariantIsRlib = false
242*333d2b36SAndroid Build Coastguard Worker	library.MutatedProperties.VariantIsDylib = false
243*333d2b36SAndroid Build Coastguard Worker}
244*333d2b36SAndroid Build Coastguard Worker
245*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) setStatic() {
246*333d2b36SAndroid Build Coastguard Worker	panic(fmt.Errorf("static variant is not supported for rust modules, use the rlib variant instead"))
247*333d2b36SAndroid Build Coastguard Worker}
248*333d2b36SAndroid Build Coastguard Worker
249*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) setSource() {
250*333d2b36SAndroid Build Coastguard Worker	library.MutatedProperties.VariantIsSource = true
251*333d2b36SAndroid Build Coastguard Worker}
252*333d2b36SAndroid Build Coastguard Worker
253*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) autoDep(ctx android.BottomUpMutatorContext) autoDep {
254*333d2b36SAndroid Build Coastguard Worker	if library.preferRlib() {
255*333d2b36SAndroid Build Coastguard Worker		return rlibAutoDep
256*333d2b36SAndroid Build Coastguard Worker	} else if library.rlib() || library.static() {
257*333d2b36SAndroid Build Coastguard Worker		return rlibAutoDep
258*333d2b36SAndroid Build Coastguard Worker	} else if library.dylib() || library.shared() {
259*333d2b36SAndroid Build Coastguard Worker		return dylibAutoDep
260*333d2b36SAndroid Build Coastguard Worker	} else {
261*333d2b36SAndroid Build Coastguard Worker		panic(fmt.Errorf("autoDep called on library %q that has no enabled variants.", ctx.ModuleName()))
262*333d2b36SAndroid Build Coastguard Worker	}
263*333d2b36SAndroid Build Coastguard Worker}
264*333d2b36SAndroid Build Coastguard Worker
265*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) stdLinkage(ctx *depsContext) RustLinkage {
266*333d2b36SAndroid Build Coastguard Worker	if library.static() || library.MutatedProperties.VariantIsStaticStd || (library.rlib() && library.isFFILibrary()) {
267*333d2b36SAndroid Build Coastguard Worker		return RlibLinkage
268*333d2b36SAndroid Build Coastguard Worker	} else if library.baseCompiler.preferRlib() {
269*333d2b36SAndroid Build Coastguard Worker		return RlibLinkage
270*333d2b36SAndroid Build Coastguard Worker	}
271*333d2b36SAndroid Build Coastguard Worker	return DefaultLinkage
272*333d2b36SAndroid Build Coastguard Worker}
273*333d2b36SAndroid Build Coastguard Worker
274*333d2b36SAndroid Build Coastguard Workervar _ compiler = (*libraryDecorator)(nil)
275*333d2b36SAndroid Build Coastguard Workervar _ libraryInterface = (*libraryDecorator)(nil)
276*333d2b36SAndroid Build Coastguard Workervar _ exportedFlagsProducer = (*libraryDecorator)(nil)
277*333d2b36SAndroid Build Coastguard Worker
278*333d2b36SAndroid Build Coastguard Worker// rust_library produces all Rust variants (rust_library_dylib and
279*333d2b36SAndroid Build Coastguard Worker// rust_library_rlib).
280*333d2b36SAndroid Build Coastguard Workerfunc RustLibraryFactory() android.Module {
281*333d2b36SAndroid Build Coastguard Worker	module, library := NewRustLibrary(android.HostAndDeviceSupported)
282*333d2b36SAndroid Build Coastguard Worker	library.BuildOnlyRust()
283*333d2b36SAndroid Build Coastguard Worker	return module.Init()
284*333d2b36SAndroid Build Coastguard Worker}
285*333d2b36SAndroid Build Coastguard Worker
286*333d2b36SAndroid Build Coastguard Worker// rust_ffi produces all FFI variants (rust_ffi_shared, rust_ffi_static, and
287*333d2b36SAndroid Build Coastguard Worker// rust_ffi_rlib).
288*333d2b36SAndroid Build Coastguard Workerfunc RustFFIFactory() android.Module {
289*333d2b36SAndroid Build Coastguard Worker	module, library := NewRustLibrary(android.HostAndDeviceSupported)
290*333d2b36SAndroid Build Coastguard Worker	library.BuildOnlyFFI()
291*333d2b36SAndroid Build Coastguard Worker	return module.Init()
292*333d2b36SAndroid Build Coastguard Worker}
293*333d2b36SAndroid Build Coastguard Worker
294*333d2b36SAndroid Build Coastguard Worker// rust_library_dylib produces a Rust dylib (Rust crate type "dylib").
295*333d2b36SAndroid Build Coastguard Workerfunc RustLibraryDylibFactory() android.Module {
296*333d2b36SAndroid Build Coastguard Worker	module, library := NewRustLibrary(android.HostAndDeviceSupported)
297*333d2b36SAndroid Build Coastguard Worker	library.BuildOnlyDylib()
298*333d2b36SAndroid Build Coastguard Worker	return module.Init()
299*333d2b36SAndroid Build Coastguard Worker}
300*333d2b36SAndroid Build Coastguard Worker
301*333d2b36SAndroid Build Coastguard Worker// rust_library_rlib produces an rlib (Rust crate type "rlib").
302*333d2b36SAndroid Build Coastguard Workerfunc RustLibraryRlibFactory() android.Module {
303*333d2b36SAndroid Build Coastguard Worker	module, library := NewRustLibrary(android.HostAndDeviceSupported)
304*333d2b36SAndroid Build Coastguard Worker	library.BuildOnlyRlib()
305*333d2b36SAndroid Build Coastguard Worker	return module.Init()
306*333d2b36SAndroid Build Coastguard Worker}
307*333d2b36SAndroid Build Coastguard Worker
308*333d2b36SAndroid Build Coastguard Worker// rust_ffi_shared produces a shared library (Rust crate type
309*333d2b36SAndroid Build Coastguard Worker// "cdylib").
310*333d2b36SAndroid Build Coastguard Workerfunc RustFFISharedFactory() android.Module {
311*333d2b36SAndroid Build Coastguard Worker	module, library := NewRustLibrary(android.HostAndDeviceSupported)
312*333d2b36SAndroid Build Coastguard Worker	library.BuildOnlyShared()
313*333d2b36SAndroid Build Coastguard Worker	return module.Init()
314*333d2b36SAndroid Build Coastguard Worker}
315*333d2b36SAndroid Build Coastguard Worker
316*333d2b36SAndroid Build Coastguard Worker// rust_library_host produces all Rust variants for the host
317*333d2b36SAndroid Build Coastguard Worker// (rust_library_dylib_host and rust_library_rlib_host).
318*333d2b36SAndroid Build Coastguard Workerfunc RustLibraryHostFactory() android.Module {
319*333d2b36SAndroid Build Coastguard Worker	module, library := NewRustLibrary(android.HostSupported)
320*333d2b36SAndroid Build Coastguard Worker	library.BuildOnlyRust()
321*333d2b36SAndroid Build Coastguard Worker	return module.Init()
322*333d2b36SAndroid Build Coastguard Worker}
323*333d2b36SAndroid Build Coastguard Worker
324*333d2b36SAndroid Build Coastguard Worker// rust_ffi_host produces all FFI variants for the host
325*333d2b36SAndroid Build Coastguard Worker// (rust_ffi_rlib_host, rust_ffi_static_host, and rust_ffi_shared_host).
326*333d2b36SAndroid Build Coastguard Workerfunc RustFFIHostFactory() android.Module {
327*333d2b36SAndroid Build Coastguard Worker	module, library := NewRustLibrary(android.HostSupported)
328*333d2b36SAndroid Build Coastguard Worker	library.BuildOnlyFFI()
329*333d2b36SAndroid Build Coastguard Worker	return module.Init()
330*333d2b36SAndroid Build Coastguard Worker}
331*333d2b36SAndroid Build Coastguard Worker
332*333d2b36SAndroid Build Coastguard Worker// rust_library_dylib_host produces a dylib for the host (Rust crate
333*333d2b36SAndroid Build Coastguard Worker// type "dylib").
334*333d2b36SAndroid Build Coastguard Workerfunc RustLibraryDylibHostFactory() android.Module {
335*333d2b36SAndroid Build Coastguard Worker	module, library := NewRustLibrary(android.HostSupported)
336*333d2b36SAndroid Build Coastguard Worker	library.BuildOnlyDylib()
337*333d2b36SAndroid Build Coastguard Worker	return module.Init()
338*333d2b36SAndroid Build Coastguard Worker}
339*333d2b36SAndroid Build Coastguard Worker
340*333d2b36SAndroid Build Coastguard Worker// rust_library_rlib_host produces an rlib for the host (Rust crate
341*333d2b36SAndroid Build Coastguard Worker// type "rlib").
342*333d2b36SAndroid Build Coastguard Workerfunc RustLibraryRlibHostFactory() android.Module {
343*333d2b36SAndroid Build Coastguard Worker	module, library := NewRustLibrary(android.HostSupported)
344*333d2b36SAndroid Build Coastguard Worker	library.BuildOnlyRlib()
345*333d2b36SAndroid Build Coastguard Worker	return module.Init()
346*333d2b36SAndroid Build Coastguard Worker}
347*333d2b36SAndroid Build Coastguard Worker
348*333d2b36SAndroid Build Coastguard Worker// rust_ffi_shared_host produces an shared library for the host (Rust
349*333d2b36SAndroid Build Coastguard Worker// crate type "cdylib").
350*333d2b36SAndroid Build Coastguard Workerfunc RustFFISharedHostFactory() android.Module {
351*333d2b36SAndroid Build Coastguard Worker	module, library := NewRustLibrary(android.HostSupported)
352*333d2b36SAndroid Build Coastguard Worker	library.BuildOnlyShared()
353*333d2b36SAndroid Build Coastguard Worker	return module.Init()
354*333d2b36SAndroid Build Coastguard Worker}
355*333d2b36SAndroid Build Coastguard Worker
356*333d2b36SAndroid Build Coastguard Worker// rust_ffi_rlib_host produces an rlib for the host (Rust crate
357*333d2b36SAndroid Build Coastguard Worker// type "rlib").
358*333d2b36SAndroid Build Coastguard Workerfunc RustFFIRlibHostFactory() android.Module {
359*333d2b36SAndroid Build Coastguard Worker	module, library := NewRustLibrary(android.HostSupported)
360*333d2b36SAndroid Build Coastguard Worker	library.BuildOnlyRlib()
361*333d2b36SAndroid Build Coastguard Worker
362*333d2b36SAndroid Build Coastguard Worker	library.isFFI = true
363*333d2b36SAndroid Build Coastguard Worker	return module.Init()
364*333d2b36SAndroid Build Coastguard Worker}
365*333d2b36SAndroid Build Coastguard Worker
366*333d2b36SAndroid Build Coastguard Worker// rust_ffi_rlib produces an rlib (Rust crate type "rlib").
367*333d2b36SAndroid Build Coastguard Workerfunc RustFFIRlibFactory() android.Module {
368*333d2b36SAndroid Build Coastguard Worker	module, library := NewRustLibrary(android.HostAndDeviceSupported)
369*333d2b36SAndroid Build Coastguard Worker	library.BuildOnlyRlib()
370*333d2b36SAndroid Build Coastguard Worker
371*333d2b36SAndroid Build Coastguard Worker	library.isFFI = true
372*333d2b36SAndroid Build Coastguard Worker	return module.Init()
373*333d2b36SAndroid Build Coastguard Worker}
374*333d2b36SAndroid Build Coastguard Worker
375*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) BuildOnlyFFI() {
376*333d2b36SAndroid Build Coastguard Worker	library.MutatedProperties.BuildDylib = false
377*333d2b36SAndroid Build Coastguard Worker	// we build rlibs for later static ffi linkage.
378*333d2b36SAndroid Build Coastguard Worker	library.MutatedProperties.BuildRlib = true
379*333d2b36SAndroid Build Coastguard Worker	library.MutatedProperties.BuildShared = true
380*333d2b36SAndroid Build Coastguard Worker	library.MutatedProperties.BuildStatic = false
381*333d2b36SAndroid Build Coastguard Worker
382*333d2b36SAndroid Build Coastguard Worker	library.isFFI = true
383*333d2b36SAndroid Build Coastguard Worker}
384*333d2b36SAndroid Build Coastguard Worker
385*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) BuildOnlyRust() {
386*333d2b36SAndroid Build Coastguard Worker	library.MutatedProperties.BuildDylib = true
387*333d2b36SAndroid Build Coastguard Worker	library.MutatedProperties.BuildRlib = true
388*333d2b36SAndroid Build Coastguard Worker	library.MutatedProperties.BuildShared = false
389*333d2b36SAndroid Build Coastguard Worker	library.MutatedProperties.BuildStatic = false
390*333d2b36SAndroid Build Coastguard Worker}
391*333d2b36SAndroid Build Coastguard Worker
392*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) BuildOnlyDylib() {
393*333d2b36SAndroid Build Coastguard Worker	library.MutatedProperties.BuildDylib = true
394*333d2b36SAndroid Build Coastguard Worker	library.MutatedProperties.BuildRlib = false
395*333d2b36SAndroid Build Coastguard Worker	library.MutatedProperties.BuildShared = false
396*333d2b36SAndroid Build Coastguard Worker	library.MutatedProperties.BuildStatic = false
397*333d2b36SAndroid Build Coastguard Worker}
398*333d2b36SAndroid Build Coastguard Worker
399*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) BuildOnlyRlib() {
400*333d2b36SAndroid Build Coastguard Worker	library.MutatedProperties.BuildDylib = false
401*333d2b36SAndroid Build Coastguard Worker	library.MutatedProperties.BuildRlib = true
402*333d2b36SAndroid Build Coastguard Worker	library.MutatedProperties.BuildShared = false
403*333d2b36SAndroid Build Coastguard Worker	library.MutatedProperties.BuildStatic = false
404*333d2b36SAndroid Build Coastguard Worker}
405*333d2b36SAndroid Build Coastguard Worker
406*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) BuildOnlyStatic() {
407*333d2b36SAndroid Build Coastguard Worker	library.MutatedProperties.BuildRlib = false
408*333d2b36SAndroid Build Coastguard Worker	library.MutatedProperties.BuildDylib = false
409*333d2b36SAndroid Build Coastguard Worker	library.MutatedProperties.BuildShared = false
410*333d2b36SAndroid Build Coastguard Worker	library.MutatedProperties.BuildStatic = true
411*333d2b36SAndroid Build Coastguard Worker
412*333d2b36SAndroid Build Coastguard Worker	library.isFFI = true
413*333d2b36SAndroid Build Coastguard Worker}
414*333d2b36SAndroid Build Coastguard Worker
415*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) BuildOnlyShared() {
416*333d2b36SAndroid Build Coastguard Worker	library.MutatedProperties.BuildRlib = false
417*333d2b36SAndroid Build Coastguard Worker	library.MutatedProperties.BuildDylib = false
418*333d2b36SAndroid Build Coastguard Worker	library.MutatedProperties.BuildStatic = false
419*333d2b36SAndroid Build Coastguard Worker	library.MutatedProperties.BuildShared = true
420*333d2b36SAndroid Build Coastguard Worker
421*333d2b36SAndroid Build Coastguard Worker	library.isFFI = true
422*333d2b36SAndroid Build Coastguard Worker}
423*333d2b36SAndroid Build Coastguard Worker
424*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) isFFILibrary() bool {
425*333d2b36SAndroid Build Coastguard Worker	return library.isFFI
426*333d2b36SAndroid Build Coastguard Worker}
427*333d2b36SAndroid Build Coastguard Worker
428*333d2b36SAndroid Build Coastguard Workerfunc NewRustLibrary(hod android.HostOrDeviceSupported) (*Module, *libraryDecorator) {
429*333d2b36SAndroid Build Coastguard Worker	module := newModule(hod, android.MultilibBoth)
430*333d2b36SAndroid Build Coastguard Worker
431*333d2b36SAndroid Build Coastguard Worker	library := &libraryDecorator{
432*333d2b36SAndroid Build Coastguard Worker		MutatedProperties: LibraryMutatedProperties{
433*333d2b36SAndroid Build Coastguard Worker			BuildDylib:  false,
434*333d2b36SAndroid Build Coastguard Worker			BuildRlib:   false,
435*333d2b36SAndroid Build Coastguard Worker			BuildShared: false,
436*333d2b36SAndroid Build Coastguard Worker			BuildStatic: false,
437*333d2b36SAndroid Build Coastguard Worker		},
438*333d2b36SAndroid Build Coastguard Worker		baseCompiler: NewBaseCompiler("lib", "lib64", InstallInSystem),
439*333d2b36SAndroid Build Coastguard Worker		flagExporter: NewFlagExporter(),
440*333d2b36SAndroid Build Coastguard Worker	}
441*333d2b36SAndroid Build Coastguard Worker
442*333d2b36SAndroid Build Coastguard Worker	module.compiler = library
443*333d2b36SAndroid Build Coastguard Worker
444*333d2b36SAndroid Build Coastguard Worker	return module, library
445*333d2b36SAndroid Build Coastguard Worker}
446*333d2b36SAndroid Build Coastguard Worker
447*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) compilerProps() []interface{} {
448*333d2b36SAndroid Build Coastguard Worker	return append(library.baseCompiler.compilerProps(),
449*333d2b36SAndroid Build Coastguard Worker		&library.Properties,
450*333d2b36SAndroid Build Coastguard Worker		&library.MutatedProperties,
451*333d2b36SAndroid Build Coastguard Worker		&library.stripper.StripProperties)
452*333d2b36SAndroid Build Coastguard Worker}
453*333d2b36SAndroid Build Coastguard Worker
454*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) compilerDeps(ctx DepsContext, deps Deps) Deps {
455*333d2b36SAndroid Build Coastguard Worker	deps = library.baseCompiler.compilerDeps(ctx, deps)
456*333d2b36SAndroid Build Coastguard Worker
457*333d2b36SAndroid Build Coastguard Worker	if library.dylib() || library.shared() {
458*333d2b36SAndroid Build Coastguard Worker		if ctx.toolchain().Bionic() {
459*333d2b36SAndroid Build Coastguard Worker			deps = bionicDeps(ctx, deps, false)
460*333d2b36SAndroid Build Coastguard Worker			deps.CrtBegin = []string{"crtbegin_so"}
461*333d2b36SAndroid Build Coastguard Worker			deps.CrtEnd = []string{"crtend_so"}
462*333d2b36SAndroid Build Coastguard Worker		} else if ctx.Os() == android.LinuxMusl {
463*333d2b36SAndroid Build Coastguard Worker			deps = muslDeps(ctx, deps, false)
464*333d2b36SAndroid Build Coastguard Worker			deps.CrtBegin = []string{"libc_musl_crtbegin_so"}
465*333d2b36SAndroid Build Coastguard Worker			deps.CrtEnd = []string{"libc_musl_crtend_so"}
466*333d2b36SAndroid Build Coastguard Worker		}
467*333d2b36SAndroid Build Coastguard Worker	}
468*333d2b36SAndroid Build Coastguard Worker
469*333d2b36SAndroid Build Coastguard Worker	return deps
470*333d2b36SAndroid Build Coastguard Worker}
471*333d2b36SAndroid Build Coastguard Worker
472*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) sharedLibFilename(ctx ModuleContext) string {
473*333d2b36SAndroid Build Coastguard Worker	return library.getStem(ctx) + ctx.toolchain().SharedLibSuffix()
474*333d2b36SAndroid Build Coastguard Worker}
475*333d2b36SAndroid Build Coastguard Worker
476*333d2b36SAndroid Build Coastguard Worker// Library cfg flags common to all variants
477*333d2b36SAndroid Build Coastguard Workerfunc CommonLibraryCfgFlags(ctx android.ModuleContext, flags Flags) Flags {
478*333d2b36SAndroid Build Coastguard Worker	return flags
479*333d2b36SAndroid Build Coastguard Worker}
480*333d2b36SAndroid Build Coastguard Worker
481*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) cfgFlags(ctx ModuleContext, flags Flags) Flags {
482*333d2b36SAndroid Build Coastguard Worker	flags = library.baseCompiler.cfgFlags(ctx, flags)
483*333d2b36SAndroid Build Coastguard Worker	flags = CommonLibraryCfgFlags(ctx, flags)
484*333d2b36SAndroid Build Coastguard Worker
485*333d2b36SAndroid Build Coastguard Worker	cfgs := library.baseCompiler.Properties.Cfgs.GetOrDefault(ctx, nil)
486*333d2b36SAndroid Build Coastguard Worker
487*333d2b36SAndroid Build Coastguard Worker	if library.dylib() {
488*333d2b36SAndroid Build Coastguard Worker		// We need to add a dependency on std in order to link crates as dylibs.
489*333d2b36SAndroid Build Coastguard Worker		// The hack to add this dependency is guarded by the following cfg so
490*333d2b36SAndroid Build Coastguard Worker		// that we don't force a dependency when it isn't needed.
491*333d2b36SAndroid Build Coastguard Worker		cfgs = append(cfgs, "android_dylib")
492*333d2b36SAndroid Build Coastguard Worker	}
493*333d2b36SAndroid Build Coastguard Worker
494*333d2b36SAndroid Build Coastguard Worker	cfgFlags := cfgsToFlags(cfgs)
495*333d2b36SAndroid Build Coastguard Worker
496*333d2b36SAndroid Build Coastguard Worker	flags.RustFlags = append(flags.RustFlags, cfgFlags...)
497*333d2b36SAndroid Build Coastguard Worker	flags.RustdocFlags = append(flags.RustdocFlags, cfgFlags...)
498*333d2b36SAndroid Build Coastguard Worker
499*333d2b36SAndroid Build Coastguard Worker	return flags
500*333d2b36SAndroid Build Coastguard Worker}
501*333d2b36SAndroid Build Coastguard Worker
502*333d2b36SAndroid Build Coastguard Worker// Common flags applied to all libraries irrespective of properties or variant should be included here
503*333d2b36SAndroid Build Coastguard Workerfunc CommonLibraryCompilerFlags(ctx android.ModuleContext, flags Flags) Flags {
504*333d2b36SAndroid Build Coastguard Worker	flags.RustFlags = append(flags.RustFlags, "-C metadata="+ctx.ModuleName())
505*333d2b36SAndroid Build Coastguard Worker
506*333d2b36SAndroid Build Coastguard Worker	return flags
507*333d2b36SAndroid Build Coastguard Worker}
508*333d2b36SAndroid Build Coastguard Worker
509*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) compilerFlags(ctx ModuleContext, flags Flags) Flags {
510*333d2b36SAndroid Build Coastguard Worker	flags = library.baseCompiler.compilerFlags(ctx, flags)
511*333d2b36SAndroid Build Coastguard Worker
512*333d2b36SAndroid Build Coastguard Worker	flags = CommonLibraryCompilerFlags(ctx, flags)
513*333d2b36SAndroid Build Coastguard Worker
514*333d2b36SAndroid Build Coastguard Worker	if library.isFFI {
515*333d2b36SAndroid Build Coastguard Worker		library.includeDirs = append(library.includeDirs, android.PathsForModuleSrc(ctx, library.Properties.Include_dirs)...)
516*333d2b36SAndroid Build Coastguard Worker		library.includeDirs = append(library.includeDirs, android.PathsForModuleSrc(ctx, library.Properties.Export_include_dirs)...)
517*333d2b36SAndroid Build Coastguard Worker	}
518*333d2b36SAndroid Build Coastguard Worker
519*333d2b36SAndroid Build Coastguard Worker	if library.shared() {
520*333d2b36SAndroid Build Coastguard Worker		if ctx.Darwin() {
521*333d2b36SAndroid Build Coastguard Worker			flags.LinkFlags = append(
522*333d2b36SAndroid Build Coastguard Worker				flags.LinkFlags,
523*333d2b36SAndroid Build Coastguard Worker				"-dynamic_lib",
524*333d2b36SAndroid Build Coastguard Worker				"-install_name @rpath/"+library.sharedLibFilename(ctx),
525*333d2b36SAndroid Build Coastguard Worker			)
526*333d2b36SAndroid Build Coastguard Worker		} else {
527*333d2b36SAndroid Build Coastguard Worker			flags.LinkFlags = append(flags.LinkFlags, "-Wl,-soname="+library.sharedLibFilename(ctx))
528*333d2b36SAndroid Build Coastguard Worker		}
529*333d2b36SAndroid Build Coastguard Worker	}
530*333d2b36SAndroid Build Coastguard Worker
531*333d2b36SAndroid Build Coastguard Worker	return flags
532*333d2b36SAndroid Build Coastguard Worker}
533*333d2b36SAndroid Build Coastguard Worker
534*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) compile(ctx ModuleContext, flags Flags, deps PathDeps) buildOutput {
535*333d2b36SAndroid Build Coastguard Worker	var outputFile android.ModuleOutPath
536*333d2b36SAndroid Build Coastguard Worker	var ret buildOutput
537*333d2b36SAndroid Build Coastguard Worker	var fileName string
538*333d2b36SAndroid Build Coastguard Worker	crateRootPath := crateRootPath(ctx, library)
539*333d2b36SAndroid Build Coastguard Worker
540*333d2b36SAndroid Build Coastguard Worker	if library.sourceProvider != nil {
541*333d2b36SAndroid Build Coastguard Worker		deps.srcProviderFiles = append(deps.srcProviderFiles, library.sourceProvider.Srcs()...)
542*333d2b36SAndroid Build Coastguard Worker	}
543*333d2b36SAndroid Build Coastguard Worker
544*333d2b36SAndroid Build Coastguard Worker	// Ensure link dirs are not duplicated
545*333d2b36SAndroid Build Coastguard Worker	deps.linkDirs = android.FirstUniqueStrings(deps.linkDirs)
546*333d2b36SAndroid Build Coastguard Worker
547*333d2b36SAndroid Build Coastguard Worker	// Calculate output filename
548*333d2b36SAndroid Build Coastguard Worker	if library.rlib() {
549*333d2b36SAndroid Build Coastguard Worker		fileName = library.getStem(ctx) + ctx.toolchain().RlibSuffix()
550*333d2b36SAndroid Build Coastguard Worker		outputFile = android.PathForModuleOut(ctx, fileName)
551*333d2b36SAndroid Build Coastguard Worker		ret.outputFile = outputFile
552*333d2b36SAndroid Build Coastguard Worker	} else if library.dylib() {
553*333d2b36SAndroid Build Coastguard Worker		fileName = library.getStem(ctx) + ctx.toolchain().DylibSuffix()
554*333d2b36SAndroid Build Coastguard Worker		outputFile = android.PathForModuleOut(ctx, fileName)
555*333d2b36SAndroid Build Coastguard Worker		ret.outputFile = outputFile
556*333d2b36SAndroid Build Coastguard Worker	} else if library.static() {
557*333d2b36SAndroid Build Coastguard Worker		fileName = library.getStem(ctx) + ctx.toolchain().StaticLibSuffix()
558*333d2b36SAndroid Build Coastguard Worker		outputFile = android.PathForModuleOut(ctx, fileName)
559*333d2b36SAndroid Build Coastguard Worker		ret.outputFile = outputFile
560*333d2b36SAndroid Build Coastguard Worker	} else if library.shared() {
561*333d2b36SAndroid Build Coastguard Worker		fileName = library.sharedLibFilename(ctx)
562*333d2b36SAndroid Build Coastguard Worker		outputFile = android.PathForModuleOut(ctx, fileName)
563*333d2b36SAndroid Build Coastguard Worker		ret.outputFile = outputFile
564*333d2b36SAndroid Build Coastguard Worker	}
565*333d2b36SAndroid Build Coastguard Worker
566*333d2b36SAndroid Build Coastguard Worker	if !library.rlib() && !library.static() && library.stripper.NeedsStrip(ctx) {
567*333d2b36SAndroid Build Coastguard Worker		strippedOutputFile := outputFile
568*333d2b36SAndroid Build Coastguard Worker		outputFile = android.PathForModuleOut(ctx, "unstripped", fileName)
569*333d2b36SAndroid Build Coastguard Worker		library.stripper.StripExecutableOrSharedLib(ctx, outputFile, strippedOutputFile)
570*333d2b36SAndroid Build Coastguard Worker
571*333d2b36SAndroid Build Coastguard Worker		library.baseCompiler.strippedOutputFile = android.OptionalPathForPath(strippedOutputFile)
572*333d2b36SAndroid Build Coastguard Worker	}
573*333d2b36SAndroid Build Coastguard Worker	library.baseCompiler.unstrippedOutputFile = outputFile
574*333d2b36SAndroid Build Coastguard Worker
575*333d2b36SAndroid Build Coastguard Worker	flags.RustFlags = append(flags.RustFlags, deps.depFlags...)
576*333d2b36SAndroid Build Coastguard Worker	flags.LinkFlags = append(flags.LinkFlags, deps.depLinkFlags...)
577*333d2b36SAndroid Build Coastguard Worker	flags.LinkFlags = append(flags.LinkFlags, deps.linkObjects...)
578*333d2b36SAndroid Build Coastguard Worker
579*333d2b36SAndroid Build Coastguard Worker	if library.dylib() {
580*333d2b36SAndroid Build Coastguard Worker		// We need prefer-dynamic for now to avoid linking in the static stdlib. See:
581*333d2b36SAndroid Build Coastguard Worker		// https://github.com/rust-lang/rust/issues/19680
582*333d2b36SAndroid Build Coastguard Worker		// https://github.com/rust-lang/rust/issues/34909
583*333d2b36SAndroid Build Coastguard Worker		flags.RustFlags = append(flags.RustFlags, "-C prefer-dynamic")
584*333d2b36SAndroid Build Coastguard Worker	}
585*333d2b36SAndroid Build Coastguard Worker
586*333d2b36SAndroid Build Coastguard Worker	// Call the appropriate builder for this library type
587*333d2b36SAndroid Build Coastguard Worker	if library.rlib() {
588*333d2b36SAndroid Build Coastguard Worker		ret.kytheFile = TransformSrctoRlib(ctx, crateRootPath, deps, flags, outputFile).kytheFile
589*333d2b36SAndroid Build Coastguard Worker	} else if library.dylib() {
590*333d2b36SAndroid Build Coastguard Worker		ret.kytheFile = TransformSrctoDylib(ctx, crateRootPath, deps, flags, outputFile).kytheFile
591*333d2b36SAndroid Build Coastguard Worker	} else if library.static() {
592*333d2b36SAndroid Build Coastguard Worker		ret.kytheFile = TransformSrctoStatic(ctx, crateRootPath, deps, flags, outputFile).kytheFile
593*333d2b36SAndroid Build Coastguard Worker	} else if library.shared() {
594*333d2b36SAndroid Build Coastguard Worker		ret.kytheFile = TransformSrctoShared(ctx, crateRootPath, deps, flags, outputFile).kytheFile
595*333d2b36SAndroid Build Coastguard Worker	}
596*333d2b36SAndroid Build Coastguard Worker
597*333d2b36SAndroid Build Coastguard Worker	if library.rlib() || library.dylib() {
598*333d2b36SAndroid Build Coastguard Worker		library.flagExporter.exportLinkDirs(deps.linkDirs...)
599*333d2b36SAndroid Build Coastguard Worker		library.flagExporter.exportLinkObjects(deps.linkObjects...)
600*333d2b36SAndroid Build Coastguard Worker	}
601*333d2b36SAndroid Build Coastguard Worker
602*333d2b36SAndroid Build Coastguard Worker	// Since we have FFI rlibs, we need to collect their includes as well
603*333d2b36SAndroid Build Coastguard Worker	if library.static() || library.shared() || library.rlib() {
604*333d2b36SAndroid Build Coastguard Worker		android.SetProvider(ctx, cc.FlagExporterInfoProvider, cc.FlagExporterInfo{
605*333d2b36SAndroid Build Coastguard Worker			IncludeDirs: android.FirstUniquePaths(library.includeDirs),
606*333d2b36SAndroid Build Coastguard Worker		})
607*333d2b36SAndroid Build Coastguard Worker	}
608*333d2b36SAndroid Build Coastguard Worker
609*333d2b36SAndroid Build Coastguard Worker	if library.shared() {
610*333d2b36SAndroid Build Coastguard Worker		// Optimize out relinking against shared libraries whose interface hasn't changed by
611*333d2b36SAndroid Build Coastguard Worker		// depending on a table of contents file instead of the library itself.
612*333d2b36SAndroid Build Coastguard Worker		tocFile := outputFile.ReplaceExtension(ctx, flags.Toolchain.SharedLibSuffix()[1:]+".toc")
613*333d2b36SAndroid Build Coastguard Worker		library.tocFile = android.OptionalPathForPath(tocFile)
614*333d2b36SAndroid Build Coastguard Worker		cc.TransformSharedObjectToToc(ctx, outputFile, tocFile)
615*333d2b36SAndroid Build Coastguard Worker
616*333d2b36SAndroid Build Coastguard Worker		android.SetProvider(ctx, cc.SharedLibraryInfoProvider, cc.SharedLibraryInfo{
617*333d2b36SAndroid Build Coastguard Worker			TableOfContents: android.OptionalPathForPath(tocFile),
618*333d2b36SAndroid Build Coastguard Worker			SharedLibrary:   outputFile,
619*333d2b36SAndroid Build Coastguard Worker			Target:          ctx.Target(),
620*333d2b36SAndroid Build Coastguard Worker			// TODO: when rust supports stubs uses the stubs state rather than inferring it from
621*333d2b36SAndroid Build Coastguard Worker			//  apex_exclude.
622*333d2b36SAndroid Build Coastguard Worker			IsStubs: Bool(library.Properties.Apex_exclude),
623*333d2b36SAndroid Build Coastguard Worker		})
624*333d2b36SAndroid Build Coastguard Worker	}
625*333d2b36SAndroid Build Coastguard Worker
626*333d2b36SAndroid Build Coastguard Worker	if library.static() {
627*333d2b36SAndroid Build Coastguard Worker		depSet := depset.NewBuilder[android.Path](depset.TOPOLOGICAL).Direct(outputFile).Build()
628*333d2b36SAndroid Build Coastguard Worker		android.SetProvider(ctx, cc.StaticLibraryInfoProvider, cc.StaticLibraryInfo{
629*333d2b36SAndroid Build Coastguard Worker			StaticLibrary: outputFile,
630*333d2b36SAndroid Build Coastguard Worker
631*333d2b36SAndroid Build Coastguard Worker			TransitiveStaticLibrariesForOrdering: depSet,
632*333d2b36SAndroid Build Coastguard Worker		})
633*333d2b36SAndroid Build Coastguard Worker	}
634*333d2b36SAndroid Build Coastguard Worker
635*333d2b36SAndroid Build Coastguard Worker	library.flagExporter.setProvider(ctx)
636*333d2b36SAndroid Build Coastguard Worker
637*333d2b36SAndroid Build Coastguard Worker	return ret
638*333d2b36SAndroid Build Coastguard Worker}
639*333d2b36SAndroid Build Coastguard Worker
640*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) checkedCrateRootPath() (android.Path, error) {
641*333d2b36SAndroid Build Coastguard Worker	if library.sourceProvider != nil {
642*333d2b36SAndroid Build Coastguard Worker		srcs := library.sourceProvider.Srcs()
643*333d2b36SAndroid Build Coastguard Worker		if len(srcs) == 0 {
644*333d2b36SAndroid Build Coastguard Worker			return nil, errors.New("Source provider generated 0 sources")
645*333d2b36SAndroid Build Coastguard Worker		}
646*333d2b36SAndroid Build Coastguard Worker		// Assume the first source from the source provider is the library entry point.
647*333d2b36SAndroid Build Coastguard Worker		return srcs[0], nil
648*333d2b36SAndroid Build Coastguard Worker	} else {
649*333d2b36SAndroid Build Coastguard Worker		return library.baseCompiler.checkedCrateRootPath()
650*333d2b36SAndroid Build Coastguard Worker	}
651*333d2b36SAndroid Build Coastguard Worker}
652*333d2b36SAndroid Build Coastguard Worker
653*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) rustdoc(ctx ModuleContext, flags Flags,
654*333d2b36SAndroid Build Coastguard Worker	deps PathDeps) android.OptionalPath {
655*333d2b36SAndroid Build Coastguard Worker	// rustdoc has builtin support for documenting config specific information
656*333d2b36SAndroid Build Coastguard Worker	// regardless of the actual config it was given
657*333d2b36SAndroid Build Coastguard Worker	// (https://doc.rust-lang.org/rustdoc/advanced-features.html#cfgdoc-documenting-platform-specific-or-feature-specific-information),
658*333d2b36SAndroid Build Coastguard Worker	// so we generate the rustdoc for only the primary module so that we have a
659*333d2b36SAndroid Build Coastguard Worker	// single set of docs to refer to.
660*333d2b36SAndroid Build Coastguard Worker	if ctx.Module() != ctx.PrimaryModule() {
661*333d2b36SAndroid Build Coastguard Worker		return android.OptionalPath{}
662*333d2b36SAndroid Build Coastguard Worker	}
663*333d2b36SAndroid Build Coastguard Worker
664*333d2b36SAndroid Build Coastguard Worker	return android.OptionalPathForPath(Rustdoc(ctx, crateRootPath(ctx, library),
665*333d2b36SAndroid Build Coastguard Worker		deps, flags))
666*333d2b36SAndroid Build Coastguard Worker}
667*333d2b36SAndroid Build Coastguard Worker
668*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) getStem(ctx ModuleContext) string {
669*333d2b36SAndroid Build Coastguard Worker	stem := library.baseCompiler.getStemWithoutSuffix(ctx)
670*333d2b36SAndroid Build Coastguard Worker	validateLibraryStem(ctx, stem, library.crateName())
671*333d2b36SAndroid Build Coastguard Worker
672*333d2b36SAndroid Build Coastguard Worker	return stem + String(library.baseCompiler.Properties.Suffix)
673*333d2b36SAndroid Build Coastguard Worker}
674*333d2b36SAndroid Build Coastguard Worker
675*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) install(ctx ModuleContext) {
676*333d2b36SAndroid Build Coastguard Worker	// Only shared and dylib variants make sense to install.
677*333d2b36SAndroid Build Coastguard Worker	if library.shared() || library.dylib() {
678*333d2b36SAndroid Build Coastguard Worker		library.baseCompiler.install(ctx)
679*333d2b36SAndroid Build Coastguard Worker	}
680*333d2b36SAndroid Build Coastguard Worker}
681*333d2b36SAndroid Build Coastguard Worker
682*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) Disabled() bool {
683*333d2b36SAndroid Build Coastguard Worker	return library.MutatedProperties.VariantIsDisabled
684*333d2b36SAndroid Build Coastguard Worker}
685*333d2b36SAndroid Build Coastguard Worker
686*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) SetDisabled() {
687*333d2b36SAndroid Build Coastguard Worker	library.MutatedProperties.VariantIsDisabled = true
688*333d2b36SAndroid Build Coastguard Worker}
689*333d2b36SAndroid Build Coastguard Worker
690*333d2b36SAndroid Build Coastguard Workervar validCrateName = regexp.MustCompile("[^a-zA-Z0-9_]+")
691*333d2b36SAndroid Build Coastguard Worker
692*333d2b36SAndroid Build Coastguard Workerfunc validateLibraryStem(ctx BaseModuleContext, filename string, crate_name string) {
693*333d2b36SAndroid Build Coastguard Worker	if crate_name == "" {
694*333d2b36SAndroid Build Coastguard Worker		ctx.PropertyErrorf("crate_name", "crate_name must be defined.")
695*333d2b36SAndroid Build Coastguard Worker	}
696*333d2b36SAndroid Build Coastguard Worker
697*333d2b36SAndroid Build Coastguard Worker	// crate_names are used for the library output file, and rustc expects these
698*333d2b36SAndroid Build Coastguard Worker	// to be alphanumeric with underscores allowed.
699*333d2b36SAndroid Build Coastguard Worker	if validCrateName.MatchString(crate_name) {
700*333d2b36SAndroid Build Coastguard Worker		ctx.PropertyErrorf("crate_name",
701*333d2b36SAndroid Build Coastguard Worker			"library crate_names must be alphanumeric with underscores allowed")
702*333d2b36SAndroid Build Coastguard Worker	}
703*333d2b36SAndroid Build Coastguard Worker
704*333d2b36SAndroid Build Coastguard Worker	// Libraries are expected to begin with "lib" followed by the crate_name
705*333d2b36SAndroid Build Coastguard Worker	if !strings.HasPrefix(filename, "lib"+crate_name) {
706*333d2b36SAndroid Build Coastguard Worker		ctx.ModuleErrorf("Invalid name or stem property; library filenames must start with lib<crate_name>")
707*333d2b36SAndroid Build Coastguard Worker	}
708*333d2b36SAndroid Build Coastguard Worker}
709*333d2b36SAndroid Build Coastguard Worker
710*333d2b36SAndroid Build Coastguard Workertype libraryTransitionMutator struct{}
711*333d2b36SAndroid Build Coastguard Worker
712*333d2b36SAndroid Build Coastguard Workerfunc (libraryTransitionMutator) Split(ctx android.BaseModuleContext) []string {
713*333d2b36SAndroid Build Coastguard Worker	m, ok := ctx.Module().(*Module)
714*333d2b36SAndroid Build Coastguard Worker	if !ok || m.compiler == nil {
715*333d2b36SAndroid Build Coastguard Worker		return []string{""}
716*333d2b36SAndroid Build Coastguard Worker	}
717*333d2b36SAndroid Build Coastguard Worker	library, ok := m.compiler.(libraryInterface)
718*333d2b36SAndroid Build Coastguard Worker	if !ok {
719*333d2b36SAndroid Build Coastguard Worker		return []string{""}
720*333d2b36SAndroid Build Coastguard Worker	}
721*333d2b36SAndroid Build Coastguard Worker
722*333d2b36SAndroid Build Coastguard Worker	// Don't produce rlib/dylib/source variants for shared or static variants
723*333d2b36SAndroid Build Coastguard Worker	if library.shared() || library.static() {
724*333d2b36SAndroid Build Coastguard Worker		return []string{""}
725*333d2b36SAndroid Build Coastguard Worker	}
726*333d2b36SAndroid Build Coastguard Worker
727*333d2b36SAndroid Build Coastguard Worker	var variants []string
728*333d2b36SAndroid Build Coastguard Worker	// The source variant is used for SourceProvider modules. The other variants (i.e. rlib and dylib)
729*333d2b36SAndroid Build Coastguard Worker	// depend on this variant. It must be the first variant to be declared.
730*333d2b36SAndroid Build Coastguard Worker	if m.sourceProvider != nil {
731*333d2b36SAndroid Build Coastguard Worker		variants = append(variants, sourceVariation)
732*333d2b36SAndroid Build Coastguard Worker	}
733*333d2b36SAndroid Build Coastguard Worker	if library.buildRlib() {
734*333d2b36SAndroid Build Coastguard Worker		variants = append(variants, rlibVariation)
735*333d2b36SAndroid Build Coastguard Worker	}
736*333d2b36SAndroid Build Coastguard Worker	if library.buildDylib() {
737*333d2b36SAndroid Build Coastguard Worker		variants = append(variants, dylibVariation)
738*333d2b36SAndroid Build Coastguard Worker	}
739*333d2b36SAndroid Build Coastguard Worker
740*333d2b36SAndroid Build Coastguard Worker	if len(variants) == 0 {
741*333d2b36SAndroid Build Coastguard Worker		return []string{""}
742*333d2b36SAndroid Build Coastguard Worker	}
743*333d2b36SAndroid Build Coastguard Worker
744*333d2b36SAndroid Build Coastguard Worker	return variants
745*333d2b36SAndroid Build Coastguard Worker}
746*333d2b36SAndroid Build Coastguard Worker
747*333d2b36SAndroid Build Coastguard Workerfunc (libraryTransitionMutator) OutgoingTransition(ctx android.OutgoingTransitionContext, sourceVariation string) string {
748*333d2b36SAndroid Build Coastguard Worker	return ""
749*333d2b36SAndroid Build Coastguard Worker}
750*333d2b36SAndroid Build Coastguard Worker
751*333d2b36SAndroid Build Coastguard Workerfunc (libraryTransitionMutator) IncomingTransition(ctx android.IncomingTransitionContext, incomingVariation string) string {
752*333d2b36SAndroid Build Coastguard Worker	m, ok := ctx.Module().(*Module)
753*333d2b36SAndroid Build Coastguard Worker	if !ok || m.compiler == nil {
754*333d2b36SAndroid Build Coastguard Worker		return ""
755*333d2b36SAndroid Build Coastguard Worker	}
756*333d2b36SAndroid Build Coastguard Worker	library, ok := m.compiler.(libraryInterface)
757*333d2b36SAndroid Build Coastguard Worker	if !ok {
758*333d2b36SAndroid Build Coastguard Worker		return ""
759*333d2b36SAndroid Build Coastguard Worker	}
760*333d2b36SAndroid Build Coastguard Worker
761*333d2b36SAndroid Build Coastguard Worker	if incomingVariation == "" {
762*333d2b36SAndroid Build Coastguard Worker		if m.sourceProvider != nil {
763*333d2b36SAndroid Build Coastguard Worker			return sourceVariation
764*333d2b36SAndroid Build Coastguard Worker		}
765*333d2b36SAndroid Build Coastguard Worker		if library.shared() {
766*333d2b36SAndroid Build Coastguard Worker			return ""
767*333d2b36SAndroid Build Coastguard Worker		}
768*333d2b36SAndroid Build Coastguard Worker		if library.buildRlib() {
769*333d2b36SAndroid Build Coastguard Worker			return rlibVariation
770*333d2b36SAndroid Build Coastguard Worker		}
771*333d2b36SAndroid Build Coastguard Worker		if library.buildDylib() {
772*333d2b36SAndroid Build Coastguard Worker			return dylibVariation
773*333d2b36SAndroid Build Coastguard Worker		}
774*333d2b36SAndroid Build Coastguard Worker	}
775*333d2b36SAndroid Build Coastguard Worker	return incomingVariation
776*333d2b36SAndroid Build Coastguard Worker}
777*333d2b36SAndroid Build Coastguard Worker
778*333d2b36SAndroid Build Coastguard Workerfunc (libraryTransitionMutator) Mutate(ctx android.BottomUpMutatorContext, variation string) {
779*333d2b36SAndroid Build Coastguard Worker	m, ok := ctx.Module().(*Module)
780*333d2b36SAndroid Build Coastguard Worker	if !ok || m.compiler == nil {
781*333d2b36SAndroid Build Coastguard Worker		return
782*333d2b36SAndroid Build Coastguard Worker	}
783*333d2b36SAndroid Build Coastguard Worker	library, ok := m.compiler.(libraryInterface)
784*333d2b36SAndroid Build Coastguard Worker	if !ok {
785*333d2b36SAndroid Build Coastguard Worker		return
786*333d2b36SAndroid Build Coastguard Worker	}
787*333d2b36SAndroid Build Coastguard Worker
788*333d2b36SAndroid Build Coastguard Worker	switch variation {
789*333d2b36SAndroid Build Coastguard Worker	case rlibVariation:
790*333d2b36SAndroid Build Coastguard Worker		library.setRlib()
791*333d2b36SAndroid Build Coastguard Worker	case dylibVariation:
792*333d2b36SAndroid Build Coastguard Worker		library.setDylib()
793*333d2b36SAndroid Build Coastguard Worker		if m.ModuleBase.ImageVariation().Variation == android.VendorRamdiskVariation {
794*333d2b36SAndroid Build Coastguard Worker			// TODO(b/165791368)
795*333d2b36SAndroid Build Coastguard Worker			// Disable dylib Vendor Ramdisk variations until we support these.
796*333d2b36SAndroid Build Coastguard Worker			m.Disable()
797*333d2b36SAndroid Build Coastguard Worker		}
798*333d2b36SAndroid Build Coastguard Worker
799*333d2b36SAndroid Build Coastguard Worker	case sourceVariation:
800*333d2b36SAndroid Build Coastguard Worker		library.setSource()
801*333d2b36SAndroid Build Coastguard Worker		// The source variant does not produce any library.
802*333d2b36SAndroid Build Coastguard Worker		// Disable the compilation steps.
803*333d2b36SAndroid Build Coastguard Worker		m.compiler.SetDisabled()
804*333d2b36SAndroid Build Coastguard Worker	}
805*333d2b36SAndroid Build Coastguard Worker
806*333d2b36SAndroid Build Coastguard Worker	// If a source variant is created, add an inter-variant dependency
807*333d2b36SAndroid Build Coastguard Worker	// between the other variants and the source variant.
808*333d2b36SAndroid Build Coastguard Worker	if m.sourceProvider != nil && variation != sourceVariation {
809*333d2b36SAndroid Build Coastguard Worker		ctx.AddVariationDependencies(
810*333d2b36SAndroid Build Coastguard Worker			[]blueprint.Variation{
811*333d2b36SAndroid Build Coastguard Worker				{"rust_libraries", sourceVariation},
812*333d2b36SAndroid Build Coastguard Worker			},
813*333d2b36SAndroid Build Coastguard Worker			sourceDepTag, ctx.ModuleName())
814*333d2b36SAndroid Build Coastguard Worker	}
815*333d2b36SAndroid Build Coastguard Worker}
816*333d2b36SAndroid Build Coastguard Worker
817*333d2b36SAndroid Build Coastguard Workertype libstdTransitionMutator struct{}
818*333d2b36SAndroid Build Coastguard Worker
819*333d2b36SAndroid Build Coastguard Workerfunc (libstdTransitionMutator) Split(ctx android.BaseModuleContext) []string {
820*333d2b36SAndroid Build Coastguard Worker	if m, ok := ctx.Module().(*Module); ok && m.compiler != nil && !m.compiler.Disabled() {
821*333d2b36SAndroid Build Coastguard Worker		// Only create a variant if a library is actually being built.
822*333d2b36SAndroid Build Coastguard Worker		if library, ok := m.compiler.(libraryInterface); ok {
823*333d2b36SAndroid Build Coastguard Worker			if library.rlib() && !library.sysroot() {
824*333d2b36SAndroid Build Coastguard Worker				if library.isFFILibrary() {
825*333d2b36SAndroid Build Coastguard Worker					return []string{"rlib-std"}
826*333d2b36SAndroid Build Coastguard Worker				} else {
827*333d2b36SAndroid Build Coastguard Worker					return []string{"rlib-std", "dylib-std"}
828*333d2b36SAndroid Build Coastguard Worker				}
829*333d2b36SAndroid Build Coastguard Worker			}
830*333d2b36SAndroid Build Coastguard Worker		}
831*333d2b36SAndroid Build Coastguard Worker	}
832*333d2b36SAndroid Build Coastguard Worker	return []string{""}
833*333d2b36SAndroid Build Coastguard Worker}
834*333d2b36SAndroid Build Coastguard Worker
835*333d2b36SAndroid Build Coastguard Workerfunc (libstdTransitionMutator) OutgoingTransition(ctx android.OutgoingTransitionContext, sourceVariation string) string {
836*333d2b36SAndroid Build Coastguard Worker	return ""
837*333d2b36SAndroid Build Coastguard Worker}
838*333d2b36SAndroid Build Coastguard Worker
839*333d2b36SAndroid Build Coastguard Workerfunc (libstdTransitionMutator) IncomingTransition(ctx android.IncomingTransitionContext, incomingVariation string) string {
840*333d2b36SAndroid Build Coastguard Worker	if m, ok := ctx.Module().(*Module); ok && m.compiler != nil && !m.compiler.Disabled() {
841*333d2b36SAndroid Build Coastguard Worker		if library, ok := m.compiler.(libraryInterface); ok {
842*333d2b36SAndroid Build Coastguard Worker			if library.shared() {
843*333d2b36SAndroid Build Coastguard Worker				return ""
844*333d2b36SAndroid Build Coastguard Worker			}
845*333d2b36SAndroid Build Coastguard Worker			if library.rlib() && !library.sysroot() {
846*333d2b36SAndroid Build Coastguard Worker				if incomingVariation != "" {
847*333d2b36SAndroid Build Coastguard Worker					return incomingVariation
848*333d2b36SAndroid Build Coastguard Worker				}
849*333d2b36SAndroid Build Coastguard Worker				return "rlib-std"
850*333d2b36SAndroid Build Coastguard Worker			}
851*333d2b36SAndroid Build Coastguard Worker		}
852*333d2b36SAndroid Build Coastguard Worker	}
853*333d2b36SAndroid Build Coastguard Worker	return ""
854*333d2b36SAndroid Build Coastguard Worker}
855*333d2b36SAndroid Build Coastguard Worker
856*333d2b36SAndroid Build Coastguard Workerfunc (libstdTransitionMutator) Mutate(ctx android.BottomUpMutatorContext, variation string) {
857*333d2b36SAndroid Build Coastguard Worker	if variation == "rlib-std" {
858*333d2b36SAndroid Build Coastguard Worker		rlib := ctx.Module().(*Module)
859*333d2b36SAndroid Build Coastguard Worker		rlib.compiler.(libraryInterface).setRlibStd()
860*333d2b36SAndroid Build Coastguard Worker		rlib.Properties.RustSubName += RlibStdlibSuffix
861*333d2b36SAndroid Build Coastguard Worker	} else if variation == "dylib-std" {
862*333d2b36SAndroid Build Coastguard Worker		dylib := ctx.Module().(*Module)
863*333d2b36SAndroid Build Coastguard Worker		dylib.compiler.(libraryInterface).setDylibStd()
864*333d2b36SAndroid Build Coastguard Worker		if dylib.ModuleBase.ImageVariation().Variation == android.VendorRamdiskVariation {
865*333d2b36SAndroid Build Coastguard Worker			// TODO(b/165791368)
866*333d2b36SAndroid Build Coastguard Worker			// Disable rlibs that link against dylib-std on vendor ramdisk variations until those dylib
867*333d2b36SAndroid Build Coastguard Worker			// variants are properly supported.
868*333d2b36SAndroid Build Coastguard Worker			dylib.Disable()
869*333d2b36SAndroid Build Coastguard Worker		}
870*333d2b36SAndroid Build Coastguard Worker	}
871*333d2b36SAndroid Build Coastguard Worker}
872