blob: aab84185122cd9501284fd7baa677f80c5c9d106 [file] [log] [blame]
Colin Crossc0b06f12015-04-08 13:03:43 -07001// Copyright 2015 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package java
16
Colin Crossc0b06f12015-04-08 13:03:43 -070017import (
Sam Delmerico2351eac2022-05-24 17:10:02 +000018 "path/filepath"
Colin Crossc0806172019-06-14 18:51:47 -070019 "strconv"
Jiyong Park29074592019-07-07 16:27:47 +090020 "strings"
21
Colin Crossc0b06f12015-04-08 13:03:43 -070022 "github.com/google/blueprint"
Colin Crossc0806172019-06-14 18:51:47 -070023 "github.com/google/blueprint/pathtools"
Colin Crossc0b06f12015-04-08 13:03:43 -070024
Colin Cross635c3b02016-05-18 15:37:25 -070025 "android/soong/android"
Colin Crossc0b06f12015-04-08 13:03:43 -070026)
27
28func init() {
Cole Faustbd20ac12024-12-10 12:30:44 -080029 pctx.HostBinToolVariable("logtagsCmd", "java-event-log-tags")
Colin Crossc0b06f12015-04-08 13:03:43 -070030}
31
32var (
Colin Cross9d45bb72016-08-29 16:14:13 -070033 logtags = pctx.AndroidStaticRule("logtags",
Colin Crossf05fe972015-04-10 17:45:20 -070034 blueprint.RuleParams{
Colin Crossb1bd1aa2017-11-15 22:47:16 -080035 Command: "$logtagsCmd -o $out $in",
Cole Faustbd20ac12024-12-10 12:30:44 -080036 CommandDeps: []string{"$logtagsCmd"},
Colin Crossf05fe972015-04-10 17:45:20 -070037 })
Colin Crossc0b06f12015-04-08 13:03:43 -070038)
39
Thiébaud Weksteende8417c2022-02-10 15:41:46 +110040func genAidl(ctx android.ModuleContext, aidlFiles android.Paths, aidlGlobalFlags string, aidlIndividualFlags map[string]string, deps android.Paths) android.Paths {
Colin Crossc0806172019-06-14 18:51:47 -070041 // Shard aidl files into groups of 50 to avoid having to recompile all of them if one changes and to avoid
42 // hitting command line length limits.
43 shards := android.ShardPaths(aidlFiles, 50)
Colin Crossc0b06f12015-04-08 13:03:43 -070044
Colin Crossc0806172019-06-14 18:51:47 -070045 srcJarFiles := make(android.Paths, 0, len(shards))
Colin Crossc0b06f12015-04-08 13:03:43 -070046
Colin Crossc0806172019-06-14 18:51:47 -070047 for i, shard := range shards {
48 srcJarFile := android.PathForModuleGen(ctx, "aidl", "aidl"+strconv.Itoa(i)+".srcjar")
49 srcJarFiles = append(srcJarFiles, srcJarFile)
50
51 outDir := srcJarFile.ReplaceExtension(ctx, "tmp")
52
Colin Crossf1a035e2020-11-16 17:32:30 -080053 rule := android.NewRuleBuilder(pctx, ctx)
Colin Crossc0806172019-06-14 18:51:47 -070054
55 rule.Command().Text("rm -rf").Flag(outDir.String())
56 rule.Command().Text("mkdir -p").Flag(outDir.String())
Thiébaud Weksteende8417c2022-02-10 15:41:46 +110057 rule.Command().Text("FLAGS=' " + aidlGlobalFlags + "'")
Colin Crossc0806172019-06-14 18:51:47 -070058
59 for _, aidlFile := range shard {
Thiébaud Weksteende8417c2022-02-10 15:41:46 +110060 localFlag := aidlIndividualFlags[aidlFile.String()]
Colin Crossc0806172019-06-14 18:51:47 -070061 depFile := srcJarFile.InSameDir(ctx, aidlFile.String()+".d")
62 javaFile := outDir.Join(ctx, pathtools.ReplaceExtension(aidlFile.String(), "java"))
63 rule.Command().
64 Tool(ctx.Config().HostToolPath(ctx, "aidl")).
65 FlagWithDepFile("-d", depFile).
66 Flag("$FLAGS").
Thiébaud Weksteende8417c2022-02-10 15:41:46 +110067 Flag(localFlag).
Colin Crossc0806172019-06-14 18:51:47 -070068 Input(aidlFile).
69 Output(javaFile).
70 Implicits(deps)
71 rule.Temporary(javaFile)
72 }
73
74 rule.Command().
75 Tool(ctx.Config().HostToolPath(ctx, "soong_zip")).
Colin Crosscf02ec82020-12-23 17:13:16 -080076 Flag("-srcjar").
Colin Crossc0806172019-06-14 18:51:47 -070077 Flag("-write_if_changed").
78 FlagWithOutput("-o ", srcJarFile).
79 FlagWithArg("-C ", outDir.String()).
80 FlagWithArg("-D ", outDir.String())
81
82 rule.Command().Text("rm -rf").Flag(outDir.String())
83
84 rule.Restat()
85
86 ruleName := "aidl"
87 ruleDesc := "aidl"
88 if len(shards) > 1 {
89 ruleName += "_" + strconv.Itoa(i)
90 ruleDesc += " " + strconv.Itoa(i)
91 }
92
Colin Crossf1a035e2020-11-16 17:32:30 -080093 rule.Build(ruleName, ruleDesc)
Colin Crossc0806172019-06-14 18:51:47 -070094 }
95
96 return srcJarFiles
Colin Crossc0b06f12015-04-08 13:03:43 -070097}
98
Colin Cross635c3b02016-05-18 15:37:25 -070099func genLogtags(ctx android.ModuleContext, logtagsFile android.Path) android.Path {
Dan Willemsen21ec4902016-11-02 20:43:13 -0700100 javaFile := android.GenPathWithExt(ctx, "logtags", logtagsFile, "java")
Colin Crossf05fe972015-04-10 17:45:20 -0700101
Colin Crossae887032017-10-23 17:16:14 -0700102 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700103 Rule: logtags,
104 Description: "logtags " + logtagsFile.Rel(),
105 Output: javaFile,
106 Input: logtagsFile,
Colin Crossf05fe972015-04-10 17:45:20 -0700107 })
108
109 return javaFile
110}
111
Sam Delmerico2351eac2022-05-24 17:10:02 +0000112// genAidlIncludeFlags returns additional include flags based on the relative path
113// of each .aidl file passed in srcFiles. excludeDirs is a list of paths relative to
114// the Android checkout root that should not be included in the returned flags.
115func genAidlIncludeFlags(ctx android.PathContext, srcFiles android.Paths, excludeDirs android.Paths) string {
Jiyong Park1112c4c2019-08-16 21:12:10 +0900116 var baseDirs []string
Sam Delmerico2351eac2022-05-24 17:10:02 +0000117 excludeDirsStrings := excludeDirs.Strings()
Jiyong Park1112c4c2019-08-16 21:12:10 +0900118 for _, srcFile := range srcFiles {
119 if srcFile.Ext() == ".aidl" {
120 baseDir := strings.TrimSuffix(srcFile.String(), srcFile.Rel())
Sam Delmerico2351eac2022-05-24 17:10:02 +0000121 baseDir = filepath.Clean(baseDir)
122 baseDirSeen := android.InList(baseDir, baseDirs) || android.InList(baseDir, excludeDirsStrings)
123
Colin Cross8ff10582023-12-07 13:10:56 -0800124 if baseDir != "" && !baseDirSeen {
Jiyong Park1112c4c2019-08-16 21:12:10 +0900125 baseDirs = append(baseDirs, baseDir)
126 }
127 }
128 }
129 return android.JoinWithPrefix(baseDirs, " -I")
130}
131
Colin Cross46c9b8b2017-06-22 16:51:17 -0700132func (j *Module) genSources(ctx android.ModuleContext, srcFiles android.Paths,
Colin Crossaf050172017-11-15 23:01:59 -0800133 flags javaBuilderFlags) android.Paths {
Colin Crossc0b06f12015-04-08 13:03:43 -0700134
Colin Cross6af17aa2017-09-20 12:59:05 -0700135 outSrcFiles := make(android.Paths, 0, len(srcFiles))
Colin Cross9516a6c2019-06-14 18:51:12 -0700136 var protoSrcs android.Paths
Colin Crossc0806172019-06-14 18:51:47 -0700137 var aidlSrcs android.Paths
Colin Cross6af17aa2017-09-20 12:59:05 -0700138
139 for _, srcFile := range srcFiles {
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700140 switch srcFile.Ext() {
Colin Crossc0b06f12015-04-08 13:03:43 -0700141 case ".aidl":
Colin Crossc0806172019-06-14 18:51:47 -0700142 aidlSrcs = append(aidlSrcs, srcFile)
Colin Crossf05fe972015-04-10 17:45:20 -0700143 case ".logtags":
144 j.logtagsSrcs = append(j.logtagsSrcs, srcFile)
145 javaFile := genLogtags(ctx, srcFile)
Colin Cross6af17aa2017-09-20 12:59:05 -0700146 outSrcFiles = append(outSrcFiles, javaFile)
147 case ".proto":
Colin Cross9516a6c2019-06-14 18:51:12 -0700148 protoSrcs = append(protoSrcs, srcFile)
Colin Cross6af17aa2017-09-20 12:59:05 -0700149 default:
150 outSrcFiles = append(outSrcFiles, srcFile)
Colin Crossc0b06f12015-04-08 13:03:43 -0700151 }
152 }
153
Colin Cross9516a6c2019-06-14 18:51:12 -0700154 // Process all proto files together to support sharding them into one or more rules that produce srcjars.
155 if len(protoSrcs) > 0 {
156 srcJarFiles := genProto(ctx, protoSrcs, flags.proto)
157 outSrcFiles = append(outSrcFiles, srcJarFiles...)
158 }
159
Colin Crossc0806172019-06-14 18:51:47 -0700160 // Process all aidl files together to support sharding them into one or more rules that produce srcjars.
161 if len(aidlSrcs) > 0 {
Thiébaud Weksteende8417c2022-02-10 15:41:46 +1100162 individualFlags := make(map[string]string)
163 for _, aidlSrc := range aidlSrcs {
164 flags := j.individualAidlFlags(ctx, aidlSrc)
165 if flags != "" {
166 individualFlags[aidlSrc.String()] = flags
167 }
168 }
Sam Delmerico2351eac2022-05-24 17:10:02 +0000169 srcJarFiles := genAidl(ctx, aidlSrcs, flags.aidlFlags, individualFlags, flags.aidlDeps)
Colin Crossc0806172019-06-14 18:51:47 -0700170 outSrcFiles = append(outSrcFiles, srcJarFiles...)
171 }
172
Inseob Kim37e0bb02024-04-29 15:54:44 +0900173 android.SetProvider(ctx, android.LogtagsProviderKey, &android.LogtagsInfo{
174 Logtags: j.logtagsSrcs,
175 })
176
Colin Crossaf050172017-11-15 23:01:59 -0800177 return outSrcFiles
Colin Crossc0b06f12015-04-08 13:03:43 -0700178}