xref: /aosp_15_r20/build/soong/java/gen.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2015 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	"strings"
21*333d2b36SAndroid Build Coastguard Worker
22*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint"
23*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint/pathtools"
24*333d2b36SAndroid Build Coastguard Worker
25*333d2b36SAndroid Build Coastguard Worker	"android/soong/android"
26*333d2b36SAndroid Build Coastguard Worker)
27*333d2b36SAndroid Build Coastguard Worker
28*333d2b36SAndroid Build Coastguard Workerfunc init() {
29*333d2b36SAndroid Build Coastguard Worker	pctx.SourcePathVariable("logtagsCmd", "build/make/tools/java-event-log-tags.py")
30*333d2b36SAndroid Build Coastguard Worker	pctx.SourcePathVariable("logtagsLib", "build/make/tools/event_log_tags.py")
31*333d2b36SAndroid Build Coastguard Worker}
32*333d2b36SAndroid Build Coastguard Worker
33*333d2b36SAndroid Build Coastguard Workervar (
34*333d2b36SAndroid Build Coastguard Worker	logtags = pctx.AndroidStaticRule("logtags",
35*333d2b36SAndroid Build Coastguard Worker		blueprint.RuleParams{
36*333d2b36SAndroid Build Coastguard Worker			Command:     "$logtagsCmd -o $out $in",
37*333d2b36SAndroid Build Coastguard Worker			CommandDeps: []string{"$logtagsCmd", "$logtagsLib"},
38*333d2b36SAndroid Build Coastguard Worker		})
39*333d2b36SAndroid Build Coastguard Worker)
40*333d2b36SAndroid Build Coastguard Worker
41*333d2b36SAndroid Build Coastguard Workerfunc genAidl(ctx android.ModuleContext, aidlFiles android.Paths, aidlGlobalFlags string, aidlIndividualFlags map[string]string, deps android.Paths) android.Paths {
42*333d2b36SAndroid Build Coastguard Worker	// Shard aidl files into groups of 50 to avoid having to recompile all of them if one changes and to avoid
43*333d2b36SAndroid Build Coastguard Worker	// hitting command line length limits.
44*333d2b36SAndroid Build Coastguard Worker	shards := android.ShardPaths(aidlFiles, 50)
45*333d2b36SAndroid Build Coastguard Worker
46*333d2b36SAndroid Build Coastguard Worker	srcJarFiles := make(android.Paths, 0, len(shards))
47*333d2b36SAndroid Build Coastguard Worker
48*333d2b36SAndroid Build Coastguard Worker	for i, shard := range shards {
49*333d2b36SAndroid Build Coastguard Worker		srcJarFile := android.PathForModuleGen(ctx, "aidl", "aidl"+strconv.Itoa(i)+".srcjar")
50*333d2b36SAndroid Build Coastguard Worker		srcJarFiles = append(srcJarFiles, srcJarFile)
51*333d2b36SAndroid Build Coastguard Worker
52*333d2b36SAndroid Build Coastguard Worker		outDir := srcJarFile.ReplaceExtension(ctx, "tmp")
53*333d2b36SAndroid Build Coastguard Worker
54*333d2b36SAndroid Build Coastguard Worker		rule := android.NewRuleBuilder(pctx, ctx)
55*333d2b36SAndroid Build Coastguard Worker
56*333d2b36SAndroid Build Coastguard Worker		rule.Command().Text("rm -rf").Flag(outDir.String())
57*333d2b36SAndroid Build Coastguard Worker		rule.Command().Text("mkdir -p").Flag(outDir.String())
58*333d2b36SAndroid Build Coastguard Worker		rule.Command().Text("FLAGS=' " + aidlGlobalFlags + "'")
59*333d2b36SAndroid Build Coastguard Worker
60*333d2b36SAndroid Build Coastguard Worker		for _, aidlFile := range shard {
61*333d2b36SAndroid Build Coastguard Worker			localFlag := aidlIndividualFlags[aidlFile.String()]
62*333d2b36SAndroid Build Coastguard Worker			depFile := srcJarFile.InSameDir(ctx, aidlFile.String()+".d")
63*333d2b36SAndroid Build Coastguard Worker			javaFile := outDir.Join(ctx, pathtools.ReplaceExtension(aidlFile.String(), "java"))
64*333d2b36SAndroid Build Coastguard Worker			rule.Command().
65*333d2b36SAndroid Build Coastguard Worker				Tool(ctx.Config().HostToolPath(ctx, "aidl")).
66*333d2b36SAndroid Build Coastguard Worker				FlagWithDepFile("-d", depFile).
67*333d2b36SAndroid Build Coastguard Worker				Flag("$FLAGS").
68*333d2b36SAndroid Build Coastguard Worker				Flag(localFlag).
69*333d2b36SAndroid Build Coastguard Worker				Input(aidlFile).
70*333d2b36SAndroid Build Coastguard Worker				Output(javaFile).
71*333d2b36SAndroid Build Coastguard Worker				Implicits(deps)
72*333d2b36SAndroid Build Coastguard Worker			rule.Temporary(javaFile)
73*333d2b36SAndroid Build Coastguard Worker		}
74*333d2b36SAndroid Build Coastguard Worker
75*333d2b36SAndroid Build Coastguard Worker		rule.Command().
76*333d2b36SAndroid Build Coastguard Worker			Tool(ctx.Config().HostToolPath(ctx, "soong_zip")).
77*333d2b36SAndroid Build Coastguard Worker			Flag("-srcjar").
78*333d2b36SAndroid Build Coastguard Worker			Flag("-write_if_changed").
79*333d2b36SAndroid Build Coastguard Worker			FlagWithOutput("-o ", srcJarFile).
80*333d2b36SAndroid Build Coastguard Worker			FlagWithArg("-C ", outDir.String()).
81*333d2b36SAndroid Build Coastguard Worker			FlagWithArg("-D ", outDir.String())
82*333d2b36SAndroid Build Coastguard Worker
83*333d2b36SAndroid Build Coastguard Worker		rule.Command().Text("rm -rf").Flag(outDir.String())
84*333d2b36SAndroid Build Coastguard Worker
85*333d2b36SAndroid Build Coastguard Worker		rule.Restat()
86*333d2b36SAndroid Build Coastguard Worker
87*333d2b36SAndroid Build Coastguard Worker		ruleName := "aidl"
88*333d2b36SAndroid Build Coastguard Worker		ruleDesc := "aidl"
89*333d2b36SAndroid Build Coastguard Worker		if len(shards) > 1 {
90*333d2b36SAndroid Build Coastguard Worker			ruleName += "_" + strconv.Itoa(i)
91*333d2b36SAndroid Build Coastguard Worker			ruleDesc += " " + strconv.Itoa(i)
92*333d2b36SAndroid Build Coastguard Worker		}
93*333d2b36SAndroid Build Coastguard Worker
94*333d2b36SAndroid Build Coastguard Worker		rule.Build(ruleName, ruleDesc)
95*333d2b36SAndroid Build Coastguard Worker	}
96*333d2b36SAndroid Build Coastguard Worker
97*333d2b36SAndroid Build Coastguard Worker	return srcJarFiles
98*333d2b36SAndroid Build Coastguard Worker}
99*333d2b36SAndroid Build Coastguard Worker
100*333d2b36SAndroid Build Coastguard Workerfunc genLogtags(ctx android.ModuleContext, logtagsFile android.Path) android.Path {
101*333d2b36SAndroid Build Coastguard Worker	javaFile := android.GenPathWithExt(ctx, "logtags", logtagsFile, "java")
102*333d2b36SAndroid Build Coastguard Worker
103*333d2b36SAndroid Build Coastguard Worker	ctx.Build(pctx, android.BuildParams{
104*333d2b36SAndroid Build Coastguard Worker		Rule:        logtags,
105*333d2b36SAndroid Build Coastguard Worker		Description: "logtags " + logtagsFile.Rel(),
106*333d2b36SAndroid Build Coastguard Worker		Output:      javaFile,
107*333d2b36SAndroid Build Coastguard Worker		Input:       logtagsFile,
108*333d2b36SAndroid Build Coastguard Worker	})
109*333d2b36SAndroid Build Coastguard Worker
110*333d2b36SAndroid Build Coastguard Worker	return javaFile
111*333d2b36SAndroid Build Coastguard Worker}
112*333d2b36SAndroid Build Coastguard Worker
113*333d2b36SAndroid Build Coastguard Worker// genAidlIncludeFlags returns additional include flags based on the relative path
114*333d2b36SAndroid Build Coastguard Worker// of each .aidl file passed in srcFiles. excludeDirs is a list of paths relative to
115*333d2b36SAndroid Build Coastguard Worker// the Android checkout root that should not be included in the returned flags.
116*333d2b36SAndroid Build Coastguard Workerfunc genAidlIncludeFlags(ctx android.PathContext, srcFiles android.Paths, excludeDirs android.Paths) string {
117*333d2b36SAndroid Build Coastguard Worker	var baseDirs []string
118*333d2b36SAndroid Build Coastguard Worker	excludeDirsStrings := excludeDirs.Strings()
119*333d2b36SAndroid Build Coastguard Worker	for _, srcFile := range srcFiles {
120*333d2b36SAndroid Build Coastguard Worker		if srcFile.Ext() == ".aidl" {
121*333d2b36SAndroid Build Coastguard Worker			baseDir := strings.TrimSuffix(srcFile.String(), srcFile.Rel())
122*333d2b36SAndroid Build Coastguard Worker			baseDir = filepath.Clean(baseDir)
123*333d2b36SAndroid Build Coastguard Worker			baseDirSeen := android.InList(baseDir, baseDirs) || android.InList(baseDir, excludeDirsStrings)
124*333d2b36SAndroid Build Coastguard Worker
125*333d2b36SAndroid Build Coastguard Worker			if baseDir != "" && !baseDirSeen {
126*333d2b36SAndroid Build Coastguard Worker				baseDirs = append(baseDirs, baseDir)
127*333d2b36SAndroid Build Coastguard Worker			}
128*333d2b36SAndroid Build Coastguard Worker		}
129*333d2b36SAndroid Build Coastguard Worker	}
130*333d2b36SAndroid Build Coastguard Worker	return android.JoinWithPrefix(baseDirs, " -I")
131*333d2b36SAndroid Build Coastguard Worker}
132*333d2b36SAndroid Build Coastguard Worker
133*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) genSources(ctx android.ModuleContext, srcFiles android.Paths,
134*333d2b36SAndroid Build Coastguard Worker	flags javaBuilderFlags) android.Paths {
135*333d2b36SAndroid Build Coastguard Worker
136*333d2b36SAndroid Build Coastguard Worker	outSrcFiles := make(android.Paths, 0, len(srcFiles))
137*333d2b36SAndroid Build Coastguard Worker	var protoSrcs android.Paths
138*333d2b36SAndroid Build Coastguard Worker	var aidlSrcs android.Paths
139*333d2b36SAndroid Build Coastguard Worker
140*333d2b36SAndroid Build Coastguard Worker	for _, srcFile := range srcFiles {
141*333d2b36SAndroid Build Coastguard Worker		switch srcFile.Ext() {
142*333d2b36SAndroid Build Coastguard Worker		case ".aidl":
143*333d2b36SAndroid Build Coastguard Worker			aidlSrcs = append(aidlSrcs, srcFile)
144*333d2b36SAndroid Build Coastguard Worker		case ".logtags":
145*333d2b36SAndroid Build Coastguard Worker			j.logtagsSrcs = append(j.logtagsSrcs, srcFile)
146*333d2b36SAndroid Build Coastguard Worker			javaFile := genLogtags(ctx, srcFile)
147*333d2b36SAndroid Build Coastguard Worker			outSrcFiles = append(outSrcFiles, javaFile)
148*333d2b36SAndroid Build Coastguard Worker		case ".proto":
149*333d2b36SAndroid Build Coastguard Worker			protoSrcs = append(protoSrcs, srcFile)
150*333d2b36SAndroid Build Coastguard Worker		default:
151*333d2b36SAndroid Build Coastguard Worker			outSrcFiles = append(outSrcFiles, srcFile)
152*333d2b36SAndroid Build Coastguard Worker		}
153*333d2b36SAndroid Build Coastguard Worker	}
154*333d2b36SAndroid Build Coastguard Worker
155*333d2b36SAndroid Build Coastguard Worker	// Process all proto files together to support sharding them into one or more rules that produce srcjars.
156*333d2b36SAndroid Build Coastguard Worker	if len(protoSrcs) > 0 {
157*333d2b36SAndroid Build Coastguard Worker		srcJarFiles := genProto(ctx, protoSrcs, flags.proto)
158*333d2b36SAndroid Build Coastguard Worker		outSrcFiles = append(outSrcFiles, srcJarFiles...)
159*333d2b36SAndroid Build Coastguard Worker	}
160*333d2b36SAndroid Build Coastguard Worker
161*333d2b36SAndroid Build Coastguard Worker	// Process all aidl files together to support sharding them into one or more rules that produce srcjars.
162*333d2b36SAndroid Build Coastguard Worker	if len(aidlSrcs) > 0 {
163*333d2b36SAndroid Build Coastguard Worker		individualFlags := make(map[string]string)
164*333d2b36SAndroid Build Coastguard Worker		for _, aidlSrc := range aidlSrcs {
165*333d2b36SAndroid Build Coastguard Worker			flags := j.individualAidlFlags(ctx, aidlSrc)
166*333d2b36SAndroid Build Coastguard Worker			if flags != "" {
167*333d2b36SAndroid Build Coastguard Worker				individualFlags[aidlSrc.String()] = flags
168*333d2b36SAndroid Build Coastguard Worker			}
169*333d2b36SAndroid Build Coastguard Worker		}
170*333d2b36SAndroid Build Coastguard Worker		srcJarFiles := genAidl(ctx, aidlSrcs, flags.aidlFlags, individualFlags, flags.aidlDeps)
171*333d2b36SAndroid Build Coastguard Worker		outSrcFiles = append(outSrcFiles, srcJarFiles...)
172*333d2b36SAndroid Build Coastguard Worker	}
173*333d2b36SAndroid Build Coastguard Worker
174*333d2b36SAndroid Build Coastguard Worker	android.SetProvider(ctx, android.LogtagsProviderKey, &android.LogtagsInfo{
175*333d2b36SAndroid Build Coastguard Worker		Logtags: j.logtagsSrcs,
176*333d2b36SAndroid Build Coastguard Worker	})
177*333d2b36SAndroid Build Coastguard Worker
178*333d2b36SAndroid Build Coastguard Worker	return outSrcFiles
179*333d2b36SAndroid Build Coastguard Worker}
180