xref: /aosp_15_r20/build/soong/rust/protobuf.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2020 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/android"
23*333d2b36SAndroid Build Coastguard Worker	"android/soong/cc"
24*333d2b36SAndroid Build Coastguard Worker)
25*333d2b36SAndroid Build Coastguard Worker
26*333d2b36SAndroid Build Coastguard Workervar (
27*333d2b36SAndroid Build Coastguard Worker	defaultProtobufFlags = []string{""}
28*333d2b36SAndroid Build Coastguard Worker)
29*333d2b36SAndroid Build Coastguard Worker
30*333d2b36SAndroid Build Coastguard Workerconst (
31*333d2b36SAndroid Build Coastguard Worker	grpcSuffix = "_grpc"
32*333d2b36SAndroid Build Coastguard Worker)
33*333d2b36SAndroid Build Coastguard Worker
34*333d2b36SAndroid Build Coastguard Workertype PluginType int
35*333d2b36SAndroid Build Coastguard Worker
36*333d2b36SAndroid Build Coastguard Workerfunc init() {
37*333d2b36SAndroid Build Coastguard Worker	android.RegisterModuleType("rust_protobuf", RustProtobufFactory)
38*333d2b36SAndroid Build Coastguard Worker	android.RegisterModuleType("rust_protobuf_host", RustProtobufHostFactory)
39*333d2b36SAndroid Build Coastguard Worker}
40*333d2b36SAndroid Build Coastguard Worker
41*333d2b36SAndroid Build Coastguard Workervar _ SourceProvider = (*protobufDecorator)(nil)
42*333d2b36SAndroid Build Coastguard Worker
43*333d2b36SAndroid Build Coastguard Workertype ProtobufProperties struct {
44*333d2b36SAndroid Build Coastguard Worker	// List of relative paths to proto files that will be used to generate the source.
45*333d2b36SAndroid Build Coastguard Worker	// Either this or grpc_protos must be defined.
46*333d2b36SAndroid Build Coastguard Worker	Protos []string `android:"path,arch_variant"`
47*333d2b36SAndroid Build Coastguard Worker
48*333d2b36SAndroid Build Coastguard Worker	// List of relative paths to GRPC-containing proto files that will be used to generate the source.
49*333d2b36SAndroid Build Coastguard Worker	// Either this or protos must be defined.
50*333d2b36SAndroid Build Coastguard Worker	Grpc_protos []string `android:"path,arch_variant"`
51*333d2b36SAndroid Build Coastguard Worker
52*333d2b36SAndroid Build Coastguard Worker	// List of additional flags to pass to aprotoc
53*333d2b36SAndroid Build Coastguard Worker	Proto_flags []string `android:"arch_variant"`
54*333d2b36SAndroid Build Coastguard Worker
55*333d2b36SAndroid Build Coastguard Worker	// List of libraries which export include paths required for this module
56*333d2b36SAndroid Build Coastguard Worker	Header_libs []string `android:"arch_variant,variant_prepend"`
57*333d2b36SAndroid Build Coastguard Worker
58*333d2b36SAndroid Build Coastguard Worker	// List of exported include paths containing proto files for dependent rust_protobuf modules.
59*333d2b36SAndroid Build Coastguard Worker	Exported_include_dirs []string
60*333d2b36SAndroid Build Coastguard Worker}
61*333d2b36SAndroid Build Coastguard Worker
62*333d2b36SAndroid Build Coastguard Workertype protobufDecorator struct {
63*333d2b36SAndroid Build Coastguard Worker	*BaseSourceProvider
64*333d2b36SAndroid Build Coastguard Worker
65*333d2b36SAndroid Build Coastguard Worker	Properties       ProtobufProperties
66*333d2b36SAndroid Build Coastguard Worker	protoNames       []string
67*333d2b36SAndroid Build Coastguard Worker	additionalCrates []string
68*333d2b36SAndroid Build Coastguard Worker	grpcNames        []string
69*333d2b36SAndroid Build Coastguard Worker
70*333d2b36SAndroid Build Coastguard Worker	grpcProtoFlags android.ProtoFlags
71*333d2b36SAndroid Build Coastguard Worker	protoFlags     android.ProtoFlags
72*333d2b36SAndroid Build Coastguard Worker}
73*333d2b36SAndroid Build Coastguard Worker
74*333d2b36SAndroid Build Coastguard Workerfunc (proto *protobufDecorator) GenerateSource(ctx ModuleContext, deps PathDeps) android.Path {
75*333d2b36SAndroid Build Coastguard Worker	var protoFlags android.ProtoFlags
76*333d2b36SAndroid Build Coastguard Worker	var grpcProtoFlags android.ProtoFlags
77*333d2b36SAndroid Build Coastguard Worker	var commonProtoFlags []string
78*333d2b36SAndroid Build Coastguard Worker
79*333d2b36SAndroid Build Coastguard Worker	outDir := android.PathForModuleOut(ctx)
80*333d2b36SAndroid Build Coastguard Worker	protoFiles := android.PathsForModuleSrc(ctx, proto.Properties.Protos)
81*333d2b36SAndroid Build Coastguard Worker	grpcFiles := android.PathsForModuleSrc(ctx, proto.Properties.Grpc_protos)
82*333d2b36SAndroid Build Coastguard Worker
83*333d2b36SAndroid Build Coastguard Worker	protoPluginPath := ctx.Config().HostToolPath(ctx, "protoc-gen-rust")
84*333d2b36SAndroid Build Coastguard Worker
85*333d2b36SAndroid Build Coastguard Worker	commonProtoFlags = append(commonProtoFlags, defaultProtobufFlags...)
86*333d2b36SAndroid Build Coastguard Worker	commonProtoFlags = append(commonProtoFlags, proto.Properties.Proto_flags...)
87*333d2b36SAndroid Build Coastguard Worker	commonProtoFlags = append(commonProtoFlags, "--plugin=protoc-gen-rust="+protoPluginPath.String())
88*333d2b36SAndroid Build Coastguard Worker
89*333d2b36SAndroid Build Coastguard Worker	if len(protoFiles) > 0 {
90*333d2b36SAndroid Build Coastguard Worker		protoFlags.OutTypeFlag = "--rust_out"
91*333d2b36SAndroid Build Coastguard Worker		protoFlags.Flags = append(protoFlags.Flags, commonProtoFlags...)
92*333d2b36SAndroid Build Coastguard Worker
93*333d2b36SAndroid Build Coastguard Worker		protoFlags.Deps = append(protoFlags.Deps, protoPluginPath)
94*333d2b36SAndroid Build Coastguard Worker	}
95*333d2b36SAndroid Build Coastguard Worker
96*333d2b36SAndroid Build Coastguard Worker	if len(grpcFiles) > 0 {
97*333d2b36SAndroid Build Coastguard Worker		grpcPath := ctx.Config().HostToolPath(ctx, "grpc_rust_plugin")
98*333d2b36SAndroid Build Coastguard Worker
99*333d2b36SAndroid Build Coastguard Worker		grpcProtoFlags.OutTypeFlag = "--rust_out"
100*333d2b36SAndroid Build Coastguard Worker		grpcProtoFlags.Flags = append(grpcProtoFlags.Flags, "--grpc_out="+outDir.String())
101*333d2b36SAndroid Build Coastguard Worker		grpcProtoFlags.Flags = append(grpcProtoFlags.Flags, "--plugin=protoc-gen-grpc="+grpcPath.String())
102*333d2b36SAndroid Build Coastguard Worker		grpcProtoFlags.Flags = append(grpcProtoFlags.Flags, commonProtoFlags...)
103*333d2b36SAndroid Build Coastguard Worker
104*333d2b36SAndroid Build Coastguard Worker		grpcProtoFlags.Deps = append(grpcProtoFlags.Deps, grpcPath, protoPluginPath)
105*333d2b36SAndroid Build Coastguard Worker	}
106*333d2b36SAndroid Build Coastguard Worker
107*333d2b36SAndroid Build Coastguard Worker	if len(protoFiles) == 0 && len(grpcFiles) == 0 {
108*333d2b36SAndroid Build Coastguard Worker		ctx.PropertyErrorf("protos",
109*333d2b36SAndroid Build Coastguard Worker			"at least one protobuf must be defined in either protos or grpc_protos.")
110*333d2b36SAndroid Build Coastguard Worker	}
111*333d2b36SAndroid Build Coastguard Worker
112*333d2b36SAndroid Build Coastguard Worker	// Add exported dependency include paths
113*333d2b36SAndroid Build Coastguard Worker	for _, include := range deps.depIncludePaths {
114*333d2b36SAndroid Build Coastguard Worker		protoFlags.Flags = append(protoFlags.Flags, "-I"+include.String())
115*333d2b36SAndroid Build Coastguard Worker		grpcProtoFlags.Flags = append(grpcProtoFlags.Flags, "-I"+include.String())
116*333d2b36SAndroid Build Coastguard Worker	}
117*333d2b36SAndroid Build Coastguard Worker
118*333d2b36SAndroid Build Coastguard Worker	stem := proto.BaseSourceProvider.getStem(ctx)
119*333d2b36SAndroid Build Coastguard Worker
120*333d2b36SAndroid Build Coastguard Worker	// The mod_stem.rs file is used to avoid collisions if this is not included as a crate.
121*333d2b36SAndroid Build Coastguard Worker	stemFile := android.PathForModuleOut(ctx, "mod_"+stem+".rs")
122*333d2b36SAndroid Build Coastguard Worker
123*333d2b36SAndroid Build Coastguard Worker	// stemFile must be first here as the first path in BaseSourceProvider.OutputFiles is the library entry-point.
124*333d2b36SAndroid Build Coastguard Worker	var outputs android.WritablePaths
125*333d2b36SAndroid Build Coastguard Worker
126*333d2b36SAndroid Build Coastguard Worker	for i, shard := range android.ShardPaths(protoFiles, 50) {
127*333d2b36SAndroid Build Coastguard Worker		rule := android.NewRuleBuilder(pctx, ctx)
128*333d2b36SAndroid Build Coastguard Worker
129*333d2b36SAndroid Build Coastguard Worker		for _, protoFile := range shard {
130*333d2b36SAndroid Build Coastguard Worker			// Since we're iterating over the protoFiles already, make sure they're not redeclared in grpcFiles
131*333d2b36SAndroid Build Coastguard Worker			if android.InList(protoFile.String(), grpcFiles.Strings()) {
132*333d2b36SAndroid Build Coastguard Worker				ctx.PropertyErrorf("protos",
133*333d2b36SAndroid Build Coastguard Worker					"A proto can only be added once to either grpc_protos or protos. %q is declared in both properties",
134*333d2b36SAndroid Build Coastguard Worker					protoFile.String())
135*333d2b36SAndroid Build Coastguard Worker			}
136*333d2b36SAndroid Build Coastguard Worker
137*333d2b36SAndroid Build Coastguard Worker			protoName := strings.TrimSuffix(protoFile.Base(), ".proto")
138*333d2b36SAndroid Build Coastguard Worker			proto.protoNames = append(proto.protoNames, protoName)
139*333d2b36SAndroid Build Coastguard Worker
140*333d2b36SAndroid Build Coastguard Worker			protoOut := android.PathForModuleOut(ctx, protoName+".rs")
141*333d2b36SAndroid Build Coastguard Worker			depFile := android.PathForModuleOut(ctx, protoName+".d")
142*333d2b36SAndroid Build Coastguard Worker
143*333d2b36SAndroid Build Coastguard Worker			ruleOutputs := android.WritablePaths{protoOut, depFile}
144*333d2b36SAndroid Build Coastguard Worker
145*333d2b36SAndroid Build Coastguard Worker			android.ProtoRule(rule, protoFile, protoFlags, protoFlags.Deps, outDir, depFile, ruleOutputs)
146*333d2b36SAndroid Build Coastguard Worker			outputs = append(outputs, ruleOutputs...)
147*333d2b36SAndroid Build Coastguard Worker		}
148*333d2b36SAndroid Build Coastguard Worker
149*333d2b36SAndroid Build Coastguard Worker		ruleName := "protoc"
150*333d2b36SAndroid Build Coastguard Worker		ruleDesc := "protoc"
151*333d2b36SAndroid Build Coastguard Worker		if i > 0 {
152*333d2b36SAndroid Build Coastguard Worker			ruleName += "_" + strconv.Itoa(i+1)
153*333d2b36SAndroid Build Coastguard Worker			ruleDesc += " " + strconv.Itoa(i+1)
154*333d2b36SAndroid Build Coastguard Worker		}
155*333d2b36SAndroid Build Coastguard Worker
156*333d2b36SAndroid Build Coastguard Worker		rule.Build(ruleName, ruleDesc)
157*333d2b36SAndroid Build Coastguard Worker	}
158*333d2b36SAndroid Build Coastguard Worker
159*333d2b36SAndroid Build Coastguard Worker	for i, shard := range android.ShardPaths(grpcFiles, 50) {
160*333d2b36SAndroid Build Coastguard Worker		rule := android.NewRuleBuilder(pctx, ctx)
161*333d2b36SAndroid Build Coastguard Worker
162*333d2b36SAndroid Build Coastguard Worker		for _, grpcFile := range shard {
163*333d2b36SAndroid Build Coastguard Worker			grpcName := strings.TrimSuffix(grpcFile.Base(), ".proto")
164*333d2b36SAndroid Build Coastguard Worker			proto.grpcNames = append(proto.grpcNames, grpcName)
165*333d2b36SAndroid Build Coastguard Worker
166*333d2b36SAndroid Build Coastguard Worker			// GRPC protos produce two files, a proto.rs and a proto_grpc.rs
167*333d2b36SAndroid Build Coastguard Worker			protoOut := android.WritablePath(android.PathForModuleOut(ctx, grpcName+".rs"))
168*333d2b36SAndroid Build Coastguard Worker			grpcOut := android.WritablePath(android.PathForModuleOut(ctx, grpcName+grpcSuffix+".rs"))
169*333d2b36SAndroid Build Coastguard Worker			depFile := android.PathForModuleOut(ctx, grpcName+".d")
170*333d2b36SAndroid Build Coastguard Worker
171*333d2b36SAndroid Build Coastguard Worker			ruleOutputs := android.WritablePaths{protoOut, grpcOut, depFile}
172*333d2b36SAndroid Build Coastguard Worker
173*333d2b36SAndroid Build Coastguard Worker			android.ProtoRule(rule, grpcFile, grpcProtoFlags, grpcProtoFlags.Deps, outDir, depFile, ruleOutputs)
174*333d2b36SAndroid Build Coastguard Worker			outputs = append(outputs, ruleOutputs...)
175*333d2b36SAndroid Build Coastguard Worker		}
176*333d2b36SAndroid Build Coastguard Worker
177*333d2b36SAndroid Build Coastguard Worker		ruleName := "protoc_grpc"
178*333d2b36SAndroid Build Coastguard Worker		ruleDesc := "protoc grpc"
179*333d2b36SAndroid Build Coastguard Worker		if i > 0 {
180*333d2b36SAndroid Build Coastguard Worker			ruleName += "_" + strconv.Itoa(i+1)
181*333d2b36SAndroid Build Coastguard Worker			ruleDesc += " " + strconv.Itoa(i+1)
182*333d2b36SAndroid Build Coastguard Worker		}
183*333d2b36SAndroid Build Coastguard Worker
184*333d2b36SAndroid Build Coastguard Worker		rule.Build(ruleName, ruleDesc)
185*333d2b36SAndroid Build Coastguard Worker	}
186*333d2b36SAndroid Build Coastguard Worker
187*333d2b36SAndroid Build Coastguard Worker	// Check that all proto base filenames are unique as outputs are written to the same directory.
188*333d2b36SAndroid Build Coastguard Worker	baseFilenames := append(proto.protoNames, proto.grpcNames...)
189*333d2b36SAndroid Build Coastguard Worker	if len(baseFilenames) != len(android.FirstUniqueStrings(baseFilenames)) {
190*333d2b36SAndroid Build Coastguard Worker		ctx.PropertyErrorf("protos", "proto filenames must be unique across  'protos' and 'grpc_protos' "+
191*333d2b36SAndroid Build Coastguard Worker			"to be used in the same rust_protobuf module. For example, foo.proto and src/foo.proto will conflict.")
192*333d2b36SAndroid Build Coastguard Worker	}
193*333d2b36SAndroid Build Coastguard Worker
194*333d2b36SAndroid Build Coastguard Worker	android.WriteFileRule(ctx, stemFile, proto.genModFileContents())
195*333d2b36SAndroid Build Coastguard Worker
196*333d2b36SAndroid Build Coastguard Worker	// stemFile must be first here as the first path in BaseSourceProvider.OutputFiles is the library entry-point.
197*333d2b36SAndroid Build Coastguard Worker	proto.BaseSourceProvider.OutputFiles = append(android.Paths{stemFile}, outputs.Paths()...)
198*333d2b36SAndroid Build Coastguard Worker
199*333d2b36SAndroid Build Coastguard Worker	android.SetProvider(ctx, cc.FlagExporterInfoProvider, cc.FlagExporterInfo{
200*333d2b36SAndroid Build Coastguard Worker		IncludeDirs: android.PathsForModuleSrc(ctx, proto.Properties.Exported_include_dirs),
201*333d2b36SAndroid Build Coastguard Worker	})
202*333d2b36SAndroid Build Coastguard Worker
203*333d2b36SAndroid Build Coastguard Worker	// mod_stem.rs is the entry-point for our library modules, so this is what we return.
204*333d2b36SAndroid Build Coastguard Worker	return stemFile
205*333d2b36SAndroid Build Coastguard Worker}
206*333d2b36SAndroid Build Coastguard Worker
207*333d2b36SAndroid Build Coastguard Workerfunc (proto *protobufDecorator) genModFileContents() string {
208*333d2b36SAndroid Build Coastguard Worker	lines := []string{
209*333d2b36SAndroid Build Coastguard Worker		"// @Soong generated Source",
210*333d2b36SAndroid Build Coastguard Worker	}
211*333d2b36SAndroid Build Coastguard Worker
212*333d2b36SAndroid Build Coastguard Worker	for _, protoName := range proto.protoNames {
213*333d2b36SAndroid Build Coastguard Worker		lines = append(lines, fmt.Sprintf("pub mod %s;", protoName))
214*333d2b36SAndroid Build Coastguard Worker	}
215*333d2b36SAndroid Build Coastguard Worker
216*333d2b36SAndroid Build Coastguard Worker	for _, crate := range proto.additionalCrates {
217*333d2b36SAndroid Build Coastguard Worker		lines = append(lines, fmt.Sprintf("pub use %s::*;", crate))
218*333d2b36SAndroid Build Coastguard Worker
219*333d2b36SAndroid Build Coastguard Worker	}
220*333d2b36SAndroid Build Coastguard Worker
221*333d2b36SAndroid Build Coastguard Worker	for _, grpcName := range proto.grpcNames {
222*333d2b36SAndroid Build Coastguard Worker		lines = append(lines, fmt.Sprintf("pub mod %s;", grpcName))
223*333d2b36SAndroid Build Coastguard Worker		lines = append(lines, fmt.Sprintf("pub mod %s%s;", grpcName, grpcSuffix))
224*333d2b36SAndroid Build Coastguard Worker	}
225*333d2b36SAndroid Build Coastguard Worker	if len(proto.grpcNames) > 0 {
226*333d2b36SAndroid Build Coastguard Worker		lines = append(
227*333d2b36SAndroid Build Coastguard Worker			lines,
228*333d2b36SAndroid Build Coastguard Worker			"pub mod empty {",
229*333d2b36SAndroid Build Coastguard Worker			"    pub use protobuf::well_known_types::empty::Empty;",
230*333d2b36SAndroid Build Coastguard Worker			"}")
231*333d2b36SAndroid Build Coastguard Worker	}
232*333d2b36SAndroid Build Coastguard Worker
233*333d2b36SAndroid Build Coastguard Worker	return strings.Join(lines, "\n")
234*333d2b36SAndroid Build Coastguard Worker}
235*333d2b36SAndroid Build Coastguard Worker
236*333d2b36SAndroid Build Coastguard Workerfunc (proto *protobufDecorator) SourceProviderProps() []interface{} {
237*333d2b36SAndroid Build Coastguard Worker	return append(proto.BaseSourceProvider.SourceProviderProps(), &proto.Properties)
238*333d2b36SAndroid Build Coastguard Worker}
239*333d2b36SAndroid Build Coastguard Worker
240*333d2b36SAndroid Build Coastguard Workerfunc (proto *protobufDecorator) SourceProviderDeps(ctx DepsContext, deps Deps) Deps {
241*333d2b36SAndroid Build Coastguard Worker	deps = proto.BaseSourceProvider.SourceProviderDeps(ctx, deps)
242*333d2b36SAndroid Build Coastguard Worker	deps.Rustlibs = append(deps.Rustlibs, "libprotobuf")
243*333d2b36SAndroid Build Coastguard Worker	deps.HeaderLibs = append(deps.SharedLibs, proto.Properties.Header_libs...)
244*333d2b36SAndroid Build Coastguard Worker
245*333d2b36SAndroid Build Coastguard Worker	if len(proto.Properties.Grpc_protos) > 0 {
246*333d2b36SAndroid Build Coastguard Worker		deps.Rustlibs = append(deps.Rustlibs, "libgrpcio", "libfutures")
247*333d2b36SAndroid Build Coastguard Worker		deps.HeaderLibs = append(deps.HeaderLibs, "libprotobuf-cpp-full")
248*333d2b36SAndroid Build Coastguard Worker	}
249*333d2b36SAndroid Build Coastguard Worker
250*333d2b36SAndroid Build Coastguard Worker	return deps
251*333d2b36SAndroid Build Coastguard Worker}
252*333d2b36SAndroid Build Coastguard Worker
253*333d2b36SAndroid Build Coastguard Worker// rust_protobuf generates protobuf rust code from the provided proto file. This uses the protoc-gen-rust plugin for
254*333d2b36SAndroid Build Coastguard Worker// protoc. Additional flags to the protoc command can be passed via the proto_flags property. This module type will
255*333d2b36SAndroid Build Coastguard Worker// create library variants that can be used as a crate dependency by adding it to the rlibs and rustlibs
256*333d2b36SAndroid Build Coastguard Worker// properties of other modules.
257*333d2b36SAndroid Build Coastguard Workerfunc RustProtobufFactory() android.Module {
258*333d2b36SAndroid Build Coastguard Worker	module, _ := NewRustProtobuf(android.HostAndDeviceSupported)
259*333d2b36SAndroid Build Coastguard Worker	return module.Init()
260*333d2b36SAndroid Build Coastguard Worker}
261*333d2b36SAndroid Build Coastguard Worker
262*333d2b36SAndroid Build Coastguard Worker// A host-only variant of rust_protobuf. Refer to rust_protobuf for more details.
263*333d2b36SAndroid Build Coastguard Workerfunc RustProtobufHostFactory() android.Module {
264*333d2b36SAndroid Build Coastguard Worker	module, _ := NewRustProtobuf(android.HostSupported)
265*333d2b36SAndroid Build Coastguard Worker	return module.Init()
266*333d2b36SAndroid Build Coastguard Worker}
267*333d2b36SAndroid Build Coastguard Worker
268*333d2b36SAndroid Build Coastguard Workerfunc NewRustProtobuf(hod android.HostOrDeviceSupported) (*Module, *protobufDecorator) {
269*333d2b36SAndroid Build Coastguard Worker	protobuf := &protobufDecorator{
270*333d2b36SAndroid Build Coastguard Worker		BaseSourceProvider: NewSourceProvider(),
271*333d2b36SAndroid Build Coastguard Worker		Properties:         ProtobufProperties{},
272*333d2b36SAndroid Build Coastguard Worker	}
273*333d2b36SAndroid Build Coastguard Worker
274*333d2b36SAndroid Build Coastguard Worker	module := NewSourceProviderModule(hod, protobuf, false, false)
275*333d2b36SAndroid Build Coastguard Worker
276*333d2b36SAndroid Build Coastguard Worker	return module, protobuf
277*333d2b36SAndroid Build Coastguard Worker}
278