Shard rust protobuf sources

Shorten the command line for generating rust protobuf sources
by sharding the sources into groups of 50 source files.

Bug: 322564768
Bug: 336323108
Test: builds
Change-Id: Ia8069cdaf49f9a42d14a83139545ba61277418e0
This commit is contained in:
Colin Cross 2024-04-23 10:47:00 -07:00
parent a17792e2eb
commit f526863a40

View file

@ -16,6 +16,7 @@ package rust
import ( import (
"fmt" "fmt"
"strconv"
"strings" "strings"
"android/soong/android" "android/soong/android"
@ -122,41 +123,65 @@ func (proto *protobufDecorator) GenerateSource(ctx ModuleContext, deps PathDeps)
// stemFile must be first here as the first path in BaseSourceProvider.OutputFiles is the library entry-point. // stemFile must be first here as the first path in BaseSourceProvider.OutputFiles is the library entry-point.
var outputs android.WritablePaths var outputs android.WritablePaths
rule := android.NewRuleBuilder(pctx, ctx) for i, shard := range android.ShardPaths(protoFiles, 50) {
rule := android.NewRuleBuilder(pctx, ctx)
for _, protoFile := range protoFiles { for _, protoFile := range shard {
// Since we're iterating over the protoFiles already, make sure they're not redeclared in grpcFiles // Since we're iterating over the protoFiles already, make sure they're not redeclared in grpcFiles
if android.InList(protoFile.String(), grpcFiles.Strings()) { if android.InList(protoFile.String(), grpcFiles.Strings()) {
ctx.PropertyErrorf("protos", ctx.PropertyErrorf("protos",
"A proto can only be added once to either grpc_protos or protos. %q is declared in both properties", "A proto can only be added once to either grpc_protos or protos. %q is declared in both properties",
protoFile.String()) protoFile.String())
}
protoName := strings.TrimSuffix(protoFile.Base(), ".proto")
proto.protoNames = append(proto.protoNames, protoName)
protoOut := android.PathForModuleOut(ctx, protoName+".rs")
depFile := android.PathForModuleOut(ctx, protoName+".d")
ruleOutputs := android.WritablePaths{protoOut, depFile}
android.ProtoRule(rule, protoFile, protoFlags, protoFlags.Deps, outDir, depFile, ruleOutputs)
outputs = append(outputs, ruleOutputs...)
} }
protoName := strings.TrimSuffix(protoFile.Base(), ".proto") ruleName := "protoc"
proto.protoNames = append(proto.protoNames, protoName) ruleDesc := "protoc"
if i > 0 {
ruleName += "_" + strconv.Itoa(i+1)
ruleDesc += " " + strconv.Itoa(i+1)
}
protoOut := android.PathForModuleOut(ctx, protoName+".rs") rule.Build(ruleName, ruleDesc)
depFile := android.PathForModuleOut(ctx, protoName+".d")
ruleOutputs := android.WritablePaths{protoOut, depFile}
android.ProtoRule(rule, protoFile, protoFlags, protoFlags.Deps, outDir, depFile, ruleOutputs)
outputs = append(outputs, ruleOutputs...)
} }
for _, grpcFile := range grpcFiles { for i, shard := range android.ShardPaths(grpcFiles, 50) {
grpcName := strings.TrimSuffix(grpcFile.Base(), ".proto") rule := android.NewRuleBuilder(pctx, ctx)
proto.grpcNames = append(proto.grpcNames, grpcName)
// GRPC protos produce two files, a proto.rs and a proto_grpc.rs for _, grpcFile := range shard {
protoOut := android.WritablePath(android.PathForModuleOut(ctx, grpcName+".rs")) grpcName := strings.TrimSuffix(grpcFile.Base(), ".proto")
grpcOut := android.WritablePath(android.PathForModuleOut(ctx, grpcName+grpcSuffix+".rs")) proto.grpcNames = append(proto.grpcNames, grpcName)
depFile := android.PathForModuleOut(ctx, grpcName+".d")
ruleOutputs := android.WritablePaths{protoOut, grpcOut, depFile} // GRPC protos produce two files, a proto.rs and a proto_grpc.rs
protoOut := android.WritablePath(android.PathForModuleOut(ctx, grpcName+".rs"))
grpcOut := android.WritablePath(android.PathForModuleOut(ctx, grpcName+grpcSuffix+".rs"))
depFile := android.PathForModuleOut(ctx, grpcName+".d")
android.ProtoRule(rule, grpcFile, grpcProtoFlags, grpcProtoFlags.Deps, outDir, depFile, ruleOutputs) ruleOutputs := android.WritablePaths{protoOut, grpcOut, depFile}
outputs = append(outputs, ruleOutputs...)
android.ProtoRule(rule, grpcFile, grpcProtoFlags, grpcProtoFlags.Deps, outDir, depFile, ruleOutputs)
outputs = append(outputs, ruleOutputs...)
}
ruleName := "protoc_grpc"
ruleDesc := "protoc grpc"
if i > 0 {
ruleName += "_" + strconv.Itoa(i+1)
ruleDesc += " " + strconv.Itoa(i+1)
}
rule.Build(ruleName, ruleDesc)
} }
// Check that all proto base filenames are unique as outputs are written to the same directory. // Check that all proto base filenames are unique as outputs are written to the same directory.
@ -168,8 +193,6 @@ func (proto *protobufDecorator) GenerateSource(ctx ModuleContext, deps PathDeps)
android.WriteFileRule(ctx, stemFile, proto.genModFileContents()) android.WriteFileRule(ctx, stemFile, proto.genModFileContents())
rule.Build("protoc_"+ctx.ModuleName(), "protoc "+ctx.ModuleName())
// stemFile must be first here as the first path in BaseSourceProvider.OutputFiles is the library entry-point. // stemFile must be first here as the first path in BaseSourceProvider.OutputFiles is the library entry-point.
proto.BaseSourceProvider.OutputFiles = append(android.Paths{stemFile}, outputs.Paths()...) proto.BaseSourceProvider.OutputFiles = append(android.Paths{stemFile}, outputs.Paths()...)