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