xref: /aosp_15_r20/build/soong/rust/prebuilt.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	"android/soong/android"
19*333d2b36SAndroid Build Coastguard Worker)
20*333d2b36SAndroid Build Coastguard Worker
21*333d2b36SAndroid Build Coastguard Workerfunc init() {
22*333d2b36SAndroid Build Coastguard Worker	android.RegisterModuleType("rust_prebuilt_library", PrebuiltLibraryFactory)
23*333d2b36SAndroid Build Coastguard Worker	android.RegisterModuleType("rust_prebuilt_dylib", PrebuiltDylibFactory)
24*333d2b36SAndroid Build Coastguard Worker	android.RegisterModuleType("rust_prebuilt_rlib", PrebuiltRlibFactory)
25*333d2b36SAndroid Build Coastguard Worker	android.RegisterModuleType("rust_prebuilt_proc_macro", PrebuiltProcMacroFactory)
26*333d2b36SAndroid Build Coastguard Worker}
27*333d2b36SAndroid Build Coastguard Worker
28*333d2b36SAndroid Build Coastguard Workertype PrebuiltProperties struct {
29*333d2b36SAndroid Build Coastguard Worker	// path to the prebuilt file
30*333d2b36SAndroid Build Coastguard Worker	Srcs []string `android:"path,arch_variant"`
31*333d2b36SAndroid Build Coastguard Worker	// directories containing associated rlib dependencies
32*333d2b36SAndroid Build Coastguard Worker	Link_dirs []string `android:"path,arch_variant"`
33*333d2b36SAndroid Build Coastguard Worker}
34*333d2b36SAndroid Build Coastguard Worker
35*333d2b36SAndroid Build Coastguard Workertype prebuiltLibraryDecorator struct {
36*333d2b36SAndroid Build Coastguard Worker	android.Prebuilt
37*333d2b36SAndroid Build Coastguard Worker
38*333d2b36SAndroid Build Coastguard Worker	*libraryDecorator
39*333d2b36SAndroid Build Coastguard Worker	Properties PrebuiltProperties
40*333d2b36SAndroid Build Coastguard Worker}
41*333d2b36SAndroid Build Coastguard Worker
42*333d2b36SAndroid Build Coastguard Workertype prebuiltProcMacroDecorator struct {
43*333d2b36SAndroid Build Coastguard Worker	android.Prebuilt
44*333d2b36SAndroid Build Coastguard Worker
45*333d2b36SAndroid Build Coastguard Worker	*procMacroDecorator
46*333d2b36SAndroid Build Coastguard Worker	Properties PrebuiltProperties
47*333d2b36SAndroid Build Coastguard Worker}
48*333d2b36SAndroid Build Coastguard Worker
49*333d2b36SAndroid Build Coastguard Workerfunc PrebuiltProcMacroFactory() android.Module {
50*333d2b36SAndroid Build Coastguard Worker	module, _ := NewPrebuiltProcMacro(android.HostSupportedNoCross)
51*333d2b36SAndroid Build Coastguard Worker	return module.Init()
52*333d2b36SAndroid Build Coastguard Worker}
53*333d2b36SAndroid Build Coastguard Worker
54*333d2b36SAndroid Build Coastguard Workertype rustPrebuilt interface {
55*333d2b36SAndroid Build Coastguard Worker	prebuiltSrcs() []string
56*333d2b36SAndroid Build Coastguard Worker	prebuilt() *android.Prebuilt
57*333d2b36SAndroid Build Coastguard Worker}
58*333d2b36SAndroid Build Coastguard Worker
59*333d2b36SAndroid Build Coastguard Workerfunc NewPrebuiltProcMacro(hod android.HostOrDeviceSupported) (*Module, *prebuiltProcMacroDecorator) {
60*333d2b36SAndroid Build Coastguard Worker	module, library := NewProcMacro(hod)
61*333d2b36SAndroid Build Coastguard Worker	prebuilt := &prebuiltProcMacroDecorator{
62*333d2b36SAndroid Build Coastguard Worker		procMacroDecorator: library,
63*333d2b36SAndroid Build Coastguard Worker	}
64*333d2b36SAndroid Build Coastguard Worker	module.compiler = prebuilt
65*333d2b36SAndroid Build Coastguard Worker
66*333d2b36SAndroid Build Coastguard Worker	addSrcSupplier(module, prebuilt)
67*333d2b36SAndroid Build Coastguard Worker
68*333d2b36SAndroid Build Coastguard Worker	return module, prebuilt
69*333d2b36SAndroid Build Coastguard Worker}
70*333d2b36SAndroid Build Coastguard Worker
71*333d2b36SAndroid Build Coastguard Workervar _ compiler = (*prebuiltLibraryDecorator)(nil)
72*333d2b36SAndroid Build Coastguard Workervar _ exportedFlagsProducer = (*prebuiltLibraryDecorator)(nil)
73*333d2b36SAndroid Build Coastguard Workervar _ rustPrebuilt = (*prebuiltLibraryDecorator)(nil)
74*333d2b36SAndroid Build Coastguard Worker
75*333d2b36SAndroid Build Coastguard Workervar _ compiler = (*prebuiltProcMacroDecorator)(nil)
76*333d2b36SAndroid Build Coastguard Workervar _ exportedFlagsProducer = (*prebuiltProcMacroDecorator)(nil)
77*333d2b36SAndroid Build Coastguard Workervar _ rustPrebuilt = (*prebuiltProcMacroDecorator)(nil)
78*333d2b36SAndroid Build Coastguard Worker
79*333d2b36SAndroid Build Coastguard Workerfunc prebuiltPath(ctx ModuleContext, prebuilt rustPrebuilt) android.Path {
80*333d2b36SAndroid Build Coastguard Worker	srcs := android.PathsForModuleSrc(ctx, prebuilt.prebuiltSrcs())
81*333d2b36SAndroid Build Coastguard Worker	if len(srcs) == 0 {
82*333d2b36SAndroid Build Coastguard Worker		ctx.PropertyErrorf("srcs", "srcs must not be empty")
83*333d2b36SAndroid Build Coastguard Worker	}
84*333d2b36SAndroid Build Coastguard Worker	if len(srcs) > 1 {
85*333d2b36SAndroid Build Coastguard Worker		ctx.PropertyErrorf("srcs", "prebuilt libraries can only have one entry in srcs (the prebuilt path)")
86*333d2b36SAndroid Build Coastguard Worker	}
87*333d2b36SAndroid Build Coastguard Worker	return srcs[0]
88*333d2b36SAndroid Build Coastguard Worker}
89*333d2b36SAndroid Build Coastguard Worker
90*333d2b36SAndroid Build Coastguard Workerfunc PrebuiltLibraryFactory() android.Module {
91*333d2b36SAndroid Build Coastguard Worker	module, _ := NewPrebuiltLibrary(android.HostAndDeviceSupported)
92*333d2b36SAndroid Build Coastguard Worker	return module.Init()
93*333d2b36SAndroid Build Coastguard Worker}
94*333d2b36SAndroid Build Coastguard Worker
95*333d2b36SAndroid Build Coastguard Workerfunc PrebuiltDylibFactory() android.Module {
96*333d2b36SAndroid Build Coastguard Worker	module, _ := NewPrebuiltDylib(android.HostAndDeviceSupported)
97*333d2b36SAndroid Build Coastguard Worker	return module.Init()
98*333d2b36SAndroid Build Coastguard Worker}
99*333d2b36SAndroid Build Coastguard Worker
100*333d2b36SAndroid Build Coastguard Workerfunc PrebuiltRlibFactory() android.Module {
101*333d2b36SAndroid Build Coastguard Worker	module, _ := NewPrebuiltRlib(android.HostAndDeviceSupported)
102*333d2b36SAndroid Build Coastguard Worker	return module.Init()
103*333d2b36SAndroid Build Coastguard Worker}
104*333d2b36SAndroid Build Coastguard Worker
105*333d2b36SAndroid Build Coastguard Workerfunc addSrcSupplier(module android.PrebuiltInterface, prebuilt rustPrebuilt) {
106*333d2b36SAndroid Build Coastguard Worker	srcsSupplier := func(_ android.BaseModuleContext, _ android.Module) []string {
107*333d2b36SAndroid Build Coastguard Worker		return prebuilt.prebuiltSrcs()
108*333d2b36SAndroid Build Coastguard Worker	}
109*333d2b36SAndroid Build Coastguard Worker	android.InitPrebuiltModuleWithSrcSupplier(module, srcsSupplier, "srcs")
110*333d2b36SAndroid Build Coastguard Worker}
111*333d2b36SAndroid Build Coastguard Worker
112*333d2b36SAndroid Build Coastguard Workerfunc NewPrebuiltLibrary(hod android.HostOrDeviceSupported) (*Module, *prebuiltLibraryDecorator) {
113*333d2b36SAndroid Build Coastguard Worker	module, library := NewRustLibrary(hod)
114*333d2b36SAndroid Build Coastguard Worker	library.BuildOnlyRust()
115*333d2b36SAndroid Build Coastguard Worker	library.setNoStdlibs()
116*333d2b36SAndroid Build Coastguard Worker	prebuilt := &prebuiltLibraryDecorator{
117*333d2b36SAndroid Build Coastguard Worker		libraryDecorator: library,
118*333d2b36SAndroid Build Coastguard Worker	}
119*333d2b36SAndroid Build Coastguard Worker	module.compiler = prebuilt
120*333d2b36SAndroid Build Coastguard Worker
121*333d2b36SAndroid Build Coastguard Worker	addSrcSupplier(module, prebuilt)
122*333d2b36SAndroid Build Coastguard Worker
123*333d2b36SAndroid Build Coastguard Worker	return module, prebuilt
124*333d2b36SAndroid Build Coastguard Worker}
125*333d2b36SAndroid Build Coastguard Worker
126*333d2b36SAndroid Build Coastguard Workerfunc NewPrebuiltDylib(hod android.HostOrDeviceSupported) (*Module, *prebuiltLibraryDecorator) {
127*333d2b36SAndroid Build Coastguard Worker	module, library := NewRustLibrary(hod)
128*333d2b36SAndroid Build Coastguard Worker	library.BuildOnlyDylib()
129*333d2b36SAndroid Build Coastguard Worker	library.setNoStdlibs()
130*333d2b36SAndroid Build Coastguard Worker	prebuilt := &prebuiltLibraryDecorator{
131*333d2b36SAndroid Build Coastguard Worker		libraryDecorator: library,
132*333d2b36SAndroid Build Coastguard Worker	}
133*333d2b36SAndroid Build Coastguard Worker	module.compiler = prebuilt
134*333d2b36SAndroid Build Coastguard Worker
135*333d2b36SAndroid Build Coastguard Worker	addSrcSupplier(module, prebuilt)
136*333d2b36SAndroid Build Coastguard Worker
137*333d2b36SAndroid Build Coastguard Worker	return module, prebuilt
138*333d2b36SAndroid Build Coastguard Worker}
139*333d2b36SAndroid Build Coastguard Worker
140*333d2b36SAndroid Build Coastguard Workerfunc NewPrebuiltRlib(hod android.HostOrDeviceSupported) (*Module, *prebuiltLibraryDecorator) {
141*333d2b36SAndroid Build Coastguard Worker	module, library := NewRustLibrary(hod)
142*333d2b36SAndroid Build Coastguard Worker	library.BuildOnlyRlib()
143*333d2b36SAndroid Build Coastguard Worker	library.setNoStdlibs()
144*333d2b36SAndroid Build Coastguard Worker	prebuilt := &prebuiltLibraryDecorator{
145*333d2b36SAndroid Build Coastguard Worker		libraryDecorator: library,
146*333d2b36SAndroid Build Coastguard Worker	}
147*333d2b36SAndroid Build Coastguard Worker	module.compiler = prebuilt
148*333d2b36SAndroid Build Coastguard Worker
149*333d2b36SAndroid Build Coastguard Worker	addSrcSupplier(module, prebuilt)
150*333d2b36SAndroid Build Coastguard Worker
151*333d2b36SAndroid Build Coastguard Worker	return module, prebuilt
152*333d2b36SAndroid Build Coastguard Worker}
153*333d2b36SAndroid Build Coastguard Worker
154*333d2b36SAndroid Build Coastguard Workerfunc (prebuilt *prebuiltLibraryDecorator) compilerProps() []interface{} {
155*333d2b36SAndroid Build Coastguard Worker	return append(prebuilt.libraryDecorator.compilerProps(),
156*333d2b36SAndroid Build Coastguard Worker		&prebuilt.Properties)
157*333d2b36SAndroid Build Coastguard Worker}
158*333d2b36SAndroid Build Coastguard Worker
159*333d2b36SAndroid Build Coastguard Workerfunc (prebuilt *prebuiltLibraryDecorator) compile(ctx ModuleContext, flags Flags, deps PathDeps) buildOutput {
160*333d2b36SAndroid Build Coastguard Worker	prebuilt.flagExporter.exportLinkDirs(android.PathsForModuleSrc(ctx, prebuilt.Properties.Link_dirs).Strings()...)
161*333d2b36SAndroid Build Coastguard Worker	prebuilt.flagExporter.setProvider(ctx)
162*333d2b36SAndroid Build Coastguard Worker	srcPath := prebuiltPath(ctx, prebuilt)
163*333d2b36SAndroid Build Coastguard Worker	prebuilt.baseCompiler.unstrippedOutputFile = srcPath
164*333d2b36SAndroid Build Coastguard Worker	return buildOutput{outputFile: srcPath}
165*333d2b36SAndroid Build Coastguard Worker}
166*333d2b36SAndroid Build Coastguard Worker
167*333d2b36SAndroid Build Coastguard Workerfunc (prebuilt *prebuiltLibraryDecorator) rustdoc(ctx ModuleContext, flags Flags,
168*333d2b36SAndroid Build Coastguard Worker	deps PathDeps) android.OptionalPath {
169*333d2b36SAndroid Build Coastguard Worker
170*333d2b36SAndroid Build Coastguard Worker	return android.OptionalPath{}
171*333d2b36SAndroid Build Coastguard Worker}
172*333d2b36SAndroid Build Coastguard Worker
173*333d2b36SAndroid Build Coastguard Workerfunc (prebuilt *prebuiltLibraryDecorator) compilerDeps(ctx DepsContext, deps Deps) Deps {
174*333d2b36SAndroid Build Coastguard Worker	deps = prebuilt.baseCompiler.compilerDeps(ctx, deps)
175*333d2b36SAndroid Build Coastguard Worker	return deps
176*333d2b36SAndroid Build Coastguard Worker}
177*333d2b36SAndroid Build Coastguard Worker
178*333d2b36SAndroid Build Coastguard Workerfunc (prebuilt *prebuiltLibraryDecorator) nativeCoverage() bool {
179*333d2b36SAndroid Build Coastguard Worker	return false
180*333d2b36SAndroid Build Coastguard Worker}
181*333d2b36SAndroid Build Coastguard Worker
182*333d2b36SAndroid Build Coastguard Workerfunc (prebuilt *prebuiltLibraryDecorator) prebuiltSrcs() []string {
183*333d2b36SAndroid Build Coastguard Worker	srcs := prebuilt.Properties.Srcs
184*333d2b36SAndroid Build Coastguard Worker	if prebuilt.rlib() {
185*333d2b36SAndroid Build Coastguard Worker		srcs = append(srcs, prebuilt.libraryDecorator.Properties.Rlib.Srcs...)
186*333d2b36SAndroid Build Coastguard Worker	}
187*333d2b36SAndroid Build Coastguard Worker	if prebuilt.dylib() {
188*333d2b36SAndroid Build Coastguard Worker		srcs = append(srcs, prebuilt.libraryDecorator.Properties.Dylib.Srcs...)
189*333d2b36SAndroid Build Coastguard Worker	}
190*333d2b36SAndroid Build Coastguard Worker
191*333d2b36SAndroid Build Coastguard Worker	return srcs
192*333d2b36SAndroid Build Coastguard Worker}
193*333d2b36SAndroid Build Coastguard Worker
194*333d2b36SAndroid Build Coastguard Workerfunc (prebuilt *prebuiltLibraryDecorator) prebuilt() *android.Prebuilt {
195*333d2b36SAndroid Build Coastguard Worker	return &prebuilt.Prebuilt
196*333d2b36SAndroid Build Coastguard Worker}
197*333d2b36SAndroid Build Coastguard Worker
198*333d2b36SAndroid Build Coastguard Workerfunc (prebuilt *prebuiltProcMacroDecorator) prebuiltSrcs() []string {
199*333d2b36SAndroid Build Coastguard Worker	srcs := prebuilt.Properties.Srcs
200*333d2b36SAndroid Build Coastguard Worker	return srcs
201*333d2b36SAndroid Build Coastguard Worker}
202*333d2b36SAndroid Build Coastguard Worker
203*333d2b36SAndroid Build Coastguard Workerfunc (prebuilt *prebuiltProcMacroDecorator) prebuilt() *android.Prebuilt {
204*333d2b36SAndroid Build Coastguard Worker	return &prebuilt.Prebuilt
205*333d2b36SAndroid Build Coastguard Worker}
206*333d2b36SAndroid Build Coastguard Worker
207*333d2b36SAndroid Build Coastguard Workerfunc (prebuilt *prebuiltProcMacroDecorator) compilerProps() []interface{} {
208*333d2b36SAndroid Build Coastguard Worker	return append(prebuilt.procMacroDecorator.compilerProps(),
209*333d2b36SAndroid Build Coastguard Worker		&prebuilt.Properties)
210*333d2b36SAndroid Build Coastguard Worker}
211*333d2b36SAndroid Build Coastguard Worker
212*333d2b36SAndroid Build Coastguard Workerfunc (prebuilt *prebuiltProcMacroDecorator) compile(ctx ModuleContext, flags Flags, deps PathDeps) buildOutput {
213*333d2b36SAndroid Build Coastguard Worker	prebuilt.flagExporter.exportLinkDirs(android.PathsForModuleSrc(ctx, prebuilt.Properties.Link_dirs).Strings()...)
214*333d2b36SAndroid Build Coastguard Worker	prebuilt.flagExporter.setProvider(ctx)
215*333d2b36SAndroid Build Coastguard Worker	srcPath := prebuiltPath(ctx, prebuilt)
216*333d2b36SAndroid Build Coastguard Worker	prebuilt.baseCompiler.unstrippedOutputFile = srcPath
217*333d2b36SAndroid Build Coastguard Worker	return buildOutput{outputFile: srcPath}
218*333d2b36SAndroid Build Coastguard Worker}
219*333d2b36SAndroid Build Coastguard Worker
220*333d2b36SAndroid Build Coastguard Workerfunc (prebuilt *prebuiltProcMacroDecorator) rustdoc(ctx ModuleContext, flags Flags,
221*333d2b36SAndroid Build Coastguard Worker	deps PathDeps) android.OptionalPath {
222*333d2b36SAndroid Build Coastguard Worker
223*333d2b36SAndroid Build Coastguard Worker	return android.OptionalPath{}
224*333d2b36SAndroid Build Coastguard Worker}
225*333d2b36SAndroid Build Coastguard Worker
226*333d2b36SAndroid Build Coastguard Workerfunc (prebuilt *prebuiltProcMacroDecorator) compilerDeps(ctx DepsContext, deps Deps) Deps {
227*333d2b36SAndroid Build Coastguard Worker	deps = prebuilt.baseCompiler.compilerDeps(ctx, deps)
228*333d2b36SAndroid Build Coastguard Worker	return deps
229*333d2b36SAndroid Build Coastguard Worker}
230*333d2b36SAndroid Build Coastguard Worker
231*333d2b36SAndroid Build Coastguard Workerfunc (prebuilt *prebuiltProcMacroDecorator) nativeCoverage() bool {
232*333d2b36SAndroid Build Coastguard Worker	return false
233*333d2b36SAndroid Build Coastguard Worker}
234