xref: /aosp_15_r20/build/soong/rust/rust.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	"fmt"
19*333d2b36SAndroid Build Coastguard Worker	"strconv"
20*333d2b36SAndroid Build Coastguard Worker	"strings"
21*333d2b36SAndroid Build Coastguard Worker
22*333d2b36SAndroid Build Coastguard Worker	"android/soong/bloaty"
23*333d2b36SAndroid Build Coastguard Worker
24*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint"
25*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint/depset"
26*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint/proptools"
27*333d2b36SAndroid Build Coastguard Worker
28*333d2b36SAndroid Build Coastguard Worker	"android/soong/android"
29*333d2b36SAndroid Build Coastguard Worker	"android/soong/cc"
30*333d2b36SAndroid Build Coastguard Worker	cc_config "android/soong/cc/config"
31*333d2b36SAndroid Build Coastguard Worker	"android/soong/fuzz"
32*333d2b36SAndroid Build Coastguard Worker	"android/soong/rust/config"
33*333d2b36SAndroid Build Coastguard Worker)
34*333d2b36SAndroid Build Coastguard Worker
35*333d2b36SAndroid Build Coastguard Workervar pctx = android.NewPackageContext("android/soong/rust")
36*333d2b36SAndroid Build Coastguard Worker
37*333d2b36SAndroid Build Coastguard Workerfunc init() {
38*333d2b36SAndroid Build Coastguard Worker	android.RegisterModuleType("rust_defaults", defaultsFactory)
39*333d2b36SAndroid Build Coastguard Worker	android.PreDepsMutators(registerPreDepsMutators)
40*333d2b36SAndroid Build Coastguard Worker	android.PostDepsMutators(registerPostDepsMutators)
41*333d2b36SAndroid Build Coastguard Worker	pctx.Import("android/soong/android")
42*333d2b36SAndroid Build Coastguard Worker	pctx.Import("android/soong/rust/config")
43*333d2b36SAndroid Build Coastguard Worker	pctx.ImportAs("cc_config", "android/soong/cc/config")
44*333d2b36SAndroid Build Coastguard Worker	android.InitRegistrationContext.RegisterParallelSingletonType("kythe_rust_extract", kytheExtractRustFactory)
45*333d2b36SAndroid Build Coastguard Worker}
46*333d2b36SAndroid Build Coastguard Worker
47*333d2b36SAndroid Build Coastguard Workerfunc registerPreDepsMutators(ctx android.RegisterMutatorsContext) {
48*333d2b36SAndroid Build Coastguard Worker	ctx.Transition("rust_libraries", &libraryTransitionMutator{})
49*333d2b36SAndroid Build Coastguard Worker	ctx.Transition("rust_stdlinkage", &libstdTransitionMutator{})
50*333d2b36SAndroid Build Coastguard Worker	ctx.BottomUp("rust_begin", BeginMutator)
51*333d2b36SAndroid Build Coastguard Worker}
52*333d2b36SAndroid Build Coastguard Worker
53*333d2b36SAndroid Build Coastguard Workerfunc registerPostDepsMutators(ctx android.RegisterMutatorsContext) {
54*333d2b36SAndroid Build Coastguard Worker	ctx.BottomUp("rust_sanitizers", rustSanitizerRuntimeMutator)
55*333d2b36SAndroid Build Coastguard Worker}
56*333d2b36SAndroid Build Coastguard Worker
57*333d2b36SAndroid Build Coastguard Workertype Flags struct {
58*333d2b36SAndroid Build Coastguard Worker	GlobalRustFlags []string // Flags that apply globally to rust
59*333d2b36SAndroid Build Coastguard Worker	GlobalLinkFlags []string // Flags that apply globally to linker
60*333d2b36SAndroid Build Coastguard Worker	RustFlags       []string // Flags that apply to rust
61*333d2b36SAndroid Build Coastguard Worker	LinkFlags       []string // Flags that apply to linker
62*333d2b36SAndroid Build Coastguard Worker	ClippyFlags     []string // Flags that apply to clippy-driver, during the linting
63*333d2b36SAndroid Build Coastguard Worker	RustdocFlags    []string // Flags that apply to rustdoc
64*333d2b36SAndroid Build Coastguard Worker	Toolchain       config.Toolchain
65*333d2b36SAndroid Build Coastguard Worker	Coverage        bool
66*333d2b36SAndroid Build Coastguard Worker	Clippy          bool
67*333d2b36SAndroid Build Coastguard Worker	EmitXrefs       bool // If true, emit rules to aid cross-referencing
68*333d2b36SAndroid Build Coastguard Worker}
69*333d2b36SAndroid Build Coastguard Worker
70*333d2b36SAndroid Build Coastguard Workertype BaseProperties struct {
71*333d2b36SAndroid Build Coastguard Worker	AndroidMkRlibs         []string `blueprint:"mutated"`
72*333d2b36SAndroid Build Coastguard Worker	AndroidMkDylibs        []string `blueprint:"mutated"`
73*333d2b36SAndroid Build Coastguard Worker	AndroidMkProcMacroLibs []string `blueprint:"mutated"`
74*333d2b36SAndroid Build Coastguard Worker	AndroidMkStaticLibs    []string `blueprint:"mutated"`
75*333d2b36SAndroid Build Coastguard Worker	AndroidMkHeaderLibs    []string `blueprint:"mutated"`
76*333d2b36SAndroid Build Coastguard Worker
77*333d2b36SAndroid Build Coastguard Worker	ImageVariation string `blueprint:"mutated"`
78*333d2b36SAndroid Build Coastguard Worker	VndkVersion    string `blueprint:"mutated"`
79*333d2b36SAndroid Build Coastguard Worker	SubName        string `blueprint:"mutated"`
80*333d2b36SAndroid Build Coastguard Worker
81*333d2b36SAndroid Build Coastguard Worker	// SubName is used by CC for tracking image variants / SDK versions. RustSubName is used for Rust-specific
82*333d2b36SAndroid Build Coastguard Worker	// subnaming which shouldn't be visible to CC modules (such as the rlib stdlinkage subname). This should be
83*333d2b36SAndroid Build Coastguard Worker	// appended before SubName.
84*333d2b36SAndroid Build Coastguard Worker	RustSubName string `blueprint:"mutated"`
85*333d2b36SAndroid Build Coastguard Worker
86*333d2b36SAndroid Build Coastguard Worker	// Set by imageMutator
87*333d2b36SAndroid Build Coastguard Worker	ProductVariantNeeded       bool     `blueprint:"mutated"`
88*333d2b36SAndroid Build Coastguard Worker	VendorVariantNeeded        bool     `blueprint:"mutated"`
89*333d2b36SAndroid Build Coastguard Worker	CoreVariantNeeded          bool     `blueprint:"mutated"`
90*333d2b36SAndroid Build Coastguard Worker	VendorRamdiskVariantNeeded bool     `blueprint:"mutated"`
91*333d2b36SAndroid Build Coastguard Worker	RamdiskVariantNeeded       bool     `blueprint:"mutated"`
92*333d2b36SAndroid Build Coastguard Worker	RecoveryVariantNeeded      bool     `blueprint:"mutated"`
93*333d2b36SAndroid Build Coastguard Worker	ExtraVariants              []string `blueprint:"mutated"`
94*333d2b36SAndroid Build Coastguard Worker
95*333d2b36SAndroid Build Coastguard Worker	// Allows this module to use non-APEX version of libraries. Useful
96*333d2b36SAndroid Build Coastguard Worker	// for building binaries that are started before APEXes are activated.
97*333d2b36SAndroid Build Coastguard Worker	Bootstrap *bool
98*333d2b36SAndroid Build Coastguard Worker
99*333d2b36SAndroid Build Coastguard Worker	// Used by vendor snapshot to record dependencies from snapshot modules.
100*333d2b36SAndroid Build Coastguard Worker	SnapshotSharedLibs []string `blueprint:"mutated"`
101*333d2b36SAndroid Build Coastguard Worker	SnapshotStaticLibs []string `blueprint:"mutated"`
102*333d2b36SAndroid Build Coastguard Worker	SnapshotRlibs      []string `blueprint:"mutated"`
103*333d2b36SAndroid Build Coastguard Worker	SnapshotDylibs     []string `blueprint:"mutated"`
104*333d2b36SAndroid Build Coastguard Worker
105*333d2b36SAndroid Build Coastguard Worker	// Make this module available when building for ramdisk.
106*333d2b36SAndroid Build Coastguard Worker	// On device without a dedicated recovery partition, the module is only
107*333d2b36SAndroid Build Coastguard Worker	// available after switching root into
108*333d2b36SAndroid Build Coastguard Worker	// /first_stage_ramdisk. To expose the module before switching root, install
109*333d2b36SAndroid Build Coastguard Worker	// the recovery variant instead.
110*333d2b36SAndroid Build Coastguard Worker	Ramdisk_available *bool
111*333d2b36SAndroid Build Coastguard Worker
112*333d2b36SAndroid Build Coastguard Worker	// Make this module available when building for vendor ramdisk.
113*333d2b36SAndroid Build Coastguard Worker	// On device without a dedicated recovery partition, the module is only
114*333d2b36SAndroid Build Coastguard Worker	// available after switching root into
115*333d2b36SAndroid Build Coastguard Worker	// /first_stage_ramdisk. To expose the module before switching root, install
116*333d2b36SAndroid Build Coastguard Worker	// the recovery variant instead
117*333d2b36SAndroid Build Coastguard Worker	Vendor_ramdisk_available *bool
118*333d2b36SAndroid Build Coastguard Worker
119*333d2b36SAndroid Build Coastguard Worker	// Normally Soong uses the directory structure to decide which modules
120*333d2b36SAndroid Build Coastguard Worker	// should be included (framework) or excluded (non-framework) from the
121*333d2b36SAndroid Build Coastguard Worker	// different snapshots (vendor, recovery, etc.), but this property
122*333d2b36SAndroid Build Coastguard Worker	// allows a partner to exclude a module normally thought of as a
123*333d2b36SAndroid Build Coastguard Worker	// framework module from the vendor snapshot.
124*333d2b36SAndroid Build Coastguard Worker	Exclude_from_vendor_snapshot *bool
125*333d2b36SAndroid Build Coastguard Worker
126*333d2b36SAndroid Build Coastguard Worker	// Normally Soong uses the directory structure to decide which modules
127*333d2b36SAndroid Build Coastguard Worker	// should be included (framework) or excluded (non-framework) from the
128*333d2b36SAndroid Build Coastguard Worker	// different snapshots (vendor, recovery, etc.), but this property
129*333d2b36SAndroid Build Coastguard Worker	// allows a partner to exclude a module normally thought of as a
130*333d2b36SAndroid Build Coastguard Worker	// framework module from the recovery snapshot.
131*333d2b36SAndroid Build Coastguard Worker	Exclude_from_recovery_snapshot *bool
132*333d2b36SAndroid Build Coastguard Worker
133*333d2b36SAndroid Build Coastguard Worker	// Make this module available when building for recovery
134*333d2b36SAndroid Build Coastguard Worker	Recovery_available *bool
135*333d2b36SAndroid Build Coastguard Worker
136*333d2b36SAndroid Build Coastguard Worker	// Minimum sdk version that the artifact should support when it runs as part of mainline modules(APEX).
137*333d2b36SAndroid Build Coastguard Worker	Min_sdk_version *string
138*333d2b36SAndroid Build Coastguard Worker
139*333d2b36SAndroid Build Coastguard Worker	HideFromMake   bool `blueprint:"mutated"`
140*333d2b36SAndroid Build Coastguard Worker	PreventInstall bool `blueprint:"mutated"`
141*333d2b36SAndroid Build Coastguard Worker
142*333d2b36SAndroid Build Coastguard Worker	Installable *bool
143*333d2b36SAndroid Build Coastguard Worker}
144*333d2b36SAndroid Build Coastguard Worker
145*333d2b36SAndroid Build Coastguard Workertype Module struct {
146*333d2b36SAndroid Build Coastguard Worker	fuzz.FuzzModule
147*333d2b36SAndroid Build Coastguard Worker
148*333d2b36SAndroid Build Coastguard Worker	VendorProperties cc.VendorProperties
149*333d2b36SAndroid Build Coastguard Worker
150*333d2b36SAndroid Build Coastguard Worker	Properties BaseProperties
151*333d2b36SAndroid Build Coastguard Worker
152*333d2b36SAndroid Build Coastguard Worker	hod        android.HostOrDeviceSupported
153*333d2b36SAndroid Build Coastguard Worker	multilib   android.Multilib
154*333d2b36SAndroid Build Coastguard Worker	testModule bool
155*333d2b36SAndroid Build Coastguard Worker
156*333d2b36SAndroid Build Coastguard Worker	makeLinkType string
157*333d2b36SAndroid Build Coastguard Worker
158*333d2b36SAndroid Build Coastguard Worker	afdo             *afdo
159*333d2b36SAndroid Build Coastguard Worker	compiler         compiler
160*333d2b36SAndroid Build Coastguard Worker	coverage         *coverage
161*333d2b36SAndroid Build Coastguard Worker	clippy           *clippy
162*333d2b36SAndroid Build Coastguard Worker	sanitize         *sanitize
163*333d2b36SAndroid Build Coastguard Worker	cachedToolchain  config.Toolchain
164*333d2b36SAndroid Build Coastguard Worker	sourceProvider   SourceProvider
165*333d2b36SAndroid Build Coastguard Worker	subAndroidMkOnce map[SubAndroidMkProvider]bool
166*333d2b36SAndroid Build Coastguard Worker
167*333d2b36SAndroid Build Coastguard Worker	exportedLinkDirs []string
168*333d2b36SAndroid Build Coastguard Worker
169*333d2b36SAndroid Build Coastguard Worker	// Output file to be installed, may be stripped or unstripped.
170*333d2b36SAndroid Build Coastguard Worker	outputFile android.OptionalPath
171*333d2b36SAndroid Build Coastguard Worker
172*333d2b36SAndroid Build Coastguard Worker	// Cross-reference input file
173*333d2b36SAndroid Build Coastguard Worker	kytheFiles android.Paths
174*333d2b36SAndroid Build Coastguard Worker
175*333d2b36SAndroid Build Coastguard Worker	docTimestampFile android.OptionalPath
176*333d2b36SAndroid Build Coastguard Worker
177*333d2b36SAndroid Build Coastguard Worker	hideApexVariantFromMake bool
178*333d2b36SAndroid Build Coastguard Worker
179*333d2b36SAndroid Build Coastguard Worker	// For apex variants, this is set as apex.min_sdk_version
180*333d2b36SAndroid Build Coastguard Worker	apexSdkVersion android.ApiLevel
181*333d2b36SAndroid Build Coastguard Worker
182*333d2b36SAndroid Build Coastguard Worker	transitiveAndroidMkSharedLibs depset.DepSet[string]
183*333d2b36SAndroid Build Coastguard Worker}
184*333d2b36SAndroid Build Coastguard Worker
185*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) Header() bool {
186*333d2b36SAndroid Build Coastguard Worker	//TODO: If Rust libraries provide header variants, this needs to be updated.
187*333d2b36SAndroid Build Coastguard Worker	return false
188*333d2b36SAndroid Build Coastguard Worker}
189*333d2b36SAndroid Build Coastguard Worker
190*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) SetPreventInstall() {
191*333d2b36SAndroid Build Coastguard Worker	mod.Properties.PreventInstall = true
192*333d2b36SAndroid Build Coastguard Worker}
193*333d2b36SAndroid Build Coastguard Worker
194*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) SetHideFromMake() {
195*333d2b36SAndroid Build Coastguard Worker	mod.Properties.HideFromMake = true
196*333d2b36SAndroid Build Coastguard Worker}
197*333d2b36SAndroid Build Coastguard Worker
198*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) HiddenFromMake() bool {
199*333d2b36SAndroid Build Coastguard Worker	return mod.Properties.HideFromMake
200*333d2b36SAndroid Build Coastguard Worker}
201*333d2b36SAndroid Build Coastguard Worker
202*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) SanitizePropDefined() bool {
203*333d2b36SAndroid Build Coastguard Worker	// Because compiler is not set for some Rust modules where sanitize might be set, check that compiler is also not
204*333d2b36SAndroid Build Coastguard Worker	// nil since we need compiler to actually sanitize.
205*333d2b36SAndroid Build Coastguard Worker	return mod.sanitize != nil && mod.compiler != nil
206*333d2b36SAndroid Build Coastguard Worker}
207*333d2b36SAndroid Build Coastguard Worker
208*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) IsPrebuilt() bool {
209*333d2b36SAndroid Build Coastguard Worker	if _, ok := mod.compiler.(*prebuiltLibraryDecorator); ok {
210*333d2b36SAndroid Build Coastguard Worker		return true
211*333d2b36SAndroid Build Coastguard Worker	}
212*333d2b36SAndroid Build Coastguard Worker	return false
213*333d2b36SAndroid Build Coastguard Worker}
214*333d2b36SAndroid Build Coastguard Worker
215*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) SelectedStl() string {
216*333d2b36SAndroid Build Coastguard Worker	return ""
217*333d2b36SAndroid Build Coastguard Worker}
218*333d2b36SAndroid Build Coastguard Worker
219*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) NonCcVariants() bool {
220*333d2b36SAndroid Build Coastguard Worker	if mod.compiler != nil {
221*333d2b36SAndroid Build Coastguard Worker		if library, ok := mod.compiler.(libraryInterface); ok {
222*333d2b36SAndroid Build Coastguard Worker			return library.buildRlib() || library.buildDylib()
223*333d2b36SAndroid Build Coastguard Worker		}
224*333d2b36SAndroid Build Coastguard Worker	}
225*333d2b36SAndroid Build Coastguard Worker	panic(fmt.Errorf("NonCcVariants called on non-library module: %q", mod.BaseModuleName()))
226*333d2b36SAndroid Build Coastguard Worker}
227*333d2b36SAndroid Build Coastguard Worker
228*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) Static() bool {
229*333d2b36SAndroid Build Coastguard Worker	if mod.compiler != nil {
230*333d2b36SAndroid Build Coastguard Worker		if library, ok := mod.compiler.(libraryInterface); ok {
231*333d2b36SAndroid Build Coastguard Worker			return library.static()
232*333d2b36SAndroid Build Coastguard Worker		}
233*333d2b36SAndroid Build Coastguard Worker	}
234*333d2b36SAndroid Build Coastguard Worker	return false
235*333d2b36SAndroid Build Coastguard Worker}
236*333d2b36SAndroid Build Coastguard Worker
237*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) Shared() bool {
238*333d2b36SAndroid Build Coastguard Worker	if mod.compiler != nil {
239*333d2b36SAndroid Build Coastguard Worker		if library, ok := mod.compiler.(libraryInterface); ok {
240*333d2b36SAndroid Build Coastguard Worker			return library.shared()
241*333d2b36SAndroid Build Coastguard Worker		}
242*333d2b36SAndroid Build Coastguard Worker	}
243*333d2b36SAndroid Build Coastguard Worker	return false
244*333d2b36SAndroid Build Coastguard Worker}
245*333d2b36SAndroid Build Coastguard Worker
246*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) Dylib() bool {
247*333d2b36SAndroid Build Coastguard Worker	if mod.compiler != nil {
248*333d2b36SAndroid Build Coastguard Worker		if library, ok := mod.compiler.(libraryInterface); ok {
249*333d2b36SAndroid Build Coastguard Worker			return library.dylib()
250*333d2b36SAndroid Build Coastguard Worker		}
251*333d2b36SAndroid Build Coastguard Worker	}
252*333d2b36SAndroid Build Coastguard Worker	return false
253*333d2b36SAndroid Build Coastguard Worker}
254*333d2b36SAndroid Build Coastguard Worker
255*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) Source() bool {
256*333d2b36SAndroid Build Coastguard Worker	if mod.compiler != nil {
257*333d2b36SAndroid Build Coastguard Worker		if library, ok := mod.compiler.(libraryInterface); ok && mod.sourceProvider != nil {
258*333d2b36SAndroid Build Coastguard Worker			return library.source()
259*333d2b36SAndroid Build Coastguard Worker		}
260*333d2b36SAndroid Build Coastguard Worker	}
261*333d2b36SAndroid Build Coastguard Worker	return false
262*333d2b36SAndroid Build Coastguard Worker}
263*333d2b36SAndroid Build Coastguard Worker
264*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) RlibStd() bool {
265*333d2b36SAndroid Build Coastguard Worker	if mod.compiler != nil {
266*333d2b36SAndroid Build Coastguard Worker		if library, ok := mod.compiler.(libraryInterface); ok && library.rlib() {
267*333d2b36SAndroid Build Coastguard Worker			return library.rlibStd()
268*333d2b36SAndroid Build Coastguard Worker		}
269*333d2b36SAndroid Build Coastguard Worker	}
270*333d2b36SAndroid Build Coastguard Worker	panic(fmt.Errorf("RlibStd() called on non-rlib module: %q", mod.BaseModuleName()))
271*333d2b36SAndroid Build Coastguard Worker}
272*333d2b36SAndroid Build Coastguard Worker
273*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) Rlib() bool {
274*333d2b36SAndroid Build Coastguard Worker	if mod.compiler != nil {
275*333d2b36SAndroid Build Coastguard Worker		if library, ok := mod.compiler.(libraryInterface); ok {
276*333d2b36SAndroid Build Coastguard Worker			return library.rlib()
277*333d2b36SAndroid Build Coastguard Worker		}
278*333d2b36SAndroid Build Coastguard Worker	}
279*333d2b36SAndroid Build Coastguard Worker	return false
280*333d2b36SAndroid Build Coastguard Worker}
281*333d2b36SAndroid Build Coastguard Worker
282*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) Binary() bool {
283*333d2b36SAndroid Build Coastguard Worker	if binary, ok := mod.compiler.(binaryInterface); ok {
284*333d2b36SAndroid Build Coastguard Worker		return binary.binary()
285*333d2b36SAndroid Build Coastguard Worker	}
286*333d2b36SAndroid Build Coastguard Worker	return false
287*333d2b36SAndroid Build Coastguard Worker}
288*333d2b36SAndroid Build Coastguard Worker
289*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) StaticExecutable() bool {
290*333d2b36SAndroid Build Coastguard Worker	if !mod.Binary() {
291*333d2b36SAndroid Build Coastguard Worker		return false
292*333d2b36SAndroid Build Coastguard Worker	}
293*333d2b36SAndroid Build Coastguard Worker	return mod.StaticallyLinked()
294*333d2b36SAndroid Build Coastguard Worker}
295*333d2b36SAndroid Build Coastguard Worker
296*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) ApexExclude() bool {
297*333d2b36SAndroid Build Coastguard Worker	if mod.compiler != nil {
298*333d2b36SAndroid Build Coastguard Worker		if library, ok := mod.compiler.(libraryInterface); ok {
299*333d2b36SAndroid Build Coastguard Worker			return library.apexExclude()
300*333d2b36SAndroid Build Coastguard Worker		}
301*333d2b36SAndroid Build Coastguard Worker	}
302*333d2b36SAndroid Build Coastguard Worker	return false
303*333d2b36SAndroid Build Coastguard Worker}
304*333d2b36SAndroid Build Coastguard Worker
305*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) Object() bool {
306*333d2b36SAndroid Build Coastguard Worker	// Rust has no modules which produce only object files.
307*333d2b36SAndroid Build Coastguard Worker	return false
308*333d2b36SAndroid Build Coastguard Worker}
309*333d2b36SAndroid Build Coastguard Worker
310*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) Toc() android.OptionalPath {
311*333d2b36SAndroid Build Coastguard Worker	if mod.compiler != nil {
312*333d2b36SAndroid Build Coastguard Worker		if lib, ok := mod.compiler.(libraryInterface); ok {
313*333d2b36SAndroid Build Coastguard Worker			return lib.toc()
314*333d2b36SAndroid Build Coastguard Worker		}
315*333d2b36SAndroid Build Coastguard Worker	}
316*333d2b36SAndroid Build Coastguard Worker	panic(fmt.Errorf("Toc() called on non-library module: %q", mod.BaseModuleName()))
317*333d2b36SAndroid Build Coastguard Worker}
318*333d2b36SAndroid Build Coastguard Worker
319*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) UseSdk() bool {
320*333d2b36SAndroid Build Coastguard Worker	return false
321*333d2b36SAndroid Build Coastguard Worker}
322*333d2b36SAndroid Build Coastguard Worker
323*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) RelativeInstallPath() string {
324*333d2b36SAndroid Build Coastguard Worker	if mod.compiler != nil {
325*333d2b36SAndroid Build Coastguard Worker		return mod.compiler.relativeInstallPath()
326*333d2b36SAndroid Build Coastguard Worker	}
327*333d2b36SAndroid Build Coastguard Worker	return ""
328*333d2b36SAndroid Build Coastguard Worker}
329*333d2b36SAndroid Build Coastguard Worker
330*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) UseVndk() bool {
331*333d2b36SAndroid Build Coastguard Worker	return mod.Properties.VndkVersion != ""
332*333d2b36SAndroid Build Coastguard Worker}
333*333d2b36SAndroid Build Coastguard Worker
334*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) Bootstrap() bool {
335*333d2b36SAndroid Build Coastguard Worker	return Bool(mod.Properties.Bootstrap)
336*333d2b36SAndroid Build Coastguard Worker}
337*333d2b36SAndroid Build Coastguard Worker
338*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) SubName() string {
339*333d2b36SAndroid Build Coastguard Worker	return mod.Properties.SubName
340*333d2b36SAndroid Build Coastguard Worker}
341*333d2b36SAndroid Build Coastguard Worker
342*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) IsVndkPrebuiltLibrary() bool {
343*333d2b36SAndroid Build Coastguard Worker	// Rust modules do not provide VNDK prebuilts
344*333d2b36SAndroid Build Coastguard Worker	return false
345*333d2b36SAndroid Build Coastguard Worker}
346*333d2b36SAndroid Build Coastguard Worker
347*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) IsVendorPublicLibrary() bool {
348*333d2b36SAndroid Build Coastguard Worker	return mod.VendorProperties.IsVendorPublicLibrary
349*333d2b36SAndroid Build Coastguard Worker}
350*333d2b36SAndroid Build Coastguard Worker
351*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) SdkAndPlatformVariantVisibleToMake() bool {
352*333d2b36SAndroid Build Coastguard Worker	// Rust modules to not provide Sdk variants
353*333d2b36SAndroid Build Coastguard Worker	return false
354*333d2b36SAndroid Build Coastguard Worker}
355*333d2b36SAndroid Build Coastguard Worker
356*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) IsVndkPrivate() bool {
357*333d2b36SAndroid Build Coastguard Worker	return false
358*333d2b36SAndroid Build Coastguard Worker}
359*333d2b36SAndroid Build Coastguard Worker
360*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) IsLlndk() bool {
361*333d2b36SAndroid Build Coastguard Worker	return false
362*333d2b36SAndroid Build Coastguard Worker}
363*333d2b36SAndroid Build Coastguard Worker
364*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) KernelHeadersDecorator() bool {
365*333d2b36SAndroid Build Coastguard Worker	return false
366*333d2b36SAndroid Build Coastguard Worker}
367*333d2b36SAndroid Build Coastguard Worker
368*333d2b36SAndroid Build Coastguard Workerfunc (m *Module) NeedsLlndkVariants() bool {
369*333d2b36SAndroid Build Coastguard Worker	return false
370*333d2b36SAndroid Build Coastguard Worker}
371*333d2b36SAndroid Build Coastguard Worker
372*333d2b36SAndroid Build Coastguard Workerfunc (m *Module) NeedsVendorPublicLibraryVariants() bool {
373*333d2b36SAndroid Build Coastguard Worker	return false
374*333d2b36SAndroid Build Coastguard Worker}
375*333d2b36SAndroid Build Coastguard Worker
376*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) HasLlndkStubs() bool {
377*333d2b36SAndroid Build Coastguard Worker	return false
378*333d2b36SAndroid Build Coastguard Worker}
379*333d2b36SAndroid Build Coastguard Worker
380*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) StubsVersion() string {
381*333d2b36SAndroid Build Coastguard Worker	panic(fmt.Errorf("StubsVersion called on non-versioned module: %q", mod.BaseModuleName()))
382*333d2b36SAndroid Build Coastguard Worker}
383*333d2b36SAndroid Build Coastguard Worker
384*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) SdkVersion() string {
385*333d2b36SAndroid Build Coastguard Worker	return ""
386*333d2b36SAndroid Build Coastguard Worker}
387*333d2b36SAndroid Build Coastguard Worker
388*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) AlwaysSdk() bool {
389*333d2b36SAndroid Build Coastguard Worker	return false
390*333d2b36SAndroid Build Coastguard Worker}
391*333d2b36SAndroid Build Coastguard Worker
392*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) IsSdkVariant() bool {
393*333d2b36SAndroid Build Coastguard Worker	return false
394*333d2b36SAndroid Build Coastguard Worker}
395*333d2b36SAndroid Build Coastguard Worker
396*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) SplitPerApiLevel() bool {
397*333d2b36SAndroid Build Coastguard Worker	return false
398*333d2b36SAndroid Build Coastguard Worker}
399*333d2b36SAndroid Build Coastguard Worker
400*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) XrefRustFiles() android.Paths {
401*333d2b36SAndroid Build Coastguard Worker	return mod.kytheFiles
402*333d2b36SAndroid Build Coastguard Worker}
403*333d2b36SAndroid Build Coastguard Worker
404*333d2b36SAndroid Build Coastguard Workertype Deps struct {
405*333d2b36SAndroid Build Coastguard Worker	Dylibs          []string
406*333d2b36SAndroid Build Coastguard Worker	Rlibs           []string
407*333d2b36SAndroid Build Coastguard Worker	Rustlibs        []string
408*333d2b36SAndroid Build Coastguard Worker	Stdlibs         []string
409*333d2b36SAndroid Build Coastguard Worker	ProcMacros      []string
410*333d2b36SAndroid Build Coastguard Worker	SharedLibs      []string
411*333d2b36SAndroid Build Coastguard Worker	StaticLibs      []string
412*333d2b36SAndroid Build Coastguard Worker	WholeStaticLibs []string
413*333d2b36SAndroid Build Coastguard Worker	HeaderLibs      []string
414*333d2b36SAndroid Build Coastguard Worker
415*333d2b36SAndroid Build Coastguard Worker	// Used for data dependencies adjacent to tests
416*333d2b36SAndroid Build Coastguard Worker	DataLibs []string
417*333d2b36SAndroid Build Coastguard Worker	DataBins []string
418*333d2b36SAndroid Build Coastguard Worker
419*333d2b36SAndroid Build Coastguard Worker	CrtBegin, CrtEnd []string
420*333d2b36SAndroid Build Coastguard Worker}
421*333d2b36SAndroid Build Coastguard Worker
422*333d2b36SAndroid Build Coastguard Workertype PathDeps struct {
423*333d2b36SAndroid Build Coastguard Worker	DyLibs        RustLibraries
424*333d2b36SAndroid Build Coastguard Worker	RLibs         RustLibraries
425*333d2b36SAndroid Build Coastguard Worker	SharedLibs    android.Paths
426*333d2b36SAndroid Build Coastguard Worker	SharedLibDeps android.Paths
427*333d2b36SAndroid Build Coastguard Worker	StaticLibs    android.Paths
428*333d2b36SAndroid Build Coastguard Worker	ProcMacros    RustLibraries
429*333d2b36SAndroid Build Coastguard Worker	AfdoProfiles  android.Paths
430*333d2b36SAndroid Build Coastguard Worker
431*333d2b36SAndroid Build Coastguard Worker	// depFlags and depLinkFlags are rustc and linker (clang) flags.
432*333d2b36SAndroid Build Coastguard Worker	depFlags     []string
433*333d2b36SAndroid Build Coastguard Worker	depLinkFlags []string
434*333d2b36SAndroid Build Coastguard Worker
435*333d2b36SAndroid Build Coastguard Worker	// linkDirs are link paths passed via -L to rustc. linkObjects are objects passed directly to the linker
436*333d2b36SAndroid Build Coastguard Worker	// Both of these are exported and propagate to dependencies.
437*333d2b36SAndroid Build Coastguard Worker	linkDirs    []string
438*333d2b36SAndroid Build Coastguard Worker	linkObjects []string
439*333d2b36SAndroid Build Coastguard Worker
440*333d2b36SAndroid Build Coastguard Worker	// exportedLinkDirs are exported linkDirs for direct rlib dependencies to
441*333d2b36SAndroid Build Coastguard Worker	// cc_library_static dependants of rlibs.
442*333d2b36SAndroid Build Coastguard Worker	// Track them separately from linkDirs so superfluous -L flags don't get emitted.
443*333d2b36SAndroid Build Coastguard Worker	exportedLinkDirs []string
444*333d2b36SAndroid Build Coastguard Worker
445*333d2b36SAndroid Build Coastguard Worker	// Used by bindgen modules which call clang
446*333d2b36SAndroid Build Coastguard Worker	depClangFlags         []string
447*333d2b36SAndroid Build Coastguard Worker	depIncludePaths       android.Paths
448*333d2b36SAndroid Build Coastguard Worker	depGeneratedHeaders   android.Paths
449*333d2b36SAndroid Build Coastguard Worker	depSystemIncludePaths android.Paths
450*333d2b36SAndroid Build Coastguard Worker
451*333d2b36SAndroid Build Coastguard Worker	CrtBegin android.Paths
452*333d2b36SAndroid Build Coastguard Worker	CrtEnd   android.Paths
453*333d2b36SAndroid Build Coastguard Worker
454*333d2b36SAndroid Build Coastguard Worker	// Paths to generated source files
455*333d2b36SAndroid Build Coastguard Worker	SrcDeps          android.Paths
456*333d2b36SAndroid Build Coastguard Worker	srcProviderFiles android.Paths
457*333d2b36SAndroid Build Coastguard Worker
458*333d2b36SAndroid Build Coastguard Worker	directImplementationDeps     android.Paths
459*333d2b36SAndroid Build Coastguard Worker	transitiveImplementationDeps []depset.DepSet[android.Path]
460*333d2b36SAndroid Build Coastguard Worker}
461*333d2b36SAndroid Build Coastguard Worker
462*333d2b36SAndroid Build Coastguard Workertype RustLibraries []RustLibrary
463*333d2b36SAndroid Build Coastguard Worker
464*333d2b36SAndroid Build Coastguard Workertype RustLibrary struct {
465*333d2b36SAndroid Build Coastguard Worker	Path      android.Path
466*333d2b36SAndroid Build Coastguard Worker	CrateName string
467*333d2b36SAndroid Build Coastguard Worker}
468*333d2b36SAndroid Build Coastguard Worker
469*333d2b36SAndroid Build Coastguard Workertype exportedFlagsProducer interface {
470*333d2b36SAndroid Build Coastguard Worker	exportLinkDirs(...string)
471*333d2b36SAndroid Build Coastguard Worker	exportLinkObjects(...string)
472*333d2b36SAndroid Build Coastguard Worker}
473*333d2b36SAndroid Build Coastguard Worker
474*333d2b36SAndroid Build Coastguard Workertype xref interface {
475*333d2b36SAndroid Build Coastguard Worker	XrefRustFiles() android.Paths
476*333d2b36SAndroid Build Coastguard Worker}
477*333d2b36SAndroid Build Coastguard Worker
478*333d2b36SAndroid Build Coastguard Workertype flagExporter struct {
479*333d2b36SAndroid Build Coastguard Worker	linkDirs    []string
480*333d2b36SAndroid Build Coastguard Worker	ccLinkDirs  []string
481*333d2b36SAndroid Build Coastguard Worker	linkObjects []string
482*333d2b36SAndroid Build Coastguard Worker}
483*333d2b36SAndroid Build Coastguard Worker
484*333d2b36SAndroid Build Coastguard Workerfunc (flagExporter *flagExporter) exportLinkDirs(dirs ...string) {
485*333d2b36SAndroid Build Coastguard Worker	flagExporter.linkDirs = android.FirstUniqueStrings(append(flagExporter.linkDirs, dirs...))
486*333d2b36SAndroid Build Coastguard Worker}
487*333d2b36SAndroid Build Coastguard Worker
488*333d2b36SAndroid Build Coastguard Workerfunc (flagExporter *flagExporter) exportLinkObjects(flags ...string) {
489*333d2b36SAndroid Build Coastguard Worker	flagExporter.linkObjects = android.FirstUniqueStrings(append(flagExporter.linkObjects, flags...))
490*333d2b36SAndroid Build Coastguard Worker}
491*333d2b36SAndroid Build Coastguard Worker
492*333d2b36SAndroid Build Coastguard Workerfunc (flagExporter *flagExporter) setProvider(ctx ModuleContext) {
493*333d2b36SAndroid Build Coastguard Worker	android.SetProvider(ctx, FlagExporterInfoProvider, FlagExporterInfo{
494*333d2b36SAndroid Build Coastguard Worker		LinkDirs:    flagExporter.linkDirs,
495*333d2b36SAndroid Build Coastguard Worker		LinkObjects: flagExporter.linkObjects,
496*333d2b36SAndroid Build Coastguard Worker	})
497*333d2b36SAndroid Build Coastguard Worker}
498*333d2b36SAndroid Build Coastguard Worker
499*333d2b36SAndroid Build Coastguard Workervar _ exportedFlagsProducer = (*flagExporter)(nil)
500*333d2b36SAndroid Build Coastguard Worker
501*333d2b36SAndroid Build Coastguard Workerfunc NewFlagExporter() *flagExporter {
502*333d2b36SAndroid Build Coastguard Worker	return &flagExporter{}
503*333d2b36SAndroid Build Coastguard Worker}
504*333d2b36SAndroid Build Coastguard Worker
505*333d2b36SAndroid Build Coastguard Workertype FlagExporterInfo struct {
506*333d2b36SAndroid Build Coastguard Worker	Flags       []string
507*333d2b36SAndroid Build Coastguard Worker	LinkDirs    []string // TODO: this should be android.Paths
508*333d2b36SAndroid Build Coastguard Worker	LinkObjects []string // TODO: this should be android.Paths
509*333d2b36SAndroid Build Coastguard Worker}
510*333d2b36SAndroid Build Coastguard Worker
511*333d2b36SAndroid Build Coastguard Workervar FlagExporterInfoProvider = blueprint.NewProvider[FlagExporterInfo]()
512*333d2b36SAndroid Build Coastguard Worker
513*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) isCoverageVariant() bool {
514*333d2b36SAndroid Build Coastguard Worker	return mod.coverage.Properties.IsCoverageVariant
515*333d2b36SAndroid Build Coastguard Worker}
516*333d2b36SAndroid Build Coastguard Worker
517*333d2b36SAndroid Build Coastguard Workervar _ cc.Coverage = (*Module)(nil)
518*333d2b36SAndroid Build Coastguard Worker
519*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) IsNativeCoverageNeeded(ctx cc.IsNativeCoverageNeededContext) bool {
520*333d2b36SAndroid Build Coastguard Worker	return mod.coverage != nil && mod.coverage.Properties.NeedCoverageVariant
521*333d2b36SAndroid Build Coastguard Worker}
522*333d2b36SAndroid Build Coastguard Worker
523*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) VndkVersion() string {
524*333d2b36SAndroid Build Coastguard Worker	return mod.Properties.VndkVersion
525*333d2b36SAndroid Build Coastguard Worker}
526*333d2b36SAndroid Build Coastguard Worker
527*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) ExportedCrateLinkDirs() []string {
528*333d2b36SAndroid Build Coastguard Worker	return mod.exportedLinkDirs
529*333d2b36SAndroid Build Coastguard Worker}
530*333d2b36SAndroid Build Coastguard Worker
531*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) PreventInstall() bool {
532*333d2b36SAndroid Build Coastguard Worker	return mod.Properties.PreventInstall
533*333d2b36SAndroid Build Coastguard Worker}
534*333d2b36SAndroid Build Coastguard Worker
535*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) MarkAsCoverageVariant(coverage bool) {
536*333d2b36SAndroid Build Coastguard Worker	mod.coverage.Properties.IsCoverageVariant = coverage
537*333d2b36SAndroid Build Coastguard Worker}
538*333d2b36SAndroid Build Coastguard Worker
539*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) EnableCoverageIfNeeded() {
540*333d2b36SAndroid Build Coastguard Worker	mod.coverage.Properties.CoverageEnabled = mod.coverage.Properties.NeedCoverageBuild
541*333d2b36SAndroid Build Coastguard Worker}
542*333d2b36SAndroid Build Coastguard Worker
543*333d2b36SAndroid Build Coastguard Workerfunc defaultsFactory() android.Module {
544*333d2b36SAndroid Build Coastguard Worker	return DefaultsFactory()
545*333d2b36SAndroid Build Coastguard Worker}
546*333d2b36SAndroid Build Coastguard Worker
547*333d2b36SAndroid Build Coastguard Workertype Defaults struct {
548*333d2b36SAndroid Build Coastguard Worker	android.ModuleBase
549*333d2b36SAndroid Build Coastguard Worker	android.DefaultsModuleBase
550*333d2b36SAndroid Build Coastguard Worker}
551*333d2b36SAndroid Build Coastguard Worker
552*333d2b36SAndroid Build Coastguard Workerfunc DefaultsFactory(props ...interface{}) android.Module {
553*333d2b36SAndroid Build Coastguard Worker	module := &Defaults{}
554*333d2b36SAndroid Build Coastguard Worker
555*333d2b36SAndroid Build Coastguard Worker	module.AddProperties(props...)
556*333d2b36SAndroid Build Coastguard Worker	module.AddProperties(
557*333d2b36SAndroid Build Coastguard Worker		&BaseProperties{},
558*333d2b36SAndroid Build Coastguard Worker		&cc.AfdoProperties{},
559*333d2b36SAndroid Build Coastguard Worker		&cc.VendorProperties{},
560*333d2b36SAndroid Build Coastguard Worker		&BenchmarkProperties{},
561*333d2b36SAndroid Build Coastguard Worker		&BindgenProperties{},
562*333d2b36SAndroid Build Coastguard Worker		&BaseCompilerProperties{},
563*333d2b36SAndroid Build Coastguard Worker		&BinaryCompilerProperties{},
564*333d2b36SAndroid Build Coastguard Worker		&LibraryCompilerProperties{},
565*333d2b36SAndroid Build Coastguard Worker		&ProcMacroCompilerProperties{},
566*333d2b36SAndroid Build Coastguard Worker		&PrebuiltProperties{},
567*333d2b36SAndroid Build Coastguard Worker		&SourceProviderProperties{},
568*333d2b36SAndroid Build Coastguard Worker		&TestProperties{},
569*333d2b36SAndroid Build Coastguard Worker		&cc.CoverageProperties{},
570*333d2b36SAndroid Build Coastguard Worker		&cc.RustBindgenClangProperties{},
571*333d2b36SAndroid Build Coastguard Worker		&ClippyProperties{},
572*333d2b36SAndroid Build Coastguard Worker		&SanitizeProperties{},
573*333d2b36SAndroid Build Coastguard Worker		&fuzz.FuzzProperties{},
574*333d2b36SAndroid Build Coastguard Worker	)
575*333d2b36SAndroid Build Coastguard Worker
576*333d2b36SAndroid Build Coastguard Worker	android.InitDefaultsModule(module)
577*333d2b36SAndroid Build Coastguard Worker	return module
578*333d2b36SAndroid Build Coastguard Worker}
579*333d2b36SAndroid Build Coastguard Worker
580*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) CrateName() string {
581*333d2b36SAndroid Build Coastguard Worker	return mod.compiler.crateName()
582*333d2b36SAndroid Build Coastguard Worker}
583*333d2b36SAndroid Build Coastguard Worker
584*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) CcLibrary() bool {
585*333d2b36SAndroid Build Coastguard Worker	if mod.compiler != nil {
586*333d2b36SAndroid Build Coastguard Worker		if _, ok := mod.compiler.(libraryInterface); ok {
587*333d2b36SAndroid Build Coastguard Worker			return true
588*333d2b36SAndroid Build Coastguard Worker		}
589*333d2b36SAndroid Build Coastguard Worker	}
590*333d2b36SAndroid Build Coastguard Worker	return false
591*333d2b36SAndroid Build Coastguard Worker}
592*333d2b36SAndroid Build Coastguard Worker
593*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) CcLibraryInterface() bool {
594*333d2b36SAndroid Build Coastguard Worker	if mod.compiler != nil {
595*333d2b36SAndroid Build Coastguard Worker		// use build{Static,Shared}() instead of {static,shared}() here because this might be called before
596*333d2b36SAndroid Build Coastguard Worker		// VariantIs{Static,Shared} is set.
597*333d2b36SAndroid Build Coastguard Worker		if lib, ok := mod.compiler.(libraryInterface); ok && (lib.buildShared() || lib.buildStatic()) {
598*333d2b36SAndroid Build Coastguard Worker			return true
599*333d2b36SAndroid Build Coastguard Worker		}
600*333d2b36SAndroid Build Coastguard Worker	}
601*333d2b36SAndroid Build Coastguard Worker	return false
602*333d2b36SAndroid Build Coastguard Worker}
603*333d2b36SAndroid Build Coastguard Worker
604*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) RustLibraryInterface() bool {
605*333d2b36SAndroid Build Coastguard Worker	if mod.compiler != nil {
606*333d2b36SAndroid Build Coastguard Worker		if _, ok := mod.compiler.(libraryInterface); ok {
607*333d2b36SAndroid Build Coastguard Worker			return true
608*333d2b36SAndroid Build Coastguard Worker		}
609*333d2b36SAndroid Build Coastguard Worker	}
610*333d2b36SAndroid Build Coastguard Worker	return false
611*333d2b36SAndroid Build Coastguard Worker}
612*333d2b36SAndroid Build Coastguard Worker
613*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) IsFuzzModule() bool {
614*333d2b36SAndroid Build Coastguard Worker	if _, ok := mod.compiler.(*fuzzDecorator); ok {
615*333d2b36SAndroid Build Coastguard Worker		return true
616*333d2b36SAndroid Build Coastguard Worker	}
617*333d2b36SAndroid Build Coastguard Worker	return false
618*333d2b36SAndroid Build Coastguard Worker}
619*333d2b36SAndroid Build Coastguard Worker
620*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) FuzzModuleStruct() fuzz.FuzzModule {
621*333d2b36SAndroid Build Coastguard Worker	return mod.FuzzModule
622*333d2b36SAndroid Build Coastguard Worker}
623*333d2b36SAndroid Build Coastguard Worker
624*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) FuzzPackagedModule() fuzz.FuzzPackagedModule {
625*333d2b36SAndroid Build Coastguard Worker	if fuzzer, ok := mod.compiler.(*fuzzDecorator); ok {
626*333d2b36SAndroid Build Coastguard Worker		return fuzzer.fuzzPackagedModule
627*333d2b36SAndroid Build Coastguard Worker	}
628*333d2b36SAndroid Build Coastguard Worker	panic(fmt.Errorf("FuzzPackagedModule called on non-fuzz module: %q", mod.BaseModuleName()))
629*333d2b36SAndroid Build Coastguard Worker}
630*333d2b36SAndroid Build Coastguard Worker
631*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) FuzzSharedLibraries() android.RuleBuilderInstalls {
632*333d2b36SAndroid Build Coastguard Worker	if fuzzer, ok := mod.compiler.(*fuzzDecorator); ok {
633*333d2b36SAndroid Build Coastguard Worker		return fuzzer.sharedLibraries
634*333d2b36SAndroid Build Coastguard Worker	}
635*333d2b36SAndroid Build Coastguard Worker	panic(fmt.Errorf("FuzzSharedLibraries called on non-fuzz module: %q", mod.BaseModuleName()))
636*333d2b36SAndroid Build Coastguard Worker}
637*333d2b36SAndroid Build Coastguard Worker
638*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) UnstrippedOutputFile() android.Path {
639*333d2b36SAndroid Build Coastguard Worker	if mod.compiler != nil {
640*333d2b36SAndroid Build Coastguard Worker		return mod.compiler.unstrippedOutputFilePath()
641*333d2b36SAndroid Build Coastguard Worker	}
642*333d2b36SAndroid Build Coastguard Worker	return nil
643*333d2b36SAndroid Build Coastguard Worker}
644*333d2b36SAndroid Build Coastguard Worker
645*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) SetStatic() {
646*333d2b36SAndroid Build Coastguard Worker	if mod.compiler != nil {
647*333d2b36SAndroid Build Coastguard Worker		if library, ok := mod.compiler.(libraryInterface); ok {
648*333d2b36SAndroid Build Coastguard Worker			library.setStatic()
649*333d2b36SAndroid Build Coastguard Worker			return
650*333d2b36SAndroid Build Coastguard Worker		}
651*333d2b36SAndroid Build Coastguard Worker	}
652*333d2b36SAndroid Build Coastguard Worker	panic(fmt.Errorf("SetStatic called on non-library module: %q", mod.BaseModuleName()))
653*333d2b36SAndroid Build Coastguard Worker}
654*333d2b36SAndroid Build Coastguard Worker
655*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) SetShared() {
656*333d2b36SAndroid Build Coastguard Worker	if mod.compiler != nil {
657*333d2b36SAndroid Build Coastguard Worker		if library, ok := mod.compiler.(libraryInterface); ok {
658*333d2b36SAndroid Build Coastguard Worker			library.setShared()
659*333d2b36SAndroid Build Coastguard Worker			return
660*333d2b36SAndroid Build Coastguard Worker		}
661*333d2b36SAndroid Build Coastguard Worker	}
662*333d2b36SAndroid Build Coastguard Worker	panic(fmt.Errorf("SetShared called on non-library module: %q", mod.BaseModuleName()))
663*333d2b36SAndroid Build Coastguard Worker}
664*333d2b36SAndroid Build Coastguard Worker
665*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) BuildStaticVariant() bool {
666*333d2b36SAndroid Build Coastguard Worker	if mod.compiler != nil {
667*333d2b36SAndroid Build Coastguard Worker		if library, ok := mod.compiler.(libraryInterface); ok {
668*333d2b36SAndroid Build Coastguard Worker			return library.buildStatic()
669*333d2b36SAndroid Build Coastguard Worker		}
670*333d2b36SAndroid Build Coastguard Worker	}
671*333d2b36SAndroid Build Coastguard Worker	panic(fmt.Errorf("BuildStaticVariant called on non-library module: %q", mod.BaseModuleName()))
672*333d2b36SAndroid Build Coastguard Worker}
673*333d2b36SAndroid Build Coastguard Worker
674*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) BuildRlibVariant() bool {
675*333d2b36SAndroid Build Coastguard Worker	if mod.compiler != nil {
676*333d2b36SAndroid Build Coastguard Worker		if library, ok := mod.compiler.(libraryInterface); ok {
677*333d2b36SAndroid Build Coastguard Worker			return library.buildRlib()
678*333d2b36SAndroid Build Coastguard Worker		}
679*333d2b36SAndroid Build Coastguard Worker	}
680*333d2b36SAndroid Build Coastguard Worker	panic(fmt.Errorf("BuildRlibVariant called on non-library module: %q", mod.BaseModuleName()))
681*333d2b36SAndroid Build Coastguard Worker}
682*333d2b36SAndroid Build Coastguard Worker
683*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) IsRustFFI() bool {
684*333d2b36SAndroid Build Coastguard Worker	if mod.compiler != nil {
685*333d2b36SAndroid Build Coastguard Worker		if library, ok := mod.compiler.(libraryInterface); ok {
686*333d2b36SAndroid Build Coastguard Worker			return library.isFFILibrary()
687*333d2b36SAndroid Build Coastguard Worker		}
688*333d2b36SAndroid Build Coastguard Worker	}
689*333d2b36SAndroid Build Coastguard Worker	return false
690*333d2b36SAndroid Build Coastguard Worker}
691*333d2b36SAndroid Build Coastguard Worker
692*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) BuildSharedVariant() bool {
693*333d2b36SAndroid Build Coastguard Worker	if mod.compiler != nil {
694*333d2b36SAndroid Build Coastguard Worker		if library, ok := mod.compiler.(libraryInterface); ok {
695*333d2b36SAndroid Build Coastguard Worker			return library.buildShared()
696*333d2b36SAndroid Build Coastguard Worker		}
697*333d2b36SAndroid Build Coastguard Worker	}
698*333d2b36SAndroid Build Coastguard Worker	panic(fmt.Errorf("BuildSharedVariant called on non-library module: %q", mod.BaseModuleName()))
699*333d2b36SAndroid Build Coastguard Worker}
700*333d2b36SAndroid Build Coastguard Worker
701*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) Module() android.Module {
702*333d2b36SAndroid Build Coastguard Worker	return mod
703*333d2b36SAndroid Build Coastguard Worker}
704*333d2b36SAndroid Build Coastguard Worker
705*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) OutputFile() android.OptionalPath {
706*333d2b36SAndroid Build Coastguard Worker	return mod.outputFile
707*333d2b36SAndroid Build Coastguard Worker}
708*333d2b36SAndroid Build Coastguard Worker
709*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) CoverageFiles() android.Paths {
710*333d2b36SAndroid Build Coastguard Worker	if mod.compiler != nil {
711*333d2b36SAndroid Build Coastguard Worker		return android.Paths{}
712*333d2b36SAndroid Build Coastguard Worker	}
713*333d2b36SAndroid Build Coastguard Worker	panic(fmt.Errorf("CoverageFiles called on non-library module: %q", mod.BaseModuleName()))
714*333d2b36SAndroid Build Coastguard Worker}
715*333d2b36SAndroid Build Coastguard Worker
716*333d2b36SAndroid Build Coastguard Worker// Rust does not produce gcno files, and therefore does not produce a coverage archive.
717*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) CoverageOutputFile() android.OptionalPath {
718*333d2b36SAndroid Build Coastguard Worker	return android.OptionalPath{}
719*333d2b36SAndroid Build Coastguard Worker}
720*333d2b36SAndroid Build Coastguard Worker
721*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) IsNdk(config android.Config) bool {
722*333d2b36SAndroid Build Coastguard Worker	return false
723*333d2b36SAndroid Build Coastguard Worker}
724*333d2b36SAndroid Build Coastguard Worker
725*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) HasStubsVariants() bool {
726*333d2b36SAndroid Build Coastguard Worker	return false
727*333d2b36SAndroid Build Coastguard Worker}
728*333d2b36SAndroid Build Coastguard Worker
729*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) IsStubs() bool {
730*333d2b36SAndroid Build Coastguard Worker	return false
731*333d2b36SAndroid Build Coastguard Worker}
732*333d2b36SAndroid Build Coastguard Worker
733*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) installable(apexInfo android.ApexInfo) bool {
734*333d2b36SAndroid Build Coastguard Worker	if !proptools.BoolDefault(mod.Installable(), mod.EverInstallable()) {
735*333d2b36SAndroid Build Coastguard Worker		return false
736*333d2b36SAndroid Build Coastguard Worker	}
737*333d2b36SAndroid Build Coastguard Worker
738*333d2b36SAndroid Build Coastguard Worker	// The apex variant is not installable because it is included in the APEX and won't appear
739*333d2b36SAndroid Build Coastguard Worker	// in the system partition as a standalone file.
740*333d2b36SAndroid Build Coastguard Worker	if !apexInfo.IsForPlatform() {
741*333d2b36SAndroid Build Coastguard Worker		return false
742*333d2b36SAndroid Build Coastguard Worker	}
743*333d2b36SAndroid Build Coastguard Worker
744*333d2b36SAndroid Build Coastguard Worker	return mod.OutputFile().Valid() && !mod.Properties.PreventInstall
745*333d2b36SAndroid Build Coastguard Worker}
746*333d2b36SAndroid Build Coastguard Worker
747*333d2b36SAndroid Build Coastguard Workerfunc (ctx moduleContext) apexVariationName() string {
748*333d2b36SAndroid Build Coastguard Worker	apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider)
749*333d2b36SAndroid Build Coastguard Worker	return apexInfo.ApexVariationName
750*333d2b36SAndroid Build Coastguard Worker}
751*333d2b36SAndroid Build Coastguard Worker
752*333d2b36SAndroid Build Coastguard Workervar _ cc.LinkableInterface = (*Module)(nil)
753*333d2b36SAndroid Build Coastguard Worker
754*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) Init() android.Module {
755*333d2b36SAndroid Build Coastguard Worker	mod.AddProperties(&mod.Properties)
756*333d2b36SAndroid Build Coastguard Worker	mod.AddProperties(&mod.VendorProperties)
757*333d2b36SAndroid Build Coastguard Worker
758*333d2b36SAndroid Build Coastguard Worker	if mod.afdo != nil {
759*333d2b36SAndroid Build Coastguard Worker		mod.AddProperties(mod.afdo.props()...)
760*333d2b36SAndroid Build Coastguard Worker	}
761*333d2b36SAndroid Build Coastguard Worker	if mod.compiler != nil {
762*333d2b36SAndroid Build Coastguard Worker		mod.AddProperties(mod.compiler.compilerProps()...)
763*333d2b36SAndroid Build Coastguard Worker	}
764*333d2b36SAndroid Build Coastguard Worker	if mod.coverage != nil {
765*333d2b36SAndroid Build Coastguard Worker		mod.AddProperties(mod.coverage.props()...)
766*333d2b36SAndroid Build Coastguard Worker	}
767*333d2b36SAndroid Build Coastguard Worker	if mod.clippy != nil {
768*333d2b36SAndroid Build Coastguard Worker		mod.AddProperties(mod.clippy.props()...)
769*333d2b36SAndroid Build Coastguard Worker	}
770*333d2b36SAndroid Build Coastguard Worker	if mod.sourceProvider != nil {
771*333d2b36SAndroid Build Coastguard Worker		mod.AddProperties(mod.sourceProvider.SourceProviderProps()...)
772*333d2b36SAndroid Build Coastguard Worker	}
773*333d2b36SAndroid Build Coastguard Worker	if mod.sanitize != nil {
774*333d2b36SAndroid Build Coastguard Worker		mod.AddProperties(mod.sanitize.props()...)
775*333d2b36SAndroid Build Coastguard Worker	}
776*333d2b36SAndroid Build Coastguard Worker
777*333d2b36SAndroid Build Coastguard Worker	android.InitAndroidArchModule(mod, mod.hod, mod.multilib)
778*333d2b36SAndroid Build Coastguard Worker	android.InitApexModule(mod)
779*333d2b36SAndroid Build Coastguard Worker
780*333d2b36SAndroid Build Coastguard Worker	android.InitDefaultableModule(mod)
781*333d2b36SAndroid Build Coastguard Worker	return mod
782*333d2b36SAndroid Build Coastguard Worker}
783*333d2b36SAndroid Build Coastguard Worker
784*333d2b36SAndroid Build Coastguard Workerfunc newBaseModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
785*333d2b36SAndroid Build Coastguard Worker	return &Module{
786*333d2b36SAndroid Build Coastguard Worker		hod:      hod,
787*333d2b36SAndroid Build Coastguard Worker		multilib: multilib,
788*333d2b36SAndroid Build Coastguard Worker	}
789*333d2b36SAndroid Build Coastguard Worker}
790*333d2b36SAndroid Build Coastguard Workerfunc newModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
791*333d2b36SAndroid Build Coastguard Worker	module := newBaseModule(hod, multilib)
792*333d2b36SAndroid Build Coastguard Worker	module.afdo = &afdo{}
793*333d2b36SAndroid Build Coastguard Worker	module.coverage = &coverage{}
794*333d2b36SAndroid Build Coastguard Worker	module.clippy = &clippy{}
795*333d2b36SAndroid Build Coastguard Worker	module.sanitize = &sanitize{}
796*333d2b36SAndroid Build Coastguard Worker	return module
797*333d2b36SAndroid Build Coastguard Worker}
798*333d2b36SAndroid Build Coastguard Worker
799*333d2b36SAndroid Build Coastguard Workertype ModuleContext interface {
800*333d2b36SAndroid Build Coastguard Worker	android.ModuleContext
801*333d2b36SAndroid Build Coastguard Worker	ModuleContextIntf
802*333d2b36SAndroid Build Coastguard Worker}
803*333d2b36SAndroid Build Coastguard Worker
804*333d2b36SAndroid Build Coastguard Workertype BaseModuleContext interface {
805*333d2b36SAndroid Build Coastguard Worker	android.BaseModuleContext
806*333d2b36SAndroid Build Coastguard Worker	ModuleContextIntf
807*333d2b36SAndroid Build Coastguard Worker}
808*333d2b36SAndroid Build Coastguard Worker
809*333d2b36SAndroid Build Coastguard Workertype DepsContext interface {
810*333d2b36SAndroid Build Coastguard Worker	android.BottomUpMutatorContext
811*333d2b36SAndroid Build Coastguard Worker	ModuleContextIntf
812*333d2b36SAndroid Build Coastguard Worker}
813*333d2b36SAndroid Build Coastguard Worker
814*333d2b36SAndroid Build Coastguard Workertype ModuleContextIntf interface {
815*333d2b36SAndroid Build Coastguard Worker	RustModule() *Module
816*333d2b36SAndroid Build Coastguard Worker	toolchain() config.Toolchain
817*333d2b36SAndroid Build Coastguard Worker}
818*333d2b36SAndroid Build Coastguard Worker
819*333d2b36SAndroid Build Coastguard Workertype depsContext struct {
820*333d2b36SAndroid Build Coastguard Worker	android.BottomUpMutatorContext
821*333d2b36SAndroid Build Coastguard Worker}
822*333d2b36SAndroid Build Coastguard Worker
823*333d2b36SAndroid Build Coastguard Workertype moduleContext struct {
824*333d2b36SAndroid Build Coastguard Worker	android.ModuleContext
825*333d2b36SAndroid Build Coastguard Worker}
826*333d2b36SAndroid Build Coastguard Worker
827*333d2b36SAndroid Build Coastguard Workertype baseModuleContext struct {
828*333d2b36SAndroid Build Coastguard Worker	android.BaseModuleContext
829*333d2b36SAndroid Build Coastguard Worker}
830*333d2b36SAndroid Build Coastguard Worker
831*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContext) RustModule() *Module {
832*333d2b36SAndroid Build Coastguard Worker	return ctx.Module().(*Module)
833*333d2b36SAndroid Build Coastguard Worker}
834*333d2b36SAndroid Build Coastguard Worker
835*333d2b36SAndroid Build Coastguard Workerfunc (ctx *moduleContext) toolchain() config.Toolchain {
836*333d2b36SAndroid Build Coastguard Worker	return ctx.RustModule().toolchain(ctx)
837*333d2b36SAndroid Build Coastguard Worker}
838*333d2b36SAndroid Build Coastguard Worker
839*333d2b36SAndroid Build Coastguard Workerfunc (ctx *depsContext) RustModule() *Module {
840*333d2b36SAndroid Build Coastguard Worker	return ctx.Module().(*Module)
841*333d2b36SAndroid Build Coastguard Worker}
842*333d2b36SAndroid Build Coastguard Worker
843*333d2b36SAndroid Build Coastguard Workerfunc (ctx *depsContext) toolchain() config.Toolchain {
844*333d2b36SAndroid Build Coastguard Worker	return ctx.RustModule().toolchain(ctx)
845*333d2b36SAndroid Build Coastguard Worker}
846*333d2b36SAndroid Build Coastguard Worker
847*333d2b36SAndroid Build Coastguard Workerfunc (ctx *baseModuleContext) RustModule() *Module {
848*333d2b36SAndroid Build Coastguard Worker	return ctx.Module().(*Module)
849*333d2b36SAndroid Build Coastguard Worker}
850*333d2b36SAndroid Build Coastguard Worker
851*333d2b36SAndroid Build Coastguard Workerfunc (ctx *baseModuleContext) toolchain() config.Toolchain {
852*333d2b36SAndroid Build Coastguard Worker	return ctx.RustModule().toolchain(ctx)
853*333d2b36SAndroid Build Coastguard Worker}
854*333d2b36SAndroid Build Coastguard Worker
855*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) nativeCoverage() bool {
856*333d2b36SAndroid Build Coastguard Worker	// Bug: http://b/137883967 - native-bridge modules do not currently work with coverage
857*333d2b36SAndroid Build Coastguard Worker	if mod.Target().NativeBridge == android.NativeBridgeEnabled {
858*333d2b36SAndroid Build Coastguard Worker		return false
859*333d2b36SAndroid Build Coastguard Worker	}
860*333d2b36SAndroid Build Coastguard Worker	return mod.compiler != nil && mod.compiler.nativeCoverage()
861*333d2b36SAndroid Build Coastguard Worker}
862*333d2b36SAndroid Build Coastguard Worker
863*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) EverInstallable() bool {
864*333d2b36SAndroid Build Coastguard Worker	return mod.compiler != nil &&
865*333d2b36SAndroid Build Coastguard Worker		// Check to see whether the module is actually ever installable.
866*333d2b36SAndroid Build Coastguard Worker		mod.compiler.everInstallable()
867*333d2b36SAndroid Build Coastguard Worker}
868*333d2b36SAndroid Build Coastguard Worker
869*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) Installable() *bool {
870*333d2b36SAndroid Build Coastguard Worker	return mod.Properties.Installable
871*333d2b36SAndroid Build Coastguard Worker}
872*333d2b36SAndroid Build Coastguard Worker
873*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) ProcMacro() bool {
874*333d2b36SAndroid Build Coastguard Worker	if pm, ok := mod.compiler.(procMacroInterface); ok {
875*333d2b36SAndroid Build Coastguard Worker		return pm.ProcMacro()
876*333d2b36SAndroid Build Coastguard Worker	}
877*333d2b36SAndroid Build Coastguard Worker	return false
878*333d2b36SAndroid Build Coastguard Worker}
879*333d2b36SAndroid Build Coastguard Worker
880*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) toolchain(ctx android.BaseModuleContext) config.Toolchain {
881*333d2b36SAndroid Build Coastguard Worker	if mod.cachedToolchain == nil {
882*333d2b36SAndroid Build Coastguard Worker		mod.cachedToolchain = config.FindToolchain(ctx.Os(), ctx.Arch())
883*333d2b36SAndroid Build Coastguard Worker	}
884*333d2b36SAndroid Build Coastguard Worker	return mod.cachedToolchain
885*333d2b36SAndroid Build Coastguard Worker}
886*333d2b36SAndroid Build Coastguard Worker
887*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) ccToolchain(ctx android.BaseModuleContext) cc_config.Toolchain {
888*333d2b36SAndroid Build Coastguard Worker	return cc_config.FindToolchain(ctx.Os(), ctx.Arch())
889*333d2b36SAndroid Build Coastguard Worker}
890*333d2b36SAndroid Build Coastguard Worker
891*333d2b36SAndroid Build Coastguard Workerfunc (d *Defaults) GenerateAndroidBuildActions(ctx android.ModuleContext) {
892*333d2b36SAndroid Build Coastguard Worker}
893*333d2b36SAndroid Build Coastguard Worker
894*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) GenerateAndroidBuildActions(actx android.ModuleContext) {
895*333d2b36SAndroid Build Coastguard Worker	ctx := &moduleContext{
896*333d2b36SAndroid Build Coastguard Worker		ModuleContext: actx,
897*333d2b36SAndroid Build Coastguard Worker	}
898*333d2b36SAndroid Build Coastguard Worker
899*333d2b36SAndroid Build Coastguard Worker	apexInfo, _ := android.ModuleProvider(actx, android.ApexInfoProvider)
900*333d2b36SAndroid Build Coastguard Worker	if !apexInfo.IsForPlatform() {
901*333d2b36SAndroid Build Coastguard Worker		mod.hideApexVariantFromMake = true
902*333d2b36SAndroid Build Coastguard Worker	}
903*333d2b36SAndroid Build Coastguard Worker
904*333d2b36SAndroid Build Coastguard Worker	toolchain := mod.toolchain(ctx)
905*333d2b36SAndroid Build Coastguard Worker	mod.makeLinkType = cc.GetMakeLinkType(actx, mod)
906*333d2b36SAndroid Build Coastguard Worker
907*333d2b36SAndroid Build Coastguard Worker	mod.Properties.SubName = cc.GetSubnameProperty(actx, mod)
908*333d2b36SAndroid Build Coastguard Worker
909*333d2b36SAndroid Build Coastguard Worker	if !toolchain.Supported() {
910*333d2b36SAndroid Build Coastguard Worker		// This toolchain's unsupported, there's nothing to do for this mod.
911*333d2b36SAndroid Build Coastguard Worker		return
912*333d2b36SAndroid Build Coastguard Worker	}
913*333d2b36SAndroid Build Coastguard Worker
914*333d2b36SAndroid Build Coastguard Worker	deps := mod.depsToPaths(ctx)
915*333d2b36SAndroid Build Coastguard Worker	// Export linkDirs for CC rust generatedlibs
916*333d2b36SAndroid Build Coastguard Worker	mod.exportedLinkDirs = append(mod.exportedLinkDirs, deps.exportedLinkDirs...)
917*333d2b36SAndroid Build Coastguard Worker	mod.exportedLinkDirs = append(mod.exportedLinkDirs, deps.linkDirs...)
918*333d2b36SAndroid Build Coastguard Worker
919*333d2b36SAndroid Build Coastguard Worker	flags := Flags{
920*333d2b36SAndroid Build Coastguard Worker		Toolchain: toolchain,
921*333d2b36SAndroid Build Coastguard Worker	}
922*333d2b36SAndroid Build Coastguard Worker
923*333d2b36SAndroid Build Coastguard Worker	// Calculate rustc flags
924*333d2b36SAndroid Build Coastguard Worker	if mod.afdo != nil {
925*333d2b36SAndroid Build Coastguard Worker		flags, deps = mod.afdo.flags(actx, flags, deps)
926*333d2b36SAndroid Build Coastguard Worker	}
927*333d2b36SAndroid Build Coastguard Worker	if mod.compiler != nil {
928*333d2b36SAndroid Build Coastguard Worker		flags = mod.compiler.compilerFlags(ctx, flags)
929*333d2b36SAndroid Build Coastguard Worker		flags = mod.compiler.cfgFlags(ctx, flags)
930*333d2b36SAndroid Build Coastguard Worker		flags = mod.compiler.featureFlags(ctx, mod, flags)
931*333d2b36SAndroid Build Coastguard Worker	}
932*333d2b36SAndroid Build Coastguard Worker	if mod.coverage != nil {
933*333d2b36SAndroid Build Coastguard Worker		flags, deps = mod.coverage.flags(ctx, flags, deps)
934*333d2b36SAndroid Build Coastguard Worker	}
935*333d2b36SAndroid Build Coastguard Worker	if mod.clippy != nil {
936*333d2b36SAndroid Build Coastguard Worker		flags, deps = mod.clippy.flags(ctx, flags, deps)
937*333d2b36SAndroid Build Coastguard Worker	}
938*333d2b36SAndroid Build Coastguard Worker	if mod.sanitize != nil {
939*333d2b36SAndroid Build Coastguard Worker		flags, deps = mod.sanitize.flags(ctx, flags, deps)
940*333d2b36SAndroid Build Coastguard Worker	}
941*333d2b36SAndroid Build Coastguard Worker
942*333d2b36SAndroid Build Coastguard Worker	// SourceProvider needs to call GenerateSource() before compiler calls
943*333d2b36SAndroid Build Coastguard Worker	// compile() so it can provide the source. A SourceProvider has
944*333d2b36SAndroid Build Coastguard Worker	// multiple variants (e.g. source, rlib, dylib). Only the "source"
945*333d2b36SAndroid Build Coastguard Worker	// variant is responsible for effectively generating the source. The
946*333d2b36SAndroid Build Coastguard Worker	// remaining variants relies on the "source" variant output.
947*333d2b36SAndroid Build Coastguard Worker	if mod.sourceProvider != nil {
948*333d2b36SAndroid Build Coastguard Worker		if mod.compiler.(libraryInterface).source() {
949*333d2b36SAndroid Build Coastguard Worker			mod.sourceProvider.GenerateSource(ctx, deps)
950*333d2b36SAndroid Build Coastguard Worker			mod.sourceProvider.setSubName(ctx.ModuleSubDir())
951*333d2b36SAndroid Build Coastguard Worker		} else {
952*333d2b36SAndroid Build Coastguard Worker			sourceMod := actx.GetDirectDepWithTag(mod.Name(), sourceDepTag)
953*333d2b36SAndroid Build Coastguard Worker			sourceLib := sourceMod.(*Module).compiler.(*libraryDecorator)
954*333d2b36SAndroid Build Coastguard Worker			mod.sourceProvider.setOutputFiles(sourceLib.sourceProvider.Srcs())
955*333d2b36SAndroid Build Coastguard Worker		}
956*333d2b36SAndroid Build Coastguard Worker		ctx.CheckbuildFile(mod.sourceProvider.Srcs()...)
957*333d2b36SAndroid Build Coastguard Worker		android.SetProvider(ctx, blueprint.SrcsFileProviderKey, blueprint.SrcsFileProviderData{SrcPaths: mod.sourceProvider.Srcs().Strings()})
958*333d2b36SAndroid Build Coastguard Worker	}
959*333d2b36SAndroid Build Coastguard Worker
960*333d2b36SAndroid Build Coastguard Worker	if mod.compiler != nil && !mod.compiler.Disabled() {
961*333d2b36SAndroid Build Coastguard Worker		mod.compiler.initialize(ctx)
962*333d2b36SAndroid Build Coastguard Worker		buildOutput := mod.compiler.compile(ctx, flags, deps)
963*333d2b36SAndroid Build Coastguard Worker		if ctx.Failed() {
964*333d2b36SAndroid Build Coastguard Worker			return
965*333d2b36SAndroid Build Coastguard Worker		}
966*333d2b36SAndroid Build Coastguard Worker		mod.outputFile = android.OptionalPathForPath(buildOutput.outputFile)
967*333d2b36SAndroid Build Coastguard Worker		ctx.CheckbuildFile(buildOutput.outputFile)
968*333d2b36SAndroid Build Coastguard Worker		if buildOutput.kytheFile != nil {
969*333d2b36SAndroid Build Coastguard Worker			mod.kytheFiles = append(mod.kytheFiles, buildOutput.kytheFile)
970*333d2b36SAndroid Build Coastguard Worker		}
971*333d2b36SAndroid Build Coastguard Worker		bloaty.MeasureSizeForPaths(ctx, mod.compiler.strippedOutputFilePath(), android.OptionalPathForPath(mod.compiler.unstrippedOutputFilePath()))
972*333d2b36SAndroid Build Coastguard Worker
973*333d2b36SAndroid Build Coastguard Worker		mod.docTimestampFile = mod.compiler.rustdoc(ctx, flags, deps)
974*333d2b36SAndroid Build Coastguard Worker
975*333d2b36SAndroid Build Coastguard Worker		apexInfo, _ := android.ModuleProvider(actx, android.ApexInfoProvider)
976*333d2b36SAndroid Build Coastguard Worker		if !proptools.BoolDefault(mod.Installable(), mod.EverInstallable()) && !mod.ProcMacro() {
977*333d2b36SAndroid Build Coastguard Worker			// If the module has been specifically configure to not be installed then
978*333d2b36SAndroid Build Coastguard Worker			// hide from make as otherwise it will break when running inside make as the
979*333d2b36SAndroid Build Coastguard Worker			// output path to install will not be specified. Not all uninstallable
980*333d2b36SAndroid Build Coastguard Worker			// modules can be hidden from make as some are needed for resolving make
981*333d2b36SAndroid Build Coastguard Worker			// side dependencies. In particular, proc-macros need to be captured in the
982*333d2b36SAndroid Build Coastguard Worker			// host snapshot.
983*333d2b36SAndroid Build Coastguard Worker			mod.HideFromMake()
984*333d2b36SAndroid Build Coastguard Worker			mod.SkipInstall()
985*333d2b36SAndroid Build Coastguard Worker		} else if !mod.installable(apexInfo) {
986*333d2b36SAndroid Build Coastguard Worker			mod.SkipInstall()
987*333d2b36SAndroid Build Coastguard Worker		}
988*333d2b36SAndroid Build Coastguard Worker
989*333d2b36SAndroid Build Coastguard Worker		// Still call install though, the installs will be stored as PackageSpecs to allow
990*333d2b36SAndroid Build Coastguard Worker		// using the outputs in a genrule.
991*333d2b36SAndroid Build Coastguard Worker		if mod.OutputFile().Valid() {
992*333d2b36SAndroid Build Coastguard Worker			mod.compiler.install(ctx)
993*333d2b36SAndroid Build Coastguard Worker			if ctx.Failed() {
994*333d2b36SAndroid Build Coastguard Worker				return
995*333d2b36SAndroid Build Coastguard Worker			}
996*333d2b36SAndroid Build Coastguard Worker			// Export your own directory as a linkDir
997*333d2b36SAndroid Build Coastguard Worker			mod.exportedLinkDirs = append(mod.exportedLinkDirs, linkPathFromFilePath(mod.OutputFile().Path()))
998*333d2b36SAndroid Build Coastguard Worker
999*333d2b36SAndroid Build Coastguard Worker		}
1000*333d2b36SAndroid Build Coastguard Worker
1001*333d2b36SAndroid Build Coastguard Worker		android.SetProvider(ctx, cc.ImplementationDepInfoProvider, &cc.ImplementationDepInfo{
1002*333d2b36SAndroid Build Coastguard Worker			ImplementationDeps: depset.New(depset.PREORDER, deps.directImplementationDeps, deps.transitiveImplementationDeps),
1003*333d2b36SAndroid Build Coastguard Worker		})
1004*333d2b36SAndroid Build Coastguard Worker
1005*333d2b36SAndroid Build Coastguard Worker		ctx.Phony("rust", ctx.RustModule().OutputFile().Path())
1006*333d2b36SAndroid Build Coastguard Worker	}
1007*333d2b36SAndroid Build Coastguard Worker
1008*333d2b36SAndroid Build Coastguard Worker	android.SetProvider(ctx, cc.LinkableInfoKey, cc.LinkableInfo{
1009*333d2b36SAndroid Build Coastguard Worker		StaticExecutable: mod.StaticExecutable(),
1010*333d2b36SAndroid Build Coastguard Worker	})
1011*333d2b36SAndroid Build Coastguard Worker
1012*333d2b36SAndroid Build Coastguard Worker	mod.setOutputFiles(ctx)
1013*333d2b36SAndroid Build Coastguard Worker
1014*333d2b36SAndroid Build Coastguard Worker	buildComplianceMetadataInfo(ctx, mod, deps)
1015*333d2b36SAndroid Build Coastguard Worker}
1016*333d2b36SAndroid Build Coastguard Worker
1017*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) setOutputFiles(ctx ModuleContext) {
1018*333d2b36SAndroid Build Coastguard Worker	if mod.sourceProvider != nil && (mod.compiler == nil || mod.compiler.Disabled()) {
1019*333d2b36SAndroid Build Coastguard Worker		ctx.SetOutputFiles(mod.sourceProvider.Srcs(), "")
1020*333d2b36SAndroid Build Coastguard Worker	} else if mod.OutputFile().Valid() {
1021*333d2b36SAndroid Build Coastguard Worker		ctx.SetOutputFiles(android.Paths{mod.OutputFile().Path()}, "")
1022*333d2b36SAndroid Build Coastguard Worker	} else {
1023*333d2b36SAndroid Build Coastguard Worker		ctx.SetOutputFiles(android.Paths{}, "")
1024*333d2b36SAndroid Build Coastguard Worker	}
1025*333d2b36SAndroid Build Coastguard Worker	if mod.compiler != nil {
1026*333d2b36SAndroid Build Coastguard Worker		ctx.SetOutputFiles(android.PathsIfNonNil(mod.compiler.unstrippedOutputFilePath()), "unstripped")
1027*333d2b36SAndroid Build Coastguard Worker	}
1028*333d2b36SAndroid Build Coastguard Worker}
1029*333d2b36SAndroid Build Coastguard Worker
1030*333d2b36SAndroid Build Coastguard Workerfunc buildComplianceMetadataInfo(ctx *moduleContext, mod *Module, deps PathDeps) {
1031*333d2b36SAndroid Build Coastguard Worker	// Dump metadata that can not be done in android/compliance-metadata.go
1032*333d2b36SAndroid Build Coastguard Worker	metadataInfo := ctx.ComplianceMetadataInfo()
1033*333d2b36SAndroid Build Coastguard Worker	metadataInfo.SetStringValue(android.ComplianceMetadataProp.IS_STATIC_LIB, strconv.FormatBool(mod.Static()))
1034*333d2b36SAndroid Build Coastguard Worker	metadataInfo.SetStringValue(android.ComplianceMetadataProp.BUILT_FILES, mod.outputFile.String())
1035*333d2b36SAndroid Build Coastguard Worker
1036*333d2b36SAndroid Build Coastguard Worker	// Static libs
1037*333d2b36SAndroid Build Coastguard Worker	staticDeps := ctx.GetDirectDepsWithTag(rlibDepTag)
1038*333d2b36SAndroid Build Coastguard Worker	staticDepNames := make([]string, 0, len(staticDeps))
1039*333d2b36SAndroid Build Coastguard Worker	for _, dep := range staticDeps {
1040*333d2b36SAndroid Build Coastguard Worker		staticDepNames = append(staticDepNames, dep.Name())
1041*333d2b36SAndroid Build Coastguard Worker	}
1042*333d2b36SAndroid Build Coastguard Worker	ccStaticDeps := ctx.GetDirectDepsWithTag(cc.StaticDepTag(false))
1043*333d2b36SAndroid Build Coastguard Worker	for _, dep := range ccStaticDeps {
1044*333d2b36SAndroid Build Coastguard Worker		staticDepNames = append(staticDepNames, dep.Name())
1045*333d2b36SAndroid Build Coastguard Worker	}
1046*333d2b36SAndroid Build Coastguard Worker
1047*333d2b36SAndroid Build Coastguard Worker	staticDepPaths := make([]string, 0, len(deps.StaticLibs)+len(deps.RLibs))
1048*333d2b36SAndroid Build Coastguard Worker	// C static libraries
1049*333d2b36SAndroid Build Coastguard Worker	for _, dep := range deps.StaticLibs {
1050*333d2b36SAndroid Build Coastguard Worker		staticDepPaths = append(staticDepPaths, dep.String())
1051*333d2b36SAndroid Build Coastguard Worker	}
1052*333d2b36SAndroid Build Coastguard Worker	// Rust static libraries
1053*333d2b36SAndroid Build Coastguard Worker	for _, dep := range deps.RLibs {
1054*333d2b36SAndroid Build Coastguard Worker		staticDepPaths = append(staticDepPaths, dep.Path.String())
1055*333d2b36SAndroid Build Coastguard Worker	}
1056*333d2b36SAndroid Build Coastguard Worker	metadataInfo.SetListValue(android.ComplianceMetadataProp.STATIC_DEPS, android.FirstUniqueStrings(staticDepNames))
1057*333d2b36SAndroid Build Coastguard Worker	metadataInfo.SetListValue(android.ComplianceMetadataProp.STATIC_DEP_FILES, android.FirstUniqueStrings(staticDepPaths))
1058*333d2b36SAndroid Build Coastguard Worker
1059*333d2b36SAndroid Build Coastguard Worker	// C Whole static libs
1060*333d2b36SAndroid Build Coastguard Worker	ccWholeStaticDeps := ctx.GetDirectDepsWithTag(cc.StaticDepTag(true))
1061*333d2b36SAndroid Build Coastguard Worker	wholeStaticDepNames := make([]string, 0, len(ccWholeStaticDeps))
1062*333d2b36SAndroid Build Coastguard Worker	for _, dep := range ccStaticDeps {
1063*333d2b36SAndroid Build Coastguard Worker		wholeStaticDepNames = append(wholeStaticDepNames, dep.Name())
1064*333d2b36SAndroid Build Coastguard Worker	}
1065*333d2b36SAndroid Build Coastguard Worker	metadataInfo.SetListValue(android.ComplianceMetadataProp.STATIC_DEPS, android.FirstUniqueStrings(staticDepNames))
1066*333d2b36SAndroid Build Coastguard Worker}
1067*333d2b36SAndroid Build Coastguard Worker
1068*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) deps(ctx DepsContext) Deps {
1069*333d2b36SAndroid Build Coastguard Worker	deps := Deps{}
1070*333d2b36SAndroid Build Coastguard Worker
1071*333d2b36SAndroid Build Coastguard Worker	if mod.compiler != nil {
1072*333d2b36SAndroid Build Coastguard Worker		deps = mod.compiler.compilerDeps(ctx, deps)
1073*333d2b36SAndroid Build Coastguard Worker	}
1074*333d2b36SAndroid Build Coastguard Worker	if mod.sourceProvider != nil {
1075*333d2b36SAndroid Build Coastguard Worker		deps = mod.sourceProvider.SourceProviderDeps(ctx, deps)
1076*333d2b36SAndroid Build Coastguard Worker	}
1077*333d2b36SAndroid Build Coastguard Worker
1078*333d2b36SAndroid Build Coastguard Worker	if mod.coverage != nil {
1079*333d2b36SAndroid Build Coastguard Worker		deps = mod.coverage.deps(ctx, deps)
1080*333d2b36SAndroid Build Coastguard Worker	}
1081*333d2b36SAndroid Build Coastguard Worker
1082*333d2b36SAndroid Build Coastguard Worker	if mod.sanitize != nil {
1083*333d2b36SAndroid Build Coastguard Worker		deps = mod.sanitize.deps(ctx, deps)
1084*333d2b36SAndroid Build Coastguard Worker	}
1085*333d2b36SAndroid Build Coastguard Worker
1086*333d2b36SAndroid Build Coastguard Worker	deps.Rlibs = android.LastUniqueStrings(deps.Rlibs)
1087*333d2b36SAndroid Build Coastguard Worker	deps.Dylibs = android.LastUniqueStrings(deps.Dylibs)
1088*333d2b36SAndroid Build Coastguard Worker	deps.Rustlibs = android.LastUniqueStrings(deps.Rustlibs)
1089*333d2b36SAndroid Build Coastguard Worker	deps.ProcMacros = android.LastUniqueStrings(deps.ProcMacros)
1090*333d2b36SAndroid Build Coastguard Worker	deps.SharedLibs = android.LastUniqueStrings(deps.SharedLibs)
1091*333d2b36SAndroid Build Coastguard Worker	deps.StaticLibs = android.LastUniqueStrings(deps.StaticLibs)
1092*333d2b36SAndroid Build Coastguard Worker	deps.Stdlibs = android.LastUniqueStrings(deps.Stdlibs)
1093*333d2b36SAndroid Build Coastguard Worker	deps.WholeStaticLibs = android.LastUniqueStrings(deps.WholeStaticLibs)
1094*333d2b36SAndroid Build Coastguard Worker	return deps
1095*333d2b36SAndroid Build Coastguard Worker
1096*333d2b36SAndroid Build Coastguard Worker}
1097*333d2b36SAndroid Build Coastguard Worker
1098*333d2b36SAndroid Build Coastguard Workertype dependencyTag struct {
1099*333d2b36SAndroid Build Coastguard Worker	blueprint.BaseDependencyTag
1100*333d2b36SAndroid Build Coastguard Worker	name      string
1101*333d2b36SAndroid Build Coastguard Worker	library   bool
1102*333d2b36SAndroid Build Coastguard Worker	procMacro bool
1103*333d2b36SAndroid Build Coastguard Worker	dynamic   bool
1104*333d2b36SAndroid Build Coastguard Worker}
1105*333d2b36SAndroid Build Coastguard Worker
1106*333d2b36SAndroid Build Coastguard Worker// InstallDepNeeded returns true for rlibs, dylibs, and proc macros so that they or their transitive
1107*333d2b36SAndroid Build Coastguard Worker// dependencies (especially C/C++ shared libs) are installed as dependencies of a rust binary.
1108*333d2b36SAndroid Build Coastguard Workerfunc (d dependencyTag) InstallDepNeeded() bool {
1109*333d2b36SAndroid Build Coastguard Worker	return d.library || d.procMacro
1110*333d2b36SAndroid Build Coastguard Worker}
1111*333d2b36SAndroid Build Coastguard Worker
1112*333d2b36SAndroid Build Coastguard Workervar _ android.InstallNeededDependencyTag = dependencyTag{}
1113*333d2b36SAndroid Build Coastguard Worker
1114*333d2b36SAndroid Build Coastguard Workerfunc (d dependencyTag) LicenseAnnotations() []android.LicenseAnnotation {
1115*333d2b36SAndroid Build Coastguard Worker	if d.library && d.dynamic {
1116*333d2b36SAndroid Build Coastguard Worker		return []android.LicenseAnnotation{android.LicenseAnnotationSharedDependency}
1117*333d2b36SAndroid Build Coastguard Worker	}
1118*333d2b36SAndroid Build Coastguard Worker	return nil
1119*333d2b36SAndroid Build Coastguard Worker}
1120*333d2b36SAndroid Build Coastguard Worker
1121*333d2b36SAndroid Build Coastguard Workerfunc (d dependencyTag) PropagateAconfigValidation() bool {
1122*333d2b36SAndroid Build Coastguard Worker	return d == rlibDepTag || d == sourceDepTag
1123*333d2b36SAndroid Build Coastguard Worker}
1124*333d2b36SAndroid Build Coastguard Worker
1125*333d2b36SAndroid Build Coastguard Workervar _ android.PropagateAconfigValidationDependencyTag = dependencyTag{}
1126*333d2b36SAndroid Build Coastguard Worker
1127*333d2b36SAndroid Build Coastguard Workervar _ android.LicenseAnnotationsDependencyTag = dependencyTag{}
1128*333d2b36SAndroid Build Coastguard Worker
1129*333d2b36SAndroid Build Coastguard Workervar (
1130*333d2b36SAndroid Build Coastguard Worker	customBindgenDepTag = dependencyTag{name: "customBindgenTag"}
1131*333d2b36SAndroid Build Coastguard Worker	rlibDepTag          = dependencyTag{name: "rlibTag", library: true}
1132*333d2b36SAndroid Build Coastguard Worker	dylibDepTag         = dependencyTag{name: "dylib", library: true, dynamic: true}
1133*333d2b36SAndroid Build Coastguard Worker	procMacroDepTag     = dependencyTag{name: "procMacro", procMacro: true}
1134*333d2b36SAndroid Build Coastguard Worker	sourceDepTag        = dependencyTag{name: "source"}
1135*333d2b36SAndroid Build Coastguard Worker	dataLibDepTag       = dependencyTag{name: "data lib"}
1136*333d2b36SAndroid Build Coastguard Worker	dataBinDepTag       = dependencyTag{name: "data bin"}
1137*333d2b36SAndroid Build Coastguard Worker)
1138*333d2b36SAndroid Build Coastguard Worker
1139*333d2b36SAndroid Build Coastguard Workerfunc IsDylibDepTag(depTag blueprint.DependencyTag) bool {
1140*333d2b36SAndroid Build Coastguard Worker	tag, ok := depTag.(dependencyTag)
1141*333d2b36SAndroid Build Coastguard Worker	return ok && tag == dylibDepTag
1142*333d2b36SAndroid Build Coastguard Worker}
1143*333d2b36SAndroid Build Coastguard Worker
1144*333d2b36SAndroid Build Coastguard Workerfunc IsRlibDepTag(depTag blueprint.DependencyTag) bool {
1145*333d2b36SAndroid Build Coastguard Worker	tag, ok := depTag.(dependencyTag)
1146*333d2b36SAndroid Build Coastguard Worker	return ok && tag == rlibDepTag
1147*333d2b36SAndroid Build Coastguard Worker}
1148*333d2b36SAndroid Build Coastguard Worker
1149*333d2b36SAndroid Build Coastguard Workertype autoDep struct {
1150*333d2b36SAndroid Build Coastguard Worker	variation string
1151*333d2b36SAndroid Build Coastguard Worker	depTag    dependencyTag
1152*333d2b36SAndroid Build Coastguard Worker}
1153*333d2b36SAndroid Build Coastguard Worker
1154*333d2b36SAndroid Build Coastguard Workervar (
1155*333d2b36SAndroid Build Coastguard Worker	sourceVariation = "source"
1156*333d2b36SAndroid Build Coastguard Worker	rlibVariation   = "rlib"
1157*333d2b36SAndroid Build Coastguard Worker	dylibVariation  = "dylib"
1158*333d2b36SAndroid Build Coastguard Worker	rlibAutoDep     = autoDep{variation: rlibVariation, depTag: rlibDepTag}
1159*333d2b36SAndroid Build Coastguard Worker	dylibAutoDep    = autoDep{variation: dylibVariation, depTag: dylibDepTag}
1160*333d2b36SAndroid Build Coastguard Worker)
1161*333d2b36SAndroid Build Coastguard Worker
1162*333d2b36SAndroid Build Coastguard Workertype autoDeppable interface {
1163*333d2b36SAndroid Build Coastguard Worker	autoDep(ctx android.BottomUpMutatorContext) autoDep
1164*333d2b36SAndroid Build Coastguard Worker}
1165*333d2b36SAndroid Build Coastguard Worker
1166*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) begin(ctx BaseModuleContext) {
1167*333d2b36SAndroid Build Coastguard Worker	if mod.coverage != nil {
1168*333d2b36SAndroid Build Coastguard Worker		mod.coverage.begin(ctx)
1169*333d2b36SAndroid Build Coastguard Worker	}
1170*333d2b36SAndroid Build Coastguard Worker	if mod.sanitize != nil {
1171*333d2b36SAndroid Build Coastguard Worker		mod.sanitize.begin(ctx)
1172*333d2b36SAndroid Build Coastguard Worker	}
1173*333d2b36SAndroid Build Coastguard Worker}
1174*333d2b36SAndroid Build Coastguard Worker
1175*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) Prebuilt() *android.Prebuilt {
1176*333d2b36SAndroid Build Coastguard Worker	if p, ok := mod.compiler.(rustPrebuilt); ok {
1177*333d2b36SAndroid Build Coastguard Worker		return p.prebuilt()
1178*333d2b36SAndroid Build Coastguard Worker	}
1179*333d2b36SAndroid Build Coastguard Worker	return nil
1180*333d2b36SAndroid Build Coastguard Worker}
1181*333d2b36SAndroid Build Coastguard Worker
1182*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) Symlinks() []string {
1183*333d2b36SAndroid Build Coastguard Worker	// TODO update this to return the list of symlinks when Rust supports defining symlinks
1184*333d2b36SAndroid Build Coastguard Worker	return nil
1185*333d2b36SAndroid Build Coastguard Worker}
1186*333d2b36SAndroid Build Coastguard Worker
1187*333d2b36SAndroid Build Coastguard Workerfunc rustMakeLibName(ctx android.ModuleContext, c cc.LinkableInterface, dep cc.LinkableInterface, depName string) string {
1188*333d2b36SAndroid Build Coastguard Worker	if rustDep, ok := dep.(*Module); ok {
1189*333d2b36SAndroid Build Coastguard Worker		// Use base module name for snapshots when exporting to Makefile.
1190*333d2b36SAndroid Build Coastguard Worker		if snapshotPrebuilt, ok := rustDep.compiler.(cc.SnapshotInterface); ok {
1191*333d2b36SAndroid Build Coastguard Worker			baseName := rustDep.BaseModuleName()
1192*333d2b36SAndroid Build Coastguard Worker			return baseName + snapshotPrebuilt.SnapshotAndroidMkSuffix() + rustDep.AndroidMkSuffix()
1193*333d2b36SAndroid Build Coastguard Worker		}
1194*333d2b36SAndroid Build Coastguard Worker	}
1195*333d2b36SAndroid Build Coastguard Worker	return cc.MakeLibName(ctx, c, dep, depName)
1196*333d2b36SAndroid Build Coastguard Worker}
1197*333d2b36SAndroid Build Coastguard Worker
1198*333d2b36SAndroid Build Coastguard Workerfunc collectIncludedProtos(mod *Module, dep *Module) {
1199*333d2b36SAndroid Build Coastguard Worker	if protoMod, ok := mod.sourceProvider.(*protobufDecorator); ok {
1200*333d2b36SAndroid Build Coastguard Worker		if _, ok := dep.sourceProvider.(*protobufDecorator); ok {
1201*333d2b36SAndroid Build Coastguard Worker			protoMod.additionalCrates = append(protoMod.additionalCrates, dep.CrateName())
1202*333d2b36SAndroid Build Coastguard Worker		}
1203*333d2b36SAndroid Build Coastguard Worker	}
1204*333d2b36SAndroid Build Coastguard Worker}
1205*333d2b36SAndroid Build Coastguard Worker
1206*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
1207*333d2b36SAndroid Build Coastguard Worker	var depPaths PathDeps
1208*333d2b36SAndroid Build Coastguard Worker
1209*333d2b36SAndroid Build Coastguard Worker	directRlibDeps := []*Module{}
1210*333d2b36SAndroid Build Coastguard Worker	directDylibDeps := []*Module{}
1211*333d2b36SAndroid Build Coastguard Worker	directProcMacroDeps := []*Module{}
1212*333d2b36SAndroid Build Coastguard Worker	directSharedLibDeps := []cc.SharedLibraryInfo{}
1213*333d2b36SAndroid Build Coastguard Worker	directStaticLibDeps := [](cc.LinkableInterface){}
1214*333d2b36SAndroid Build Coastguard Worker	directSrcProvidersDeps := []*Module{}
1215*333d2b36SAndroid Build Coastguard Worker	directSrcDeps := [](android.SourceFileProducer){}
1216*333d2b36SAndroid Build Coastguard Worker
1217*333d2b36SAndroid Build Coastguard Worker	// For the dependency from platform to apex, use the latest stubs
1218*333d2b36SAndroid Build Coastguard Worker	mod.apexSdkVersion = android.FutureApiLevel
1219*333d2b36SAndroid Build Coastguard Worker	apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider)
1220*333d2b36SAndroid Build Coastguard Worker	if !apexInfo.IsForPlatform() {
1221*333d2b36SAndroid Build Coastguard Worker		mod.apexSdkVersion = apexInfo.MinSdkVersion
1222*333d2b36SAndroid Build Coastguard Worker	}
1223*333d2b36SAndroid Build Coastguard Worker
1224*333d2b36SAndroid Build Coastguard Worker	if android.InList("hwaddress", ctx.Config().SanitizeDevice()) {
1225*333d2b36SAndroid Build Coastguard Worker		// In hwasan build, we override apexSdkVersion to the FutureApiLevel(10000)
1226*333d2b36SAndroid Build Coastguard Worker		// so that even Q(29/Android10) apexes could use the dynamic unwinder by linking the newer stubs(e.g libc(R+)).
1227*333d2b36SAndroid Build Coastguard Worker		// (b/144430859)
1228*333d2b36SAndroid Build Coastguard Worker		mod.apexSdkVersion = android.FutureApiLevel
1229*333d2b36SAndroid Build Coastguard Worker	}
1230*333d2b36SAndroid Build Coastguard Worker
1231*333d2b36SAndroid Build Coastguard Worker	skipModuleList := map[string]bool{}
1232*333d2b36SAndroid Build Coastguard Worker
1233*333d2b36SAndroid Build Coastguard Worker	var transitiveAndroidMkSharedLibs []depset.DepSet[string]
1234*333d2b36SAndroid Build Coastguard Worker	var directAndroidMkSharedLibs []string
1235*333d2b36SAndroid Build Coastguard Worker
1236*333d2b36SAndroid Build Coastguard Worker	ctx.VisitDirectDeps(func(dep android.Module) {
1237*333d2b36SAndroid Build Coastguard Worker		depName := ctx.OtherModuleName(dep)
1238*333d2b36SAndroid Build Coastguard Worker		depTag := ctx.OtherModuleDependencyTag(dep)
1239*333d2b36SAndroid Build Coastguard Worker		if _, exists := skipModuleList[depName]; exists {
1240*333d2b36SAndroid Build Coastguard Worker			return
1241*333d2b36SAndroid Build Coastguard Worker		}
1242*333d2b36SAndroid Build Coastguard Worker
1243*333d2b36SAndroid Build Coastguard Worker		if depTag == android.DarwinUniversalVariantTag {
1244*333d2b36SAndroid Build Coastguard Worker			return
1245*333d2b36SAndroid Build Coastguard Worker		}
1246*333d2b36SAndroid Build Coastguard Worker
1247*333d2b36SAndroid Build Coastguard Worker		if rustDep, ok := dep.(*Module); ok && !rustDep.Static() && !rustDep.Shared() {
1248*333d2b36SAndroid Build Coastguard Worker			//Handle Rust Modules
1249*333d2b36SAndroid Build Coastguard Worker			makeLibName := rustMakeLibName(ctx, mod, rustDep, depName+rustDep.Properties.RustSubName)
1250*333d2b36SAndroid Build Coastguard Worker
1251*333d2b36SAndroid Build Coastguard Worker			switch {
1252*333d2b36SAndroid Build Coastguard Worker			case depTag == dylibDepTag:
1253*333d2b36SAndroid Build Coastguard Worker				dylib, ok := rustDep.compiler.(libraryInterface)
1254*333d2b36SAndroid Build Coastguard Worker				if !ok || !dylib.dylib() {
1255*333d2b36SAndroid Build Coastguard Worker					ctx.ModuleErrorf("mod %q not an dylib library", depName)
1256*333d2b36SAndroid Build Coastguard Worker					return
1257*333d2b36SAndroid Build Coastguard Worker				}
1258*333d2b36SAndroid Build Coastguard Worker				directDylibDeps = append(directDylibDeps, rustDep)
1259*333d2b36SAndroid Build Coastguard Worker				mod.Properties.AndroidMkDylibs = append(mod.Properties.AndroidMkDylibs, makeLibName)
1260*333d2b36SAndroid Build Coastguard Worker				mod.Properties.SnapshotDylibs = append(mod.Properties.SnapshotDylibs, cc.BaseLibName(depName))
1261*333d2b36SAndroid Build Coastguard Worker
1262*333d2b36SAndroid Build Coastguard Worker				depPaths.directImplementationDeps = append(depPaths.directImplementationDeps, android.OutputFileForModule(ctx, dep, ""))
1263*333d2b36SAndroid Build Coastguard Worker				if info, ok := android.OtherModuleProvider(ctx, dep, cc.ImplementationDepInfoProvider); ok {
1264*333d2b36SAndroid Build Coastguard Worker					depPaths.transitiveImplementationDeps = append(depPaths.transitiveImplementationDeps, info.ImplementationDeps)
1265*333d2b36SAndroid Build Coastguard Worker				}
1266*333d2b36SAndroid Build Coastguard Worker
1267*333d2b36SAndroid Build Coastguard Worker			case depTag == rlibDepTag:
1268*333d2b36SAndroid Build Coastguard Worker				rlib, ok := rustDep.compiler.(libraryInterface)
1269*333d2b36SAndroid Build Coastguard Worker				if !ok || !rlib.rlib() {
1270*333d2b36SAndroid Build Coastguard Worker					ctx.ModuleErrorf("mod %q not an rlib library", makeLibName)
1271*333d2b36SAndroid Build Coastguard Worker					return
1272*333d2b36SAndroid Build Coastguard Worker				}
1273*333d2b36SAndroid Build Coastguard Worker				directRlibDeps = append(directRlibDeps, rustDep)
1274*333d2b36SAndroid Build Coastguard Worker				mod.Properties.AndroidMkRlibs = append(mod.Properties.AndroidMkRlibs, makeLibName)
1275*333d2b36SAndroid Build Coastguard Worker				mod.Properties.SnapshotRlibs = append(mod.Properties.SnapshotRlibs, cc.BaseLibName(depName))
1276*333d2b36SAndroid Build Coastguard Worker
1277*333d2b36SAndroid Build Coastguard Worker				// rust_ffi rlibs may export include dirs, so collect those here.
1278*333d2b36SAndroid Build Coastguard Worker				exportedInfo, _ := android.OtherModuleProvider(ctx, dep, cc.FlagExporterInfoProvider)
1279*333d2b36SAndroid Build Coastguard Worker				depPaths.depIncludePaths = append(depPaths.depIncludePaths, exportedInfo.IncludeDirs...)
1280*333d2b36SAndroid Build Coastguard Worker				depPaths.exportedLinkDirs = append(depPaths.exportedLinkDirs, linkPathFromFilePath(rustDep.OutputFile().Path()))
1281*333d2b36SAndroid Build Coastguard Worker
1282*333d2b36SAndroid Build Coastguard Worker				// rlibs are not installed, so don't add the output file to directImplementationDeps
1283*333d2b36SAndroid Build Coastguard Worker				if info, ok := android.OtherModuleProvider(ctx, dep, cc.ImplementationDepInfoProvider); ok {
1284*333d2b36SAndroid Build Coastguard Worker					depPaths.transitiveImplementationDeps = append(depPaths.transitiveImplementationDeps, info.ImplementationDeps)
1285*333d2b36SAndroid Build Coastguard Worker				}
1286*333d2b36SAndroid Build Coastguard Worker
1287*333d2b36SAndroid Build Coastguard Worker			case depTag == procMacroDepTag:
1288*333d2b36SAndroid Build Coastguard Worker				directProcMacroDeps = append(directProcMacroDeps, rustDep)
1289*333d2b36SAndroid Build Coastguard Worker				mod.Properties.AndroidMkProcMacroLibs = append(mod.Properties.AndroidMkProcMacroLibs, makeLibName)
1290*333d2b36SAndroid Build Coastguard Worker				// proc_macro link dirs need to be exported, so collect those here.
1291*333d2b36SAndroid Build Coastguard Worker				depPaths.exportedLinkDirs = append(depPaths.exportedLinkDirs, linkPathFromFilePath(rustDep.OutputFile().Path()))
1292*333d2b36SAndroid Build Coastguard Worker
1293*333d2b36SAndroid Build Coastguard Worker			case depTag == sourceDepTag:
1294*333d2b36SAndroid Build Coastguard Worker				if _, ok := mod.sourceProvider.(*protobufDecorator); ok {
1295*333d2b36SAndroid Build Coastguard Worker					collectIncludedProtos(mod, rustDep)
1296*333d2b36SAndroid Build Coastguard Worker				}
1297*333d2b36SAndroid Build Coastguard Worker			case cc.IsStaticDepTag(depTag):
1298*333d2b36SAndroid Build Coastguard Worker				// Rust FFI rlibs should not be declared in a Rust modules
1299*333d2b36SAndroid Build Coastguard Worker				// "static_libs" list as we can't handle them properly at the
1300*333d2b36SAndroid Build Coastguard Worker				// moment (for example, they only produce an rlib-std variant).
1301*333d2b36SAndroid Build Coastguard Worker				// Instead, a normal rust_library variant should be used.
1302*333d2b36SAndroid Build Coastguard Worker				ctx.PropertyErrorf("static_libs",
1303*333d2b36SAndroid Build Coastguard Worker					"found '%s' in static_libs; use a rust_library module in rustlibs instead of a rust_ffi module in static_libs",
1304*333d2b36SAndroid Build Coastguard Worker					depName)
1305*333d2b36SAndroid Build Coastguard Worker
1306*333d2b36SAndroid Build Coastguard Worker			}
1307*333d2b36SAndroid Build Coastguard Worker
1308*333d2b36SAndroid Build Coastguard Worker			transitiveAndroidMkSharedLibs = append(transitiveAndroidMkSharedLibs, rustDep.transitiveAndroidMkSharedLibs)
1309*333d2b36SAndroid Build Coastguard Worker
1310*333d2b36SAndroid Build Coastguard Worker			if android.IsSourceDepTagWithOutputTag(depTag, "") {
1311*333d2b36SAndroid Build Coastguard Worker				// Since these deps are added in path_properties.go via AddDependencies, we need to ensure the correct
1312*333d2b36SAndroid Build Coastguard Worker				// OS/Arch variant is used.
1313*333d2b36SAndroid Build Coastguard Worker				var helper string
1314*333d2b36SAndroid Build Coastguard Worker				if ctx.Host() {
1315*333d2b36SAndroid Build Coastguard Worker					helper = "missing 'host_supported'?"
1316*333d2b36SAndroid Build Coastguard Worker				} else {
1317*333d2b36SAndroid Build Coastguard Worker					helper = "device module defined?"
1318*333d2b36SAndroid Build Coastguard Worker				}
1319*333d2b36SAndroid Build Coastguard Worker
1320*333d2b36SAndroid Build Coastguard Worker				if dep.Target().Os != ctx.Os() {
1321*333d2b36SAndroid Build Coastguard Worker					ctx.ModuleErrorf("OS mismatch on dependency %q (%s)", dep.Name(), helper)
1322*333d2b36SAndroid Build Coastguard Worker					return
1323*333d2b36SAndroid Build Coastguard Worker				} else if dep.Target().Arch.ArchType != ctx.Arch().ArchType {
1324*333d2b36SAndroid Build Coastguard Worker					ctx.ModuleErrorf("Arch mismatch on dependency %q (%s)", dep.Name(), helper)
1325*333d2b36SAndroid Build Coastguard Worker					return
1326*333d2b36SAndroid Build Coastguard Worker				}
1327*333d2b36SAndroid Build Coastguard Worker				directSrcProvidersDeps = append(directSrcProvidersDeps, rustDep)
1328*333d2b36SAndroid Build Coastguard Worker			}
1329*333d2b36SAndroid Build Coastguard Worker
1330*333d2b36SAndroid Build Coastguard Worker			exportedInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
1331*333d2b36SAndroid Build Coastguard Worker			//Append the dependencies exportedDirs, except for proc-macros which target a different arch/OS
1332*333d2b36SAndroid Build Coastguard Worker			if depTag != procMacroDepTag {
1333*333d2b36SAndroid Build Coastguard Worker				depPaths.depFlags = append(depPaths.depFlags, exportedInfo.Flags...)
1334*333d2b36SAndroid Build Coastguard Worker				depPaths.linkObjects = append(depPaths.linkObjects, exportedInfo.LinkObjects...)
1335*333d2b36SAndroid Build Coastguard Worker				depPaths.linkDirs = append(depPaths.linkDirs, exportedInfo.LinkDirs...)
1336*333d2b36SAndroid Build Coastguard Worker			}
1337*333d2b36SAndroid Build Coastguard Worker
1338*333d2b36SAndroid Build Coastguard Worker			if depTag == dylibDepTag || depTag == rlibDepTag || depTag == procMacroDepTag {
1339*333d2b36SAndroid Build Coastguard Worker				linkFile := rustDep.UnstrippedOutputFile()
1340*333d2b36SAndroid Build Coastguard Worker				linkDir := linkPathFromFilePath(linkFile)
1341*333d2b36SAndroid Build Coastguard Worker				if lib, ok := mod.compiler.(exportedFlagsProducer); ok {
1342*333d2b36SAndroid Build Coastguard Worker					lib.exportLinkDirs(linkDir)
1343*333d2b36SAndroid Build Coastguard Worker				}
1344*333d2b36SAndroid Build Coastguard Worker			}
1345*333d2b36SAndroid Build Coastguard Worker
1346*333d2b36SAndroid Build Coastguard Worker			if depTag == sourceDepTag {
1347*333d2b36SAndroid Build Coastguard Worker				if _, ok := mod.sourceProvider.(*protobufDecorator); ok && mod.Source() {
1348*333d2b36SAndroid Build Coastguard Worker					if _, ok := rustDep.sourceProvider.(*protobufDecorator); ok {
1349*333d2b36SAndroid Build Coastguard Worker						exportedInfo, _ := android.OtherModuleProvider(ctx, dep, cc.FlagExporterInfoProvider)
1350*333d2b36SAndroid Build Coastguard Worker						depPaths.depIncludePaths = append(depPaths.depIncludePaths, exportedInfo.IncludeDirs...)
1351*333d2b36SAndroid Build Coastguard Worker					}
1352*333d2b36SAndroid Build Coastguard Worker				}
1353*333d2b36SAndroid Build Coastguard Worker			}
1354*333d2b36SAndroid Build Coastguard Worker		} else if ccDep, ok := dep.(cc.LinkableInterface); ok {
1355*333d2b36SAndroid Build Coastguard Worker			//Handle C dependencies
1356*333d2b36SAndroid Build Coastguard Worker			makeLibName := cc.MakeLibName(ctx, mod, ccDep, depName)
1357*333d2b36SAndroid Build Coastguard Worker			if _, ok := ccDep.(*Module); !ok {
1358*333d2b36SAndroid Build Coastguard Worker				if ccDep.Module().Target().Os != ctx.Os() {
1359*333d2b36SAndroid Build Coastguard Worker					ctx.ModuleErrorf("OS mismatch between %q and %q", ctx.ModuleName(), depName)
1360*333d2b36SAndroid Build Coastguard Worker					return
1361*333d2b36SAndroid Build Coastguard Worker				}
1362*333d2b36SAndroid Build Coastguard Worker				if ccDep.Module().Target().Arch.ArchType != ctx.Arch().ArchType {
1363*333d2b36SAndroid Build Coastguard Worker					ctx.ModuleErrorf("Arch mismatch between %q and %q", ctx.ModuleName(), depName)
1364*333d2b36SAndroid Build Coastguard Worker					return
1365*333d2b36SAndroid Build Coastguard Worker				}
1366*333d2b36SAndroid Build Coastguard Worker			}
1367*333d2b36SAndroid Build Coastguard Worker			linkObject := ccDep.OutputFile()
1368*333d2b36SAndroid Build Coastguard Worker			if !linkObject.Valid() {
1369*333d2b36SAndroid Build Coastguard Worker				if !ctx.Config().AllowMissingDependencies() {
1370*333d2b36SAndroid Build Coastguard Worker					ctx.ModuleErrorf("Invalid output file when adding dep %q to %q", depName, ctx.ModuleName())
1371*333d2b36SAndroid Build Coastguard Worker				} else {
1372*333d2b36SAndroid Build Coastguard Worker					ctx.AddMissingDependencies([]string{depName})
1373*333d2b36SAndroid Build Coastguard Worker				}
1374*333d2b36SAndroid Build Coastguard Worker				return
1375*333d2b36SAndroid Build Coastguard Worker			}
1376*333d2b36SAndroid Build Coastguard Worker
1377*333d2b36SAndroid Build Coastguard Worker			linkPath := linkPathFromFilePath(linkObject.Path())
1378*333d2b36SAndroid Build Coastguard Worker
1379*333d2b36SAndroid Build Coastguard Worker			exportDep := false
1380*333d2b36SAndroid Build Coastguard Worker			switch {
1381*333d2b36SAndroid Build Coastguard Worker			case cc.IsStaticDepTag(depTag):
1382*333d2b36SAndroid Build Coastguard Worker				if cc.IsWholeStaticLib(depTag) {
1383*333d2b36SAndroid Build Coastguard Worker					// rustc will bundle static libraries when they're passed with "-lstatic=<lib>". This will fail
1384*333d2b36SAndroid Build Coastguard Worker					// if the library is not prefixed by "lib".
1385*333d2b36SAndroid Build Coastguard Worker					if mod.Binary() {
1386*333d2b36SAndroid Build Coastguard Worker						// Binaries may sometimes need to link whole static libraries that don't start with 'lib'.
1387*333d2b36SAndroid Build Coastguard Worker						// Since binaries don't need to 'rebundle' these like libraries and only use these for the
1388*333d2b36SAndroid Build Coastguard Worker						// final linkage, pass the args directly to the linker to handle these cases.
1389*333d2b36SAndroid Build Coastguard Worker						depPaths.depLinkFlags = append(depPaths.depLinkFlags, []string{"-Wl,--whole-archive", linkObject.Path().String(), "-Wl,--no-whole-archive"}...)
1390*333d2b36SAndroid Build Coastguard Worker					} else if libName, ok := libNameFromFilePath(linkObject.Path()); ok {
1391*333d2b36SAndroid Build Coastguard Worker						depPaths.depFlags = append(depPaths.depFlags, "-lstatic="+libName)
1392*333d2b36SAndroid Build Coastguard Worker					} else {
1393*333d2b36SAndroid Build Coastguard Worker						ctx.ModuleErrorf("'%q' cannot be listed as a whole_static_library in Rust modules unless the output is prefixed by 'lib'", depName, ctx.ModuleName())
1394*333d2b36SAndroid Build Coastguard Worker					}
1395*333d2b36SAndroid Build Coastguard Worker				}
1396*333d2b36SAndroid Build Coastguard Worker
1397*333d2b36SAndroid Build Coastguard Worker				// Add this to linkObjects to pass the library directly to the linker as well. This propagates
1398*333d2b36SAndroid Build Coastguard Worker				// to dependencies to avoid having to redeclare static libraries for dependents of the dylib variant.
1399*333d2b36SAndroid Build Coastguard Worker				depPaths.linkObjects = append(depPaths.linkObjects, linkObject.String())
1400*333d2b36SAndroid Build Coastguard Worker				depPaths.linkDirs = append(depPaths.linkDirs, linkPath)
1401*333d2b36SAndroid Build Coastguard Worker
1402*333d2b36SAndroid Build Coastguard Worker				exportedInfo, _ := android.OtherModuleProvider(ctx, dep, cc.FlagExporterInfoProvider)
1403*333d2b36SAndroid Build Coastguard Worker				depPaths.depIncludePaths = append(depPaths.depIncludePaths, exportedInfo.IncludeDirs...)
1404*333d2b36SAndroid Build Coastguard Worker				depPaths.depSystemIncludePaths = append(depPaths.depSystemIncludePaths, exportedInfo.SystemIncludeDirs...)
1405*333d2b36SAndroid Build Coastguard Worker				depPaths.depClangFlags = append(depPaths.depClangFlags, exportedInfo.Flags...)
1406*333d2b36SAndroid Build Coastguard Worker				depPaths.depGeneratedHeaders = append(depPaths.depGeneratedHeaders, exportedInfo.GeneratedHeaders...)
1407*333d2b36SAndroid Build Coastguard Worker				directStaticLibDeps = append(directStaticLibDeps, ccDep)
1408*333d2b36SAndroid Build Coastguard Worker
1409*333d2b36SAndroid Build Coastguard Worker				// Record baseLibName for snapshots.
1410*333d2b36SAndroid Build Coastguard Worker				mod.Properties.SnapshotStaticLibs = append(mod.Properties.SnapshotStaticLibs, cc.BaseLibName(depName))
1411*333d2b36SAndroid Build Coastguard Worker
1412*333d2b36SAndroid Build Coastguard Worker				mod.Properties.AndroidMkStaticLibs = append(mod.Properties.AndroidMkStaticLibs, makeLibName)
1413*333d2b36SAndroid Build Coastguard Worker			case cc.IsSharedDepTag(depTag):
1414*333d2b36SAndroid Build Coastguard Worker				// For the shared lib dependencies, we may link to the stub variant
1415*333d2b36SAndroid Build Coastguard Worker				// of the dependency depending on the context (e.g. if this
1416*333d2b36SAndroid Build Coastguard Worker				// dependency crosses the APEX boundaries).
1417*333d2b36SAndroid Build Coastguard Worker				sharedLibraryInfo, exportedInfo := cc.ChooseStubOrImpl(ctx, dep)
1418*333d2b36SAndroid Build Coastguard Worker
1419*333d2b36SAndroid Build Coastguard Worker				if !sharedLibraryInfo.IsStubs {
1420*333d2b36SAndroid Build Coastguard Worker					depPaths.directImplementationDeps = append(depPaths.directImplementationDeps, android.OutputFileForModule(ctx, dep, ""))
1421*333d2b36SAndroid Build Coastguard Worker					if info, ok := android.OtherModuleProvider(ctx, dep, cc.ImplementationDepInfoProvider); ok {
1422*333d2b36SAndroid Build Coastguard Worker						depPaths.transitiveImplementationDeps = append(depPaths.transitiveImplementationDeps, info.ImplementationDeps)
1423*333d2b36SAndroid Build Coastguard Worker					}
1424*333d2b36SAndroid Build Coastguard Worker				}
1425*333d2b36SAndroid Build Coastguard Worker
1426*333d2b36SAndroid Build Coastguard Worker				// Re-get linkObject as ChooseStubOrImpl actually tells us which
1427*333d2b36SAndroid Build Coastguard Worker				// object (either from stub or non-stub) to use.
1428*333d2b36SAndroid Build Coastguard Worker				linkObject = android.OptionalPathForPath(sharedLibraryInfo.SharedLibrary)
1429*333d2b36SAndroid Build Coastguard Worker				if !linkObject.Valid() {
1430*333d2b36SAndroid Build Coastguard Worker					if !ctx.Config().AllowMissingDependencies() {
1431*333d2b36SAndroid Build Coastguard Worker						ctx.ModuleErrorf("Invalid output file when adding dep %q to %q", depName, ctx.ModuleName())
1432*333d2b36SAndroid Build Coastguard Worker					} else {
1433*333d2b36SAndroid Build Coastguard Worker						ctx.AddMissingDependencies([]string{depName})
1434*333d2b36SAndroid Build Coastguard Worker					}
1435*333d2b36SAndroid Build Coastguard Worker					return
1436*333d2b36SAndroid Build Coastguard Worker				}
1437*333d2b36SAndroid Build Coastguard Worker				linkPath = linkPathFromFilePath(linkObject.Path())
1438*333d2b36SAndroid Build Coastguard Worker
1439*333d2b36SAndroid Build Coastguard Worker				depPaths.linkDirs = append(depPaths.linkDirs, linkPath)
1440*333d2b36SAndroid Build Coastguard Worker				depPaths.linkObjects = append(depPaths.linkObjects, linkObject.String())
1441*333d2b36SAndroid Build Coastguard Worker				depPaths.depIncludePaths = append(depPaths.depIncludePaths, exportedInfo.IncludeDirs...)
1442*333d2b36SAndroid Build Coastguard Worker				depPaths.depSystemIncludePaths = append(depPaths.depSystemIncludePaths, exportedInfo.SystemIncludeDirs...)
1443*333d2b36SAndroid Build Coastguard Worker				depPaths.depClangFlags = append(depPaths.depClangFlags, exportedInfo.Flags...)
1444*333d2b36SAndroid Build Coastguard Worker				depPaths.depGeneratedHeaders = append(depPaths.depGeneratedHeaders, exportedInfo.GeneratedHeaders...)
1445*333d2b36SAndroid Build Coastguard Worker				directSharedLibDeps = append(directSharedLibDeps, sharedLibraryInfo)
1446*333d2b36SAndroid Build Coastguard Worker
1447*333d2b36SAndroid Build Coastguard Worker				// Record baseLibName for snapshots.
1448*333d2b36SAndroid Build Coastguard Worker				mod.Properties.SnapshotSharedLibs = append(mod.Properties.SnapshotSharedLibs, cc.BaseLibName(depName))
1449*333d2b36SAndroid Build Coastguard Worker
1450*333d2b36SAndroid Build Coastguard Worker				directAndroidMkSharedLibs = append(directAndroidMkSharedLibs, makeLibName)
1451*333d2b36SAndroid Build Coastguard Worker				exportDep = true
1452*333d2b36SAndroid Build Coastguard Worker			case cc.IsHeaderDepTag(depTag):
1453*333d2b36SAndroid Build Coastguard Worker				exportedInfo, _ := android.OtherModuleProvider(ctx, dep, cc.FlagExporterInfoProvider)
1454*333d2b36SAndroid Build Coastguard Worker				depPaths.depIncludePaths = append(depPaths.depIncludePaths, exportedInfo.IncludeDirs...)
1455*333d2b36SAndroid Build Coastguard Worker				depPaths.depSystemIncludePaths = append(depPaths.depSystemIncludePaths, exportedInfo.SystemIncludeDirs...)
1456*333d2b36SAndroid Build Coastguard Worker				depPaths.depGeneratedHeaders = append(depPaths.depGeneratedHeaders, exportedInfo.GeneratedHeaders...)
1457*333d2b36SAndroid Build Coastguard Worker				mod.Properties.AndroidMkHeaderLibs = append(mod.Properties.AndroidMkHeaderLibs, makeLibName)
1458*333d2b36SAndroid Build Coastguard Worker			case depTag == cc.CrtBeginDepTag:
1459*333d2b36SAndroid Build Coastguard Worker				depPaths.CrtBegin = append(depPaths.CrtBegin, linkObject.Path())
1460*333d2b36SAndroid Build Coastguard Worker			case depTag == cc.CrtEndDepTag:
1461*333d2b36SAndroid Build Coastguard Worker				depPaths.CrtEnd = append(depPaths.CrtEnd, linkObject.Path())
1462*333d2b36SAndroid Build Coastguard Worker			}
1463*333d2b36SAndroid Build Coastguard Worker
1464*333d2b36SAndroid Build Coastguard Worker			// Make sure these dependencies are propagated
1465*333d2b36SAndroid Build Coastguard Worker			if lib, ok := mod.compiler.(exportedFlagsProducer); ok && exportDep {
1466*333d2b36SAndroid Build Coastguard Worker				lib.exportLinkDirs(linkPath)
1467*333d2b36SAndroid Build Coastguard Worker				lib.exportLinkObjects(linkObject.String())
1468*333d2b36SAndroid Build Coastguard Worker			}
1469*333d2b36SAndroid Build Coastguard Worker		} else {
1470*333d2b36SAndroid Build Coastguard Worker			switch {
1471*333d2b36SAndroid Build Coastguard Worker			case depTag == cc.CrtBeginDepTag:
1472*333d2b36SAndroid Build Coastguard Worker				depPaths.CrtBegin = append(depPaths.CrtBegin, android.OutputFileForModule(ctx, dep, ""))
1473*333d2b36SAndroid Build Coastguard Worker			case depTag == cc.CrtEndDepTag:
1474*333d2b36SAndroid Build Coastguard Worker				depPaths.CrtEnd = append(depPaths.CrtEnd, android.OutputFileForModule(ctx, dep, ""))
1475*333d2b36SAndroid Build Coastguard Worker			}
1476*333d2b36SAndroid Build Coastguard Worker		}
1477*333d2b36SAndroid Build Coastguard Worker
1478*333d2b36SAndroid Build Coastguard Worker		if srcDep, ok := dep.(android.SourceFileProducer); ok {
1479*333d2b36SAndroid Build Coastguard Worker			if android.IsSourceDepTagWithOutputTag(depTag, "") {
1480*333d2b36SAndroid Build Coastguard Worker				// These are usually genrules which don't have per-target variants.
1481*333d2b36SAndroid Build Coastguard Worker				directSrcDeps = append(directSrcDeps, srcDep)
1482*333d2b36SAndroid Build Coastguard Worker			}
1483*333d2b36SAndroid Build Coastguard Worker		}
1484*333d2b36SAndroid Build Coastguard Worker	})
1485*333d2b36SAndroid Build Coastguard Worker
1486*333d2b36SAndroid Build Coastguard Worker	mod.transitiveAndroidMkSharedLibs = depset.New[string](depset.PREORDER, directAndroidMkSharedLibs, transitiveAndroidMkSharedLibs)
1487*333d2b36SAndroid Build Coastguard Worker
1488*333d2b36SAndroid Build Coastguard Worker	var rlibDepFiles RustLibraries
1489*333d2b36SAndroid Build Coastguard Worker	aliases := mod.compiler.Aliases()
1490*333d2b36SAndroid Build Coastguard Worker	for _, dep := range directRlibDeps {
1491*333d2b36SAndroid Build Coastguard Worker		crateName := dep.CrateName()
1492*333d2b36SAndroid Build Coastguard Worker		if alias, aliased := aliases[crateName]; aliased {
1493*333d2b36SAndroid Build Coastguard Worker			crateName = alias
1494*333d2b36SAndroid Build Coastguard Worker		}
1495*333d2b36SAndroid Build Coastguard Worker		rlibDepFiles = append(rlibDepFiles, RustLibrary{Path: dep.UnstrippedOutputFile(), CrateName: crateName})
1496*333d2b36SAndroid Build Coastguard Worker	}
1497*333d2b36SAndroid Build Coastguard Worker	var dylibDepFiles RustLibraries
1498*333d2b36SAndroid Build Coastguard Worker	for _, dep := range directDylibDeps {
1499*333d2b36SAndroid Build Coastguard Worker		crateName := dep.CrateName()
1500*333d2b36SAndroid Build Coastguard Worker		if alias, aliased := aliases[crateName]; aliased {
1501*333d2b36SAndroid Build Coastguard Worker			crateName = alias
1502*333d2b36SAndroid Build Coastguard Worker		}
1503*333d2b36SAndroid Build Coastguard Worker		dylibDepFiles = append(dylibDepFiles, RustLibrary{Path: dep.UnstrippedOutputFile(), CrateName: crateName})
1504*333d2b36SAndroid Build Coastguard Worker	}
1505*333d2b36SAndroid Build Coastguard Worker	var procMacroDepFiles RustLibraries
1506*333d2b36SAndroid Build Coastguard Worker	for _, dep := range directProcMacroDeps {
1507*333d2b36SAndroid Build Coastguard Worker		crateName := dep.CrateName()
1508*333d2b36SAndroid Build Coastguard Worker		if alias, aliased := aliases[crateName]; aliased {
1509*333d2b36SAndroid Build Coastguard Worker			crateName = alias
1510*333d2b36SAndroid Build Coastguard Worker		}
1511*333d2b36SAndroid Build Coastguard Worker		procMacroDepFiles = append(procMacroDepFiles, RustLibrary{Path: dep.UnstrippedOutputFile(), CrateName: crateName})
1512*333d2b36SAndroid Build Coastguard Worker	}
1513*333d2b36SAndroid Build Coastguard Worker
1514*333d2b36SAndroid Build Coastguard Worker	var staticLibDepFiles android.Paths
1515*333d2b36SAndroid Build Coastguard Worker	for _, dep := range directStaticLibDeps {
1516*333d2b36SAndroid Build Coastguard Worker		staticLibDepFiles = append(staticLibDepFiles, dep.OutputFile().Path())
1517*333d2b36SAndroid Build Coastguard Worker	}
1518*333d2b36SAndroid Build Coastguard Worker
1519*333d2b36SAndroid Build Coastguard Worker	var sharedLibFiles android.Paths
1520*333d2b36SAndroid Build Coastguard Worker	var sharedLibDepFiles android.Paths
1521*333d2b36SAndroid Build Coastguard Worker	for _, dep := range directSharedLibDeps {
1522*333d2b36SAndroid Build Coastguard Worker		sharedLibFiles = append(sharedLibFiles, dep.SharedLibrary)
1523*333d2b36SAndroid Build Coastguard Worker		if dep.TableOfContents.Valid() {
1524*333d2b36SAndroid Build Coastguard Worker			sharedLibDepFiles = append(sharedLibDepFiles, dep.TableOfContents.Path())
1525*333d2b36SAndroid Build Coastguard Worker		} else {
1526*333d2b36SAndroid Build Coastguard Worker			sharedLibDepFiles = append(sharedLibDepFiles, dep.SharedLibrary)
1527*333d2b36SAndroid Build Coastguard Worker		}
1528*333d2b36SAndroid Build Coastguard Worker	}
1529*333d2b36SAndroid Build Coastguard Worker
1530*333d2b36SAndroid Build Coastguard Worker	var srcProviderDepFiles android.Paths
1531*333d2b36SAndroid Build Coastguard Worker	for _, dep := range directSrcProvidersDeps {
1532*333d2b36SAndroid Build Coastguard Worker		srcs := android.OutputFilesForModule(ctx, dep, "")
1533*333d2b36SAndroid Build Coastguard Worker		srcProviderDepFiles = append(srcProviderDepFiles, srcs...)
1534*333d2b36SAndroid Build Coastguard Worker	}
1535*333d2b36SAndroid Build Coastguard Worker	for _, dep := range directSrcDeps {
1536*333d2b36SAndroid Build Coastguard Worker		srcs := dep.Srcs()
1537*333d2b36SAndroid Build Coastguard Worker		srcProviderDepFiles = append(srcProviderDepFiles, srcs...)
1538*333d2b36SAndroid Build Coastguard Worker	}
1539*333d2b36SAndroid Build Coastguard Worker
1540*333d2b36SAndroid Build Coastguard Worker	depPaths.RLibs = append(depPaths.RLibs, rlibDepFiles...)
1541*333d2b36SAndroid Build Coastguard Worker	depPaths.DyLibs = append(depPaths.DyLibs, dylibDepFiles...)
1542*333d2b36SAndroid Build Coastguard Worker	depPaths.SharedLibs = append(depPaths.SharedLibs, sharedLibFiles...)
1543*333d2b36SAndroid Build Coastguard Worker	depPaths.SharedLibDeps = append(depPaths.SharedLibDeps, sharedLibDepFiles...)
1544*333d2b36SAndroid Build Coastguard Worker	depPaths.StaticLibs = append(depPaths.StaticLibs, staticLibDepFiles...)
1545*333d2b36SAndroid Build Coastguard Worker	depPaths.ProcMacros = append(depPaths.ProcMacros, procMacroDepFiles...)
1546*333d2b36SAndroid Build Coastguard Worker	depPaths.SrcDeps = append(depPaths.SrcDeps, srcProviderDepFiles...)
1547*333d2b36SAndroid Build Coastguard Worker
1548*333d2b36SAndroid Build Coastguard Worker	// Dedup exported flags from dependencies
1549*333d2b36SAndroid Build Coastguard Worker	depPaths.linkDirs = android.FirstUniqueStrings(depPaths.linkDirs)
1550*333d2b36SAndroid Build Coastguard Worker	depPaths.linkObjects = android.FirstUniqueStrings(depPaths.linkObjects)
1551*333d2b36SAndroid Build Coastguard Worker	depPaths.depFlags = android.FirstUniqueStrings(depPaths.depFlags)
1552*333d2b36SAndroid Build Coastguard Worker	depPaths.depClangFlags = android.FirstUniqueStrings(depPaths.depClangFlags)
1553*333d2b36SAndroid Build Coastguard Worker	depPaths.depIncludePaths = android.FirstUniquePaths(depPaths.depIncludePaths)
1554*333d2b36SAndroid Build Coastguard Worker	depPaths.depSystemIncludePaths = android.FirstUniquePaths(depPaths.depSystemIncludePaths)
1555*333d2b36SAndroid Build Coastguard Worker
1556*333d2b36SAndroid Build Coastguard Worker	return depPaths
1557*333d2b36SAndroid Build Coastguard Worker}
1558*333d2b36SAndroid Build Coastguard Worker
1559*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) InstallInData() bool {
1560*333d2b36SAndroid Build Coastguard Worker	if mod.compiler == nil {
1561*333d2b36SAndroid Build Coastguard Worker		return false
1562*333d2b36SAndroid Build Coastguard Worker	}
1563*333d2b36SAndroid Build Coastguard Worker	return mod.compiler.inData()
1564*333d2b36SAndroid Build Coastguard Worker}
1565*333d2b36SAndroid Build Coastguard Worker
1566*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) InstallInRamdisk() bool {
1567*333d2b36SAndroid Build Coastguard Worker	return mod.InRamdisk()
1568*333d2b36SAndroid Build Coastguard Worker}
1569*333d2b36SAndroid Build Coastguard Worker
1570*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) InstallInVendorRamdisk() bool {
1571*333d2b36SAndroid Build Coastguard Worker	return mod.InVendorRamdisk()
1572*333d2b36SAndroid Build Coastguard Worker}
1573*333d2b36SAndroid Build Coastguard Worker
1574*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) InstallInRecovery() bool {
1575*333d2b36SAndroid Build Coastguard Worker	return mod.InRecovery()
1576*333d2b36SAndroid Build Coastguard Worker}
1577*333d2b36SAndroid Build Coastguard Worker
1578*333d2b36SAndroid Build Coastguard Workerfunc linkPathFromFilePath(filepath android.Path) string {
1579*333d2b36SAndroid Build Coastguard Worker	return strings.Split(filepath.String(), filepath.Base())[0]
1580*333d2b36SAndroid Build Coastguard Worker}
1581*333d2b36SAndroid Build Coastguard Worker
1582*333d2b36SAndroid Build Coastguard Worker// usePublicApi returns true if the rust variant should link against NDK (publicapi)
1583*333d2b36SAndroid Build Coastguard Workerfunc (r *Module) usePublicApi() bool {
1584*333d2b36SAndroid Build Coastguard Worker	return r.Device() && r.UseSdk()
1585*333d2b36SAndroid Build Coastguard Worker}
1586*333d2b36SAndroid Build Coastguard Worker
1587*333d2b36SAndroid Build Coastguard Worker// useVendorApi returns true if the rust variant should link against LLNDK (vendorapi)
1588*333d2b36SAndroid Build Coastguard Workerfunc (r *Module) useVendorApi() bool {
1589*333d2b36SAndroid Build Coastguard Worker	return r.Device() && (r.InVendor() || r.InProduct())
1590*333d2b36SAndroid Build Coastguard Worker}
1591*333d2b36SAndroid Build Coastguard Worker
1592*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) DepsMutator(actx android.BottomUpMutatorContext) {
1593*333d2b36SAndroid Build Coastguard Worker	ctx := &depsContext{
1594*333d2b36SAndroid Build Coastguard Worker		BottomUpMutatorContext: actx,
1595*333d2b36SAndroid Build Coastguard Worker	}
1596*333d2b36SAndroid Build Coastguard Worker
1597*333d2b36SAndroid Build Coastguard Worker	deps := mod.deps(ctx)
1598*333d2b36SAndroid Build Coastguard Worker	var commonDepVariations []blueprint.Variation
1599*333d2b36SAndroid Build Coastguard Worker
1600*333d2b36SAndroid Build Coastguard Worker	if ctx.Os() == android.Android {
1601*333d2b36SAndroid Build Coastguard Worker		deps.SharedLibs, _ = cc.FilterNdkLibs(mod, ctx.Config(), deps.SharedLibs)
1602*333d2b36SAndroid Build Coastguard Worker	}
1603*333d2b36SAndroid Build Coastguard Worker
1604*333d2b36SAndroid Build Coastguard Worker	stdLinkage := "dylib-std"
1605*333d2b36SAndroid Build Coastguard Worker	if mod.compiler.stdLinkage(ctx) == RlibLinkage {
1606*333d2b36SAndroid Build Coastguard Worker		stdLinkage = "rlib-std"
1607*333d2b36SAndroid Build Coastguard Worker	}
1608*333d2b36SAndroid Build Coastguard Worker
1609*333d2b36SAndroid Build Coastguard Worker	rlibDepVariations := commonDepVariations
1610*333d2b36SAndroid Build Coastguard Worker
1611*333d2b36SAndroid Build Coastguard Worker	if lib, ok := mod.compiler.(libraryInterface); !ok || !lib.sysroot() {
1612*333d2b36SAndroid Build Coastguard Worker		rlibDepVariations = append(rlibDepVariations,
1613*333d2b36SAndroid Build Coastguard Worker			blueprint.Variation{Mutator: "rust_stdlinkage", Variation: stdLinkage})
1614*333d2b36SAndroid Build Coastguard Worker	}
1615*333d2b36SAndroid Build Coastguard Worker
1616*333d2b36SAndroid Build Coastguard Worker	// rlibs
1617*333d2b36SAndroid Build Coastguard Worker	rlibDepVariations = append(rlibDepVariations, blueprint.Variation{Mutator: "rust_libraries", Variation: rlibVariation})
1618*333d2b36SAndroid Build Coastguard Worker	for _, lib := range deps.Rlibs {
1619*333d2b36SAndroid Build Coastguard Worker		depTag := rlibDepTag
1620*333d2b36SAndroid Build Coastguard Worker		actx.AddVariationDependencies(rlibDepVariations, depTag, lib)
1621*333d2b36SAndroid Build Coastguard Worker	}
1622*333d2b36SAndroid Build Coastguard Worker
1623*333d2b36SAndroid Build Coastguard Worker	// dylibs
1624*333d2b36SAndroid Build Coastguard Worker	dylibDepVariations := append(commonDepVariations, blueprint.Variation{Mutator: "rust_libraries", Variation: dylibVariation})
1625*333d2b36SAndroid Build Coastguard Worker
1626*333d2b36SAndroid Build Coastguard Worker	for _, lib := range deps.Dylibs {
1627*333d2b36SAndroid Build Coastguard Worker		actx.AddVariationDependencies(dylibDepVariations, dylibDepTag, lib)
1628*333d2b36SAndroid Build Coastguard Worker	}
1629*333d2b36SAndroid Build Coastguard Worker
1630*333d2b36SAndroid Build Coastguard Worker	// rustlibs
1631*333d2b36SAndroid Build Coastguard Worker	if deps.Rustlibs != nil {
1632*333d2b36SAndroid Build Coastguard Worker		if !mod.compiler.Disabled() {
1633*333d2b36SAndroid Build Coastguard Worker			for _, lib := range deps.Rustlibs {
1634*333d2b36SAndroid Build Coastguard Worker				autoDep := mod.compiler.(autoDeppable).autoDep(ctx)
1635*333d2b36SAndroid Build Coastguard Worker				if autoDep.depTag == rlibDepTag {
1636*333d2b36SAndroid Build Coastguard Worker					// Handle the rlib deptag case
1637*333d2b36SAndroid Build Coastguard Worker					actx.AddVariationDependencies(rlibDepVariations, rlibDepTag, lib)
1638*333d2b36SAndroid Build Coastguard Worker
1639*333d2b36SAndroid Build Coastguard Worker				} else {
1640*333d2b36SAndroid Build Coastguard Worker					// autoDep.depTag is a dylib depTag. Not all rustlibs may be available as a dylib however.
1641*333d2b36SAndroid Build Coastguard Worker					// Check for the existence of the dylib deptag variant. Select it if available,
1642*333d2b36SAndroid Build Coastguard Worker					// otherwise select the rlib variant.
1643*333d2b36SAndroid Build Coastguard Worker					autoDepVariations := append(commonDepVariations,
1644*333d2b36SAndroid Build Coastguard Worker						blueprint.Variation{Mutator: "rust_libraries", Variation: autoDep.variation})
1645*333d2b36SAndroid Build Coastguard Worker					if actx.OtherModuleDependencyVariantExists(autoDepVariations, lib) {
1646*333d2b36SAndroid Build Coastguard Worker						actx.AddVariationDependencies(autoDepVariations, autoDep.depTag, lib)
1647*333d2b36SAndroid Build Coastguard Worker
1648*333d2b36SAndroid Build Coastguard Worker					} else {
1649*333d2b36SAndroid Build Coastguard Worker						// If there's no dylib dependency available, try to add the rlib dependency instead.
1650*333d2b36SAndroid Build Coastguard Worker						actx.AddVariationDependencies(rlibDepVariations, rlibDepTag, lib)
1651*333d2b36SAndroid Build Coastguard Worker
1652*333d2b36SAndroid Build Coastguard Worker					}
1653*333d2b36SAndroid Build Coastguard Worker				}
1654*333d2b36SAndroid Build Coastguard Worker			}
1655*333d2b36SAndroid Build Coastguard Worker		} else if _, ok := mod.sourceProvider.(*protobufDecorator); ok {
1656*333d2b36SAndroid Build Coastguard Worker			for _, lib := range deps.Rustlibs {
1657*333d2b36SAndroid Build Coastguard Worker				srcProviderVariations := append(commonDepVariations,
1658*333d2b36SAndroid Build Coastguard Worker					blueprint.Variation{Mutator: "rust_libraries", Variation: sourceVariation})
1659*333d2b36SAndroid Build Coastguard Worker
1660*333d2b36SAndroid Build Coastguard Worker				// Only add rustlib dependencies if they're source providers themselves.
1661*333d2b36SAndroid Build Coastguard Worker				// This is used to track which crate names need to be added to the source generated
1662*333d2b36SAndroid Build Coastguard Worker				// in the rust_protobuf mod.rs.
1663*333d2b36SAndroid Build Coastguard Worker				if actx.OtherModuleDependencyVariantExists(srcProviderVariations, lib) {
1664*333d2b36SAndroid Build Coastguard Worker					actx.AddVariationDependencies(srcProviderVariations, sourceDepTag, lib)
1665*333d2b36SAndroid Build Coastguard Worker				}
1666*333d2b36SAndroid Build Coastguard Worker			}
1667*333d2b36SAndroid Build Coastguard Worker		}
1668*333d2b36SAndroid Build Coastguard Worker	}
1669*333d2b36SAndroid Build Coastguard Worker
1670*333d2b36SAndroid Build Coastguard Worker	// stdlibs
1671*333d2b36SAndroid Build Coastguard Worker	if deps.Stdlibs != nil {
1672*333d2b36SAndroid Build Coastguard Worker		if mod.compiler.stdLinkage(ctx) == RlibLinkage {
1673*333d2b36SAndroid Build Coastguard Worker			for _, lib := range deps.Stdlibs {
1674*333d2b36SAndroid Build Coastguard Worker				actx.AddVariationDependencies(append(commonDepVariations, []blueprint.Variation{{Mutator: "rust_libraries", Variation: "rlib"}}...),
1675*333d2b36SAndroid Build Coastguard Worker					rlibDepTag, lib)
1676*333d2b36SAndroid Build Coastguard Worker			}
1677*333d2b36SAndroid Build Coastguard Worker		} else {
1678*333d2b36SAndroid Build Coastguard Worker			for _, lib := range deps.Stdlibs {
1679*333d2b36SAndroid Build Coastguard Worker				actx.AddVariationDependencies(dylibDepVariations, dylibDepTag, lib)
1680*333d2b36SAndroid Build Coastguard Worker
1681*333d2b36SAndroid Build Coastguard Worker			}
1682*333d2b36SAndroid Build Coastguard Worker		}
1683*333d2b36SAndroid Build Coastguard Worker	}
1684*333d2b36SAndroid Build Coastguard Worker
1685*333d2b36SAndroid Build Coastguard Worker	for _, lib := range deps.SharedLibs {
1686*333d2b36SAndroid Build Coastguard Worker		depTag := cc.SharedDepTag()
1687*333d2b36SAndroid Build Coastguard Worker		name, version := cc.StubsLibNameAndVersion(lib)
1688*333d2b36SAndroid Build Coastguard Worker
1689*333d2b36SAndroid Build Coastguard Worker		variations := []blueprint.Variation{
1690*333d2b36SAndroid Build Coastguard Worker			{Mutator: "link", Variation: "shared"},
1691*333d2b36SAndroid Build Coastguard Worker		}
1692*333d2b36SAndroid Build Coastguard Worker		cc.AddSharedLibDependenciesWithVersions(ctx, mod, variations, depTag, name, version, false)
1693*333d2b36SAndroid Build Coastguard Worker	}
1694*333d2b36SAndroid Build Coastguard Worker
1695*333d2b36SAndroid Build Coastguard Worker	for _, lib := range deps.WholeStaticLibs {
1696*333d2b36SAndroid Build Coastguard Worker		depTag := cc.StaticDepTag(true)
1697*333d2b36SAndroid Build Coastguard Worker
1698*333d2b36SAndroid Build Coastguard Worker		actx.AddVariationDependencies([]blueprint.Variation{
1699*333d2b36SAndroid Build Coastguard Worker			{Mutator: "link", Variation: "static"},
1700*333d2b36SAndroid Build Coastguard Worker		}, depTag, lib)
1701*333d2b36SAndroid Build Coastguard Worker	}
1702*333d2b36SAndroid Build Coastguard Worker
1703*333d2b36SAndroid Build Coastguard Worker	for _, lib := range deps.StaticLibs {
1704*333d2b36SAndroid Build Coastguard Worker		depTag := cc.StaticDepTag(false)
1705*333d2b36SAndroid Build Coastguard Worker
1706*333d2b36SAndroid Build Coastguard Worker		actx.AddVariationDependencies([]blueprint.Variation{
1707*333d2b36SAndroid Build Coastguard Worker			{Mutator: "link", Variation: "static"},
1708*333d2b36SAndroid Build Coastguard Worker		}, depTag, lib)
1709*333d2b36SAndroid Build Coastguard Worker	}
1710*333d2b36SAndroid Build Coastguard Worker
1711*333d2b36SAndroid Build Coastguard Worker	actx.AddVariationDependencies(nil, cc.HeaderDepTag(), deps.HeaderLibs...)
1712*333d2b36SAndroid Build Coastguard Worker
1713*333d2b36SAndroid Build Coastguard Worker	crtVariations := cc.GetCrtVariations(ctx, mod)
1714*333d2b36SAndroid Build Coastguard Worker	for _, crt := range deps.CrtBegin {
1715*333d2b36SAndroid Build Coastguard Worker		actx.AddVariationDependencies(crtVariations, cc.CrtBeginDepTag, crt)
1716*333d2b36SAndroid Build Coastguard Worker	}
1717*333d2b36SAndroid Build Coastguard Worker	for _, crt := range deps.CrtEnd {
1718*333d2b36SAndroid Build Coastguard Worker		actx.AddVariationDependencies(crtVariations, cc.CrtEndDepTag, crt)
1719*333d2b36SAndroid Build Coastguard Worker	}
1720*333d2b36SAndroid Build Coastguard Worker
1721*333d2b36SAndroid Build Coastguard Worker	if mod.sourceProvider != nil {
1722*333d2b36SAndroid Build Coastguard Worker		if bindgen, ok := mod.sourceProvider.(*bindgenDecorator); ok &&
1723*333d2b36SAndroid Build Coastguard Worker			bindgen.Properties.Custom_bindgen != "" {
1724*333d2b36SAndroid Build Coastguard Worker			actx.AddFarVariationDependencies(ctx.Config().BuildOSTarget.Variations(), customBindgenDepTag,
1725*333d2b36SAndroid Build Coastguard Worker				bindgen.Properties.Custom_bindgen)
1726*333d2b36SAndroid Build Coastguard Worker		}
1727*333d2b36SAndroid Build Coastguard Worker	}
1728*333d2b36SAndroid Build Coastguard Worker
1729*333d2b36SAndroid Build Coastguard Worker	actx.AddVariationDependencies([]blueprint.Variation{
1730*333d2b36SAndroid Build Coastguard Worker		{Mutator: "link", Variation: "shared"},
1731*333d2b36SAndroid Build Coastguard Worker	}, dataLibDepTag, deps.DataLibs...)
1732*333d2b36SAndroid Build Coastguard Worker
1733*333d2b36SAndroid Build Coastguard Worker	actx.AddVariationDependencies(nil, dataBinDepTag, deps.DataBins...)
1734*333d2b36SAndroid Build Coastguard Worker
1735*333d2b36SAndroid Build Coastguard Worker	// proc_macros are compiler plugins, and so we need the host arch variant as a dependendcy.
1736*333d2b36SAndroid Build Coastguard Worker	actx.AddFarVariationDependencies(ctx.Config().BuildOSTarget.Variations(), procMacroDepTag, deps.ProcMacros...)
1737*333d2b36SAndroid Build Coastguard Worker
1738*333d2b36SAndroid Build Coastguard Worker	mod.afdo.addDep(ctx, actx)
1739*333d2b36SAndroid Build Coastguard Worker}
1740*333d2b36SAndroid Build Coastguard Worker
1741*333d2b36SAndroid Build Coastguard Workerfunc BeginMutator(ctx android.BottomUpMutatorContext) {
1742*333d2b36SAndroid Build Coastguard Worker	if mod, ok := ctx.Module().(*Module); ok && mod.Enabled(ctx) {
1743*333d2b36SAndroid Build Coastguard Worker		mod.beginMutator(ctx)
1744*333d2b36SAndroid Build Coastguard Worker	}
1745*333d2b36SAndroid Build Coastguard Worker}
1746*333d2b36SAndroid Build Coastguard Worker
1747*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) beginMutator(actx android.BottomUpMutatorContext) {
1748*333d2b36SAndroid Build Coastguard Worker	ctx := &baseModuleContext{
1749*333d2b36SAndroid Build Coastguard Worker		BaseModuleContext: actx,
1750*333d2b36SAndroid Build Coastguard Worker	}
1751*333d2b36SAndroid Build Coastguard Worker
1752*333d2b36SAndroid Build Coastguard Worker	mod.begin(ctx)
1753*333d2b36SAndroid Build Coastguard Worker}
1754*333d2b36SAndroid Build Coastguard Worker
1755*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) Name() string {
1756*333d2b36SAndroid Build Coastguard Worker	name := mod.ModuleBase.Name()
1757*333d2b36SAndroid Build Coastguard Worker	if p, ok := mod.compiler.(interface {
1758*333d2b36SAndroid Build Coastguard Worker		Name(string) string
1759*333d2b36SAndroid Build Coastguard Worker	}); ok {
1760*333d2b36SAndroid Build Coastguard Worker		name = p.Name(name)
1761*333d2b36SAndroid Build Coastguard Worker	}
1762*333d2b36SAndroid Build Coastguard Worker	return name
1763*333d2b36SAndroid Build Coastguard Worker}
1764*333d2b36SAndroid Build Coastguard Worker
1765*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) disableClippy() {
1766*333d2b36SAndroid Build Coastguard Worker	if mod.clippy != nil {
1767*333d2b36SAndroid Build Coastguard Worker		mod.clippy.Properties.Clippy_lints = proptools.StringPtr("none")
1768*333d2b36SAndroid Build Coastguard Worker	}
1769*333d2b36SAndroid Build Coastguard Worker}
1770*333d2b36SAndroid Build Coastguard Worker
1771*333d2b36SAndroid Build Coastguard Workervar _ android.HostToolProvider = (*Module)(nil)
1772*333d2b36SAndroid Build Coastguard Worker
1773*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) HostToolPath() android.OptionalPath {
1774*333d2b36SAndroid Build Coastguard Worker	if !mod.Host() {
1775*333d2b36SAndroid Build Coastguard Worker		return android.OptionalPath{}
1776*333d2b36SAndroid Build Coastguard Worker	}
1777*333d2b36SAndroid Build Coastguard Worker	if binary, ok := mod.compiler.(*binaryDecorator); ok {
1778*333d2b36SAndroid Build Coastguard Worker		return android.OptionalPathForPath(binary.baseCompiler.path)
1779*333d2b36SAndroid Build Coastguard Worker	} else if pm, ok := mod.compiler.(*procMacroDecorator); ok {
1780*333d2b36SAndroid Build Coastguard Worker		// Even though proc-macros aren't strictly "tools", since they target the compiler
1781*333d2b36SAndroid Build Coastguard Worker		// and act as compiler plugins, we treat them similarly.
1782*333d2b36SAndroid Build Coastguard Worker		return android.OptionalPathForPath(pm.baseCompiler.path)
1783*333d2b36SAndroid Build Coastguard Worker	}
1784*333d2b36SAndroid Build Coastguard Worker	return android.OptionalPath{}
1785*333d2b36SAndroid Build Coastguard Worker}
1786*333d2b36SAndroid Build Coastguard Worker
1787*333d2b36SAndroid Build Coastguard Workervar _ android.ApexModule = (*Module)(nil)
1788*333d2b36SAndroid Build Coastguard Worker
1789*333d2b36SAndroid Build Coastguard Worker// If a module is marked for exclusion from apexes, don't provide apex variants.
1790*333d2b36SAndroid Build Coastguard Worker// TODO(b/362509506): remove this once stubs are properly supported by rust_ffi targets.
1791*333d2b36SAndroid Build Coastguard Workerfunc (m *Module) CanHaveApexVariants() bool {
1792*333d2b36SAndroid Build Coastguard Worker	if m.ApexExclude() {
1793*333d2b36SAndroid Build Coastguard Worker		return false
1794*333d2b36SAndroid Build Coastguard Worker	} else {
1795*333d2b36SAndroid Build Coastguard Worker		return m.ApexModuleBase.CanHaveApexVariants()
1796*333d2b36SAndroid Build Coastguard Worker	}
1797*333d2b36SAndroid Build Coastguard Worker}
1798*333d2b36SAndroid Build Coastguard Worker
1799*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) MinSdkVersion() string {
1800*333d2b36SAndroid Build Coastguard Worker	return String(mod.Properties.Min_sdk_version)
1801*333d2b36SAndroid Build Coastguard Worker}
1802*333d2b36SAndroid Build Coastguard Worker
1803*333d2b36SAndroid Build Coastguard Worker// Implements android.ApexModule
1804*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) ShouldSupportSdkVersion(ctx android.BaseModuleContext, sdkVersion android.ApiLevel) error {
1805*333d2b36SAndroid Build Coastguard Worker	minSdkVersion := mod.MinSdkVersion()
1806*333d2b36SAndroid Build Coastguard Worker	if minSdkVersion == "apex_inherit" {
1807*333d2b36SAndroid Build Coastguard Worker		return nil
1808*333d2b36SAndroid Build Coastguard Worker	}
1809*333d2b36SAndroid Build Coastguard Worker	if minSdkVersion == "" {
1810*333d2b36SAndroid Build Coastguard Worker		return fmt.Errorf("min_sdk_version is not specificed")
1811*333d2b36SAndroid Build Coastguard Worker	}
1812*333d2b36SAndroid Build Coastguard Worker
1813*333d2b36SAndroid Build Coastguard Worker	// Not using nativeApiLevelFromUser because the context here is not
1814*333d2b36SAndroid Build Coastguard Worker	// necessarily a native context.
1815*333d2b36SAndroid Build Coastguard Worker	ver, err := android.ApiLevelFromUser(ctx, minSdkVersion)
1816*333d2b36SAndroid Build Coastguard Worker	if err != nil {
1817*333d2b36SAndroid Build Coastguard Worker		return err
1818*333d2b36SAndroid Build Coastguard Worker	}
1819*333d2b36SAndroid Build Coastguard Worker
1820*333d2b36SAndroid Build Coastguard Worker	if ver.GreaterThan(sdkVersion) {
1821*333d2b36SAndroid Build Coastguard Worker		return fmt.Errorf("newer SDK(%v)", ver)
1822*333d2b36SAndroid Build Coastguard Worker	}
1823*333d2b36SAndroid Build Coastguard Worker	return nil
1824*333d2b36SAndroid Build Coastguard Worker}
1825*333d2b36SAndroid Build Coastguard Worker
1826*333d2b36SAndroid Build Coastguard Worker// Implements android.ApexModule
1827*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) DepIsInSameApex(ctx android.BaseModuleContext, dep android.Module) bool {
1828*333d2b36SAndroid Build Coastguard Worker	depTag := ctx.OtherModuleDependencyTag(dep)
1829*333d2b36SAndroid Build Coastguard Worker
1830*333d2b36SAndroid Build Coastguard Worker	if ccm, ok := dep.(*cc.Module); ok {
1831*333d2b36SAndroid Build Coastguard Worker		if ccm.HasStubsVariants() {
1832*333d2b36SAndroid Build Coastguard Worker			if cc.IsSharedDepTag(depTag) {
1833*333d2b36SAndroid Build Coastguard Worker				// dynamic dep to a stubs lib crosses APEX boundary
1834*333d2b36SAndroid Build Coastguard Worker				return false
1835*333d2b36SAndroid Build Coastguard Worker			}
1836*333d2b36SAndroid Build Coastguard Worker			if cc.IsRuntimeDepTag(depTag) {
1837*333d2b36SAndroid Build Coastguard Worker				// runtime dep to a stubs lib also crosses APEX boundary
1838*333d2b36SAndroid Build Coastguard Worker				return false
1839*333d2b36SAndroid Build Coastguard Worker			}
1840*333d2b36SAndroid Build Coastguard Worker
1841*333d2b36SAndroid Build Coastguard Worker			if cc.IsHeaderDepTag(depTag) {
1842*333d2b36SAndroid Build Coastguard Worker				return false
1843*333d2b36SAndroid Build Coastguard Worker			}
1844*333d2b36SAndroid Build Coastguard Worker		}
1845*333d2b36SAndroid Build Coastguard Worker		if mod.Static() && cc.IsSharedDepTag(depTag) {
1846*333d2b36SAndroid Build Coastguard Worker			// shared_lib dependency from a static lib is considered as crossing
1847*333d2b36SAndroid Build Coastguard Worker			// the APEX boundary because the dependency doesn't actually is
1848*333d2b36SAndroid Build Coastguard Worker			// linked; the dependency is used only during the compilation phase.
1849*333d2b36SAndroid Build Coastguard Worker			return false
1850*333d2b36SAndroid Build Coastguard Worker		}
1851*333d2b36SAndroid Build Coastguard Worker	}
1852*333d2b36SAndroid Build Coastguard Worker
1853*333d2b36SAndroid Build Coastguard Worker	if depTag == procMacroDepTag || depTag == customBindgenDepTag {
1854*333d2b36SAndroid Build Coastguard Worker		return false
1855*333d2b36SAndroid Build Coastguard Worker	}
1856*333d2b36SAndroid Build Coastguard Worker
1857*333d2b36SAndroid Build Coastguard Worker	if rustDep, ok := dep.(*Module); ok && rustDep.ApexExclude() {
1858*333d2b36SAndroid Build Coastguard Worker		return false
1859*333d2b36SAndroid Build Coastguard Worker	}
1860*333d2b36SAndroid Build Coastguard Worker
1861*333d2b36SAndroid Build Coastguard Worker	return true
1862*333d2b36SAndroid Build Coastguard Worker}
1863*333d2b36SAndroid Build Coastguard Worker
1864*333d2b36SAndroid Build Coastguard Worker// Overrides ApexModule.IsInstallabeToApex()
1865*333d2b36SAndroid Build Coastguard Workerfunc (mod *Module) IsInstallableToApex() bool {
1866*333d2b36SAndroid Build Coastguard Worker	if mod.compiler != nil {
1867*333d2b36SAndroid Build Coastguard Worker		if lib, ok := mod.compiler.(libraryInterface); ok && (lib.shared() || lib.dylib()) {
1868*333d2b36SAndroid Build Coastguard Worker			return true
1869*333d2b36SAndroid Build Coastguard Worker		}
1870*333d2b36SAndroid Build Coastguard Worker		if _, ok := mod.compiler.(*binaryDecorator); ok {
1871*333d2b36SAndroid Build Coastguard Worker			return true
1872*333d2b36SAndroid Build Coastguard Worker		}
1873*333d2b36SAndroid Build Coastguard Worker	}
1874*333d2b36SAndroid Build Coastguard Worker	return false
1875*333d2b36SAndroid Build Coastguard Worker}
1876*333d2b36SAndroid Build Coastguard Worker
1877*333d2b36SAndroid Build Coastguard Worker// If a library file has a "lib" prefix, extract the library name without the prefix.
1878*333d2b36SAndroid Build Coastguard Workerfunc libNameFromFilePath(filepath android.Path) (string, bool) {
1879*333d2b36SAndroid Build Coastguard Worker	libName := strings.TrimSuffix(filepath.Base(), filepath.Ext())
1880*333d2b36SAndroid Build Coastguard Worker	if strings.HasPrefix(libName, "lib") {
1881*333d2b36SAndroid Build Coastguard Worker		libName = libName[3:]
1882*333d2b36SAndroid Build Coastguard Worker		return libName, true
1883*333d2b36SAndroid Build Coastguard Worker	}
1884*333d2b36SAndroid Build Coastguard Worker	return "", false
1885*333d2b36SAndroid Build Coastguard Worker}
1886*333d2b36SAndroid Build Coastguard Worker
1887*333d2b36SAndroid Build Coastguard Workerfunc kytheExtractRustFactory() android.Singleton {
1888*333d2b36SAndroid Build Coastguard Worker	return &kytheExtractRustSingleton{}
1889*333d2b36SAndroid Build Coastguard Worker}
1890*333d2b36SAndroid Build Coastguard Worker
1891*333d2b36SAndroid Build Coastguard Workertype kytheExtractRustSingleton struct {
1892*333d2b36SAndroid Build Coastguard Worker}
1893*333d2b36SAndroid Build Coastguard Worker
1894*333d2b36SAndroid Build Coastguard Workerfunc (k kytheExtractRustSingleton) GenerateBuildActions(ctx android.SingletonContext) {
1895*333d2b36SAndroid Build Coastguard Worker	var xrefTargets android.Paths
1896*333d2b36SAndroid Build Coastguard Worker	ctx.VisitAllModules(func(module android.Module) {
1897*333d2b36SAndroid Build Coastguard Worker		if rustModule, ok := module.(xref); ok {
1898*333d2b36SAndroid Build Coastguard Worker			xrefTargets = append(xrefTargets, rustModule.XrefRustFiles()...)
1899*333d2b36SAndroid Build Coastguard Worker		}
1900*333d2b36SAndroid Build Coastguard Worker	})
1901*333d2b36SAndroid Build Coastguard Worker	if len(xrefTargets) > 0 {
1902*333d2b36SAndroid Build Coastguard Worker		ctx.Phony("xref_rust", xrefTargets...)
1903*333d2b36SAndroid Build Coastguard Worker	}
1904*333d2b36SAndroid Build Coastguard Worker}
1905*333d2b36SAndroid Build Coastguard Worker
1906*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) Partition() string {
1907*333d2b36SAndroid Build Coastguard Worker	return ""
1908*333d2b36SAndroid Build Coastguard Worker}
1909*333d2b36SAndroid Build Coastguard Worker
1910*333d2b36SAndroid Build Coastguard Workervar Bool = proptools.Bool
1911*333d2b36SAndroid Build Coastguard Workervar BoolDefault = proptools.BoolDefault
1912*333d2b36SAndroid Build Coastguard Workervar String = proptools.String
1913*333d2b36SAndroid Build Coastguard Workervar StringPtr = proptools.StringPtr
1914