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