xref: /aosp_15_r20/build/soong/java/proto.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2017 Google Inc. All rights reserved.
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 java
16*333d2b36SAndroid Build Coastguard Worker
17*333d2b36SAndroid Build Coastguard Workerimport (
18*333d2b36SAndroid Build Coastguard Worker	"path/filepath"
19*333d2b36SAndroid Build Coastguard Worker	"strconv"
20*333d2b36SAndroid Build Coastguard Worker
21*333d2b36SAndroid Build Coastguard Worker	"android/soong/android"
22*333d2b36SAndroid Build Coastguard Worker)
23*333d2b36SAndroid Build Coastguard Worker
24*333d2b36SAndroid Build Coastguard Workerconst (
25*333d2b36SAndroid Build Coastguard Worker	protoTypeDefault = "lite"
26*333d2b36SAndroid Build Coastguard Worker)
27*333d2b36SAndroid Build Coastguard Worker
28*333d2b36SAndroid Build Coastguard Workerfunc genProto(ctx android.ModuleContext, protoFiles android.Paths, flags android.ProtoFlags) android.Paths {
29*333d2b36SAndroid Build Coastguard Worker	// Shard proto files into groups of 100 to avoid having to recompile all of them if one changes and to avoid
30*333d2b36SAndroid Build Coastguard Worker	// hitting command line length limits.
31*333d2b36SAndroid Build Coastguard Worker	shards := android.ShardPaths(protoFiles, 50)
32*333d2b36SAndroid Build Coastguard Worker
33*333d2b36SAndroid Build Coastguard Worker	srcJarFiles := make(android.Paths, 0, len(shards))
34*333d2b36SAndroid Build Coastguard Worker
35*333d2b36SAndroid Build Coastguard Worker	for i, shard := range shards {
36*333d2b36SAndroid Build Coastguard Worker		srcJarFile := android.PathForModuleGen(ctx, "proto", "proto"+strconv.Itoa(i)+".srcjar")
37*333d2b36SAndroid Build Coastguard Worker		srcJarFiles = append(srcJarFiles, srcJarFile)
38*333d2b36SAndroid Build Coastguard Worker
39*333d2b36SAndroid Build Coastguard Worker		outDir := srcJarFile.ReplaceExtension(ctx, "tmp")
40*333d2b36SAndroid Build Coastguard Worker
41*333d2b36SAndroid Build Coastguard Worker		rule := android.NewRuleBuilder(pctx, ctx)
42*333d2b36SAndroid Build Coastguard Worker
43*333d2b36SAndroid Build Coastguard Worker		rule.Command().Text("rm -rf").Flag(outDir.String())
44*333d2b36SAndroid Build Coastguard Worker		rule.Command().Text("mkdir -p").Flag(outDir.String())
45*333d2b36SAndroid Build Coastguard Worker
46*333d2b36SAndroid Build Coastguard Worker		for _, protoFile := range shard {
47*333d2b36SAndroid Build Coastguard Worker			depFile := srcJarFile.InSameDir(ctx, protoFile.String()+".d")
48*333d2b36SAndroid Build Coastguard Worker			rule.Command().Text("mkdir -p").Flag(filepath.Dir(depFile.String()))
49*333d2b36SAndroid Build Coastguard Worker			android.ProtoRule(rule, protoFile, flags, flags.Deps, outDir, depFile, nil)
50*333d2b36SAndroid Build Coastguard Worker		}
51*333d2b36SAndroid Build Coastguard Worker
52*333d2b36SAndroid Build Coastguard Worker		// Proto generated java files have an unknown package name in the path, so package the entire output directory
53*333d2b36SAndroid Build Coastguard Worker		// into a srcjar.
54*333d2b36SAndroid Build Coastguard Worker		rule.Command().
55*333d2b36SAndroid Build Coastguard Worker			BuiltTool("soong_zip").
56*333d2b36SAndroid Build Coastguard Worker			Flag("-srcjar").
57*333d2b36SAndroid Build Coastguard Worker			Flag("-write_if_changed").
58*333d2b36SAndroid Build Coastguard Worker			FlagWithOutput("-o ", srcJarFile).
59*333d2b36SAndroid Build Coastguard Worker			FlagWithArg("-C ", outDir.String()).
60*333d2b36SAndroid Build Coastguard Worker			FlagWithArg("-D ", outDir.String())
61*333d2b36SAndroid Build Coastguard Worker
62*333d2b36SAndroid Build Coastguard Worker		rule.Command().Text("rm -rf").Flag(outDir.String())
63*333d2b36SAndroid Build Coastguard Worker
64*333d2b36SAndroid Build Coastguard Worker		rule.Restat()
65*333d2b36SAndroid Build Coastguard Worker
66*333d2b36SAndroid Build Coastguard Worker		ruleName := "protoc"
67*333d2b36SAndroid Build Coastguard Worker		ruleDesc := "protoc"
68*333d2b36SAndroid Build Coastguard Worker		if len(shards) > 1 {
69*333d2b36SAndroid Build Coastguard Worker			ruleName += "_" + strconv.Itoa(i)
70*333d2b36SAndroid Build Coastguard Worker			ruleDesc += " " + strconv.Itoa(i)
71*333d2b36SAndroid Build Coastguard Worker		}
72*333d2b36SAndroid Build Coastguard Worker
73*333d2b36SAndroid Build Coastguard Worker		rule.Build(ruleName, ruleDesc)
74*333d2b36SAndroid Build Coastguard Worker	}
75*333d2b36SAndroid Build Coastguard Worker
76*333d2b36SAndroid Build Coastguard Worker	return srcJarFiles
77*333d2b36SAndroid Build Coastguard Worker}
78*333d2b36SAndroid Build Coastguard Worker
79*333d2b36SAndroid Build Coastguard Workerfunc protoDeps(ctx android.BottomUpMutatorContext, p *android.ProtoProperties) {
80*333d2b36SAndroid Build Coastguard Worker	const unspecifiedProtobufPluginType = ""
81*333d2b36SAndroid Build Coastguard Worker	if String(p.Proto.Plugin) == "" {
82*333d2b36SAndroid Build Coastguard Worker		switch String(p.Proto.Type) {
83*333d2b36SAndroid Build Coastguard Worker		case "stream": // does not require additional dependencies
84*333d2b36SAndroid Build Coastguard Worker		case "micro":
85*333d2b36SAndroid Build Coastguard Worker			ctx.AddVariationDependencies(nil, staticLibTag, "libprotobuf-java-micro")
86*333d2b36SAndroid Build Coastguard Worker		case "nano":
87*333d2b36SAndroid Build Coastguard Worker			ctx.AddVariationDependencies(nil, staticLibTag, "libprotobuf-java-nano")
88*333d2b36SAndroid Build Coastguard Worker		case "lite", unspecifiedProtobufPluginType:
89*333d2b36SAndroid Build Coastguard Worker			ctx.AddVariationDependencies(nil, staticLibTag, "libprotobuf-java-lite")
90*333d2b36SAndroid Build Coastguard Worker		case "full":
91*333d2b36SAndroid Build Coastguard Worker			if ctx.Host() {
92*333d2b36SAndroid Build Coastguard Worker				ctx.AddVariationDependencies(nil, staticLibTag, "libprotobuf-java-full")
93*333d2b36SAndroid Build Coastguard Worker			} else {
94*333d2b36SAndroid Build Coastguard Worker				ctx.PropertyErrorf("proto.type", "full java protos only supported on the host")
95*333d2b36SAndroid Build Coastguard Worker			}
96*333d2b36SAndroid Build Coastguard Worker		default:
97*333d2b36SAndroid Build Coastguard Worker			ctx.PropertyErrorf("proto.type", "unknown proto type %q",
98*333d2b36SAndroid Build Coastguard Worker				String(p.Proto.Type))
99*333d2b36SAndroid Build Coastguard Worker		}
100*333d2b36SAndroid Build Coastguard Worker	}
101*333d2b36SAndroid Build Coastguard Worker}
102*333d2b36SAndroid Build Coastguard Worker
103*333d2b36SAndroid Build Coastguard Workerfunc protoFlags(ctx android.ModuleContext, j *CommonProperties, p *android.ProtoProperties,
104*333d2b36SAndroid Build Coastguard Worker	flags javaBuilderFlags) javaBuilderFlags {
105*333d2b36SAndroid Build Coastguard Worker
106*333d2b36SAndroid Build Coastguard Worker	flags.proto = android.GetProtoFlags(ctx, p)
107*333d2b36SAndroid Build Coastguard Worker
108*333d2b36SAndroid Build Coastguard Worker	if String(p.Proto.Plugin) == "" {
109*333d2b36SAndroid Build Coastguard Worker		var typeToPlugin string
110*333d2b36SAndroid Build Coastguard Worker		switch String(p.Proto.Type) {
111*333d2b36SAndroid Build Coastguard Worker		case "stream":
112*333d2b36SAndroid Build Coastguard Worker			flags.proto.OutTypeFlag = "--javastream_out"
113*333d2b36SAndroid Build Coastguard Worker			typeToPlugin = "javastream"
114*333d2b36SAndroid Build Coastguard Worker		case "micro":
115*333d2b36SAndroid Build Coastguard Worker			flags.proto.OutTypeFlag = "--javamicro_out"
116*333d2b36SAndroid Build Coastguard Worker			typeToPlugin = "javamicro"
117*333d2b36SAndroid Build Coastguard Worker		case "nano":
118*333d2b36SAndroid Build Coastguard Worker			flags.proto.OutTypeFlag = "--javanano_out"
119*333d2b36SAndroid Build Coastguard Worker			typeToPlugin = "javanano"
120*333d2b36SAndroid Build Coastguard Worker		case "lite", "":
121*333d2b36SAndroid Build Coastguard Worker			flags.proto.OutTypeFlag = "--java_out"
122*333d2b36SAndroid Build Coastguard Worker			flags.proto.OutParams = append(flags.proto.OutParams, "lite")
123*333d2b36SAndroid Build Coastguard Worker		case "full":
124*333d2b36SAndroid Build Coastguard Worker			flags.proto.OutTypeFlag = "--java_out"
125*333d2b36SAndroid Build Coastguard Worker		default:
126*333d2b36SAndroid Build Coastguard Worker			ctx.PropertyErrorf("proto.type", "unknown proto type %q",
127*333d2b36SAndroid Build Coastguard Worker				String(p.Proto.Type))
128*333d2b36SAndroid Build Coastguard Worker		}
129*333d2b36SAndroid Build Coastguard Worker
130*333d2b36SAndroid Build Coastguard Worker		if typeToPlugin != "" {
131*333d2b36SAndroid Build Coastguard Worker			hostTool := ctx.Config().HostToolPath(ctx, "protoc-gen-"+typeToPlugin)
132*333d2b36SAndroid Build Coastguard Worker			flags.proto.Deps = append(flags.proto.Deps, hostTool)
133*333d2b36SAndroid Build Coastguard Worker			flags.proto.Flags = append(flags.proto.Flags, "--plugin=protoc-gen-"+typeToPlugin+"="+hostTool.String())
134*333d2b36SAndroid Build Coastguard Worker		}
135*333d2b36SAndroid Build Coastguard Worker	}
136*333d2b36SAndroid Build Coastguard Worker
137*333d2b36SAndroid Build Coastguard Worker	flags.proto.OutParams = append(flags.proto.OutParams, j.Proto.Output_params...)
138*333d2b36SAndroid Build Coastguard Worker
139*333d2b36SAndroid Build Coastguard Worker	return flags
140*333d2b36SAndroid Build Coastguard Worker}
141