blob: b6cb2aeeb72586e9510d919d83e2904782b3e28c [file] [log] [blame]
Colin Cross2fe66872015-03-30 17:20:39 -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
17// This file generates the final rules for compiling all Java. All properties related to
18// compiling should have been translated into javaBuilderFlags or another argument to the Transform*
19// functions.
20
21import (
Nan Zhang61eaedb2017-11-02 13:28:15 -070022 "path/filepath"
23 "strconv"
Colin Cross2fe66872015-03-30 17:20:39 -070024 "strings"
25
Colin Cross2fe66872015-03-30 17:20:39 -070026 "github.com/google/blueprint"
Colin Crossfe4bc362018-09-12 10:02:13 -070027 "github.com/google/blueprint/proptools"
Colin Crossfee57cb2017-09-05 13:16:45 -070028
29 "android/soong/android"
Ramy Medhat1dcc27e2020-04-21 21:36:23 -040030 "android/soong/remoteexec"
Colin Cross2fe66872015-03-30 17:20:39 -070031)
32
33var (
Colin Cross635c3b02016-05-18 15:37:25 -070034 pctx = android.NewPackageContext("android/soong/java")
Colin Cross2fe66872015-03-30 17:20:39 -070035
36 // Compiling java is not conducive to proper dependency tracking. The path-matches-class-name
37 // requirement leads to unpredictable generated source file names, and a single .java file
38 // will get compiled into multiple .class files if it contains inner classes. To work around
Colin Crossf7eac7a2018-02-08 12:48:39 -080039 // this, all java rules write into separate directories and then are combined into a .jar file
40 // (if the rule produces .class files) or a .srcjar file (if the rule produces .java files).
41 // .srcjar files are unzipped into a temporary directory when compiled with javac.
Colin Cross1ec3fce2020-03-05 12:43:14 -080042 // TODO(b/143658984): goma can't handle the --system argument to javac.
Ramy Medhat1dcc27e2020-04-21 21:36:23 -040043 javac, javacRE = remoteexec.StaticRules(pctx, "javac",
Colin Cross2fe66872015-03-30 17:20:39 -070044 blueprint.RuleParams{
Colin Cross8eadbf02017-10-24 17:46:00 -070045 Command: `rm -rf "$outDir" "$annoDir" "$srcJarDir" && mkdir -p "$outDir" "$annoDir" "$srcJarDir" && ` +
Colin Cross436b7652018-03-15 16:24:10 -070046 `${config.ZipSyncCmd} -d $srcJarDir -l $srcJarDir/list -f "*.java" $srcJars && ` +
Sundong Ahn24a099c2018-06-28 14:53:20 +090047 `(if [ -s $srcJarDir/list ] || [ -s $out.rsp ] ; then ` +
Ramy Medhat1dcc27e2020-04-21 21:36:23 -040048 `${config.SoongJavacWrapper} $reTemplate${config.JavacCmd} ` +
Sasha Smundak26c6d9e2019-06-11 13:30:13 -070049 `${config.JavacHeapFlags} ${config.JavacVmFlags} ${config.CommonJdkFlags} ` +
Colin Crossbe9cdb82019-01-21 21:37:16 -080050 `$processorpath $processor $javacFlags $bootClasspath $classpath ` +
Colin Cross64162712017-08-08 13:17:59 -070051 `-source $javaVersion -target $javaVersion ` +
Sundong Ahn24a099c2018-06-28 14:53:20 +090052 `-d $outDir -s $annoDir @$out.rsp @$srcJarDir/list ; fi ) && ` +
Colin Cross44c29a82019-01-24 16:36:57 -080053 `${config.SoongZipCmd} -jar -o $out -C $outDir -D $outDir && ` +
54 `rm -rf "$srcJarDir"`,
Colin Cross8eadbf02017-10-24 17:46:00 -070055 CommandDeps: []string{
56 "${config.JavacCmd}",
57 "${config.SoongZipCmd}",
Colin Cross436b7652018-03-15 16:24:10 -070058 "${config.ZipSyncCmd}",
Colin Cross8eadbf02017-10-24 17:46:00 -070059 },
Colin Crossa4820652017-10-17 13:56:52 -070060 CommandOrderOnly: []string{"${config.SoongJavacWrapper}"},
61 Rspfile: "$out.rsp",
62 RspfileContent: "$in",
Ramy Medhat1dcc27e2020-04-21 21:36:23 -040063 }, &remoteexec.REParams{
64 Labels: map[string]string{"type": "compile", "lang": "java", "compiler": "javac"},
65 ExecStrategy: "${config.REJavacExecStrategy}",
66 Platform: map[string]string{remoteexec.PoolKey: "${config.REJavaPool}"},
67 }, []string{"javacFlags", "bootClasspath", "classpath", "processorpath", "processor", "srcJars", "srcJarDir",
68 "outDir", "annoDir", "javaVersion"}, nil)
Colin Cross2fe66872015-03-30 17:20:39 -070069
Sasha Smundak2a4549e2018-11-05 16:49:08 -080070 _ = pctx.VariableFunc("kytheCorpus",
71 func(ctx android.PackageVarContext) string { return ctx.Config().XrefCorpusName() })
Sasha Smundak6c2d4f92020-01-09 17:34:23 -080072 _ = pctx.VariableFunc("kytheCuEncoding",
73 func(ctx android.PackageVarContext) string { return ctx.Config().XrefCuEncoding() })
Sasha Smundak65143642019-09-26 20:14:28 -070074 _ = pctx.SourcePathVariable("kytheVnames", "build/soong/vnames.json")
Sasha Smundak2a4549e2018-11-05 16:49:08 -080075 // Run it with -add-opens=java.base/java.nio=ALL-UNNAMED to avoid JDK9's warning about
76 // "Illegal reflective access by com.google.protobuf.Utf8$UnsafeProcessor ...
77 // to field java.nio.Buffer.address"
78 kytheExtract = pctx.AndroidStaticRule("kythe",
79 blueprint.RuleParams{
80 Command: `${config.ZipSyncCmd} -d $srcJarDir ` +
81 `-l $srcJarDir/list -f "*.java" $srcJars && ` +
82 `( [ ! -s $srcJarDir/list -a ! -s $out.rsp ] || ` +
83 `KYTHE_ROOT_DIRECTORY=. KYTHE_OUTPUT_FILE=$out ` +
84 `KYTHE_CORPUS=${kytheCorpus} ` +
Sasha Smundak65143642019-09-26 20:14:28 -070085 `KYTHE_VNAMES=${kytheVnames} ` +
Sasha Smundak6c2d4f92020-01-09 17:34:23 -080086 `KYTHE_KZIP_ENCODING=${kytheCuEncoding} ` +
Sasha Smundak2a4549e2018-11-05 16:49:08 -080087 `${config.SoongJavacWrapper} ${config.JavaCmd} ` +
88 `--add-opens=java.base/java.nio=ALL-UNNAMED ` +
89 `-jar ${config.JavaKytheExtractorJar} ` +
90 `${config.JavacHeapFlags} ${config.CommonJdkFlags} ` +
91 `$processorpath $processor $javacFlags $bootClasspath $classpath ` +
92 `-source $javaVersion -target $javaVersion ` +
93 `-d $outDir -s $annoDir @$out.rsp @$srcJarDir/list)`,
94 CommandDeps: []string{
95 "${config.JavaCmd}",
96 "${config.JavaKytheExtractorJar}",
Sasha Smundak65143642019-09-26 20:14:28 -070097 "${kytheVnames}",
Sasha Smundak2a4549e2018-11-05 16:49:08 -080098 "${config.ZipSyncCmd}",
99 },
100 CommandOrderOnly: []string{"${config.SoongJavacWrapper}"},
101 Rspfile: "$out.rsp",
102 RspfileContent: "$in",
103 },
104 "javacFlags", "bootClasspath", "classpath", "processorpath", "processor", "srcJars", "srcJarDir",
105 "outDir", "annoDir", "javaVersion")
106
Sasha Smundaka7856c02020-04-23 09:49:59 -0700107 extractMatchingApks = pctx.StaticRule(
108 "extractMatchingApks",
109 blueprint.RuleParams{
110 Command: `rm -rf "$out" && ` +
111 `${config.ExtractApksCmd} -o "${out}" -allow-prereleased=${allow-prereleased} ` +
112 `-sdk-version=${sdk-version} -abis=${abis} ` +
113 `--screen-densities=${screen-densities} --stem=${stem} ` +
114 `${in}`,
115 CommandDeps: []string{"${config.ExtractApksCmd}"},
116 },
117 "abis", "allow-prereleased", "screen-densities", "sdk-version", "stem")
118
Kousik Kumar1372c1b2020-05-20 07:55:56 -0700119 turbine, turbineRE = remoteexec.StaticRules(pctx, "turbine",
Nan Zhanged19fc32017-10-19 13:06:22 -0700120 blueprint.RuleParams{
Colin Cross6981f652018-03-07 15:14:50 -0800121 Command: `rm -rf "$outDir" && mkdir -p "$outDir" && ` +
Kousik Kumar1372c1b2020-05-20 07:55:56 -0700122 `$reTemplate${config.JavaCmd} ${config.JavaVmFlags} -jar ${config.TurbineJar} --output $out.tmp ` +
Colin Cross6981f652018-03-07 15:14:50 -0800123 `--temp_dir "$outDir" --sources @$out.rsp --source_jars $srcJars ` +
Nan Zhanged19fc32017-10-19 13:06:22 -0700124 `--javacopts ${config.CommonJdkFlags} ` +
Colin Cross924a0aa2018-03-07 10:51:05 -0800125 `$javacFlags -source $javaVersion -target $javaVersion -- $bootClasspath $classpath && ` +
Nan Zhanged19fc32017-10-19 13:06:22 -0700126 `${config.Ziptime} $out.tmp && ` +
127 `(if cmp -s $out.tmp $out ; then rm $out.tmp ; else mv $out.tmp $out ; fi )`,
Colin Cross8eadbf02017-10-24 17:46:00 -0700128 CommandDeps: []string{
129 "${config.TurbineJar}",
130 "${config.JavaCmd}",
131 "${config.Ziptime}",
Colin Cross8eadbf02017-10-24 17:46:00 -0700132 },
Nan Zhanged19fc32017-10-19 13:06:22 -0700133 Rspfile: "$out.rsp",
134 RspfileContent: "$in",
135 Restat: true,
136 },
Kousik Kumar1372c1b2020-05-20 07:55:56 -0700137 &remoteexec.REParams{Labels: map[string]string{"type": "tool", "name": "turbine"},
138 ExecStrategy: "${config.RETurbineExecStrategy}",
139 Inputs: []string{"${config.TurbineJar}", "${out}.rsp", "$implicits"},
140 RSPFile: "${out}.rsp",
141 OutputFiles: []string{"$out.tmp"},
142 OutputDirectories: []string{"$outDir"},
143 ToolchainInputs: []string{"${config.JavaCmd}"},
144 Platform: map[string]string{remoteexec.PoolKey: "${config.REJavaPool}"},
145 }, []string{"javacFlags", "bootClasspath", "classpath", "srcJars", "outDir", "javaVersion"}, []string{"implicits"})
Nan Zhanged19fc32017-10-19 13:06:22 -0700146
Colin Cross9d45bb72016-08-29 16:14:13 -0700147 jar = pctx.AndroidStaticRule("jar",
Colin Cross2fe66872015-03-30 17:20:39 -0700148 blueprint.RuleParams{
Nan Zhang674dd932018-01-26 18:30:36 -0800149 Command: `${config.SoongZipCmd} -jar -o $out @$out.rsp`,
150 CommandDeps: []string{"${config.SoongZipCmd}"},
151 Rspfile: "$out.rsp",
152 RspfileContent: "$jarArgs",
Colin Cross2fe66872015-03-30 17:20:39 -0700153 },
Colin Cross0a6e0072017-08-30 14:24:55 -0700154 "jarArgs")
155
Colin Crossa4f08812018-10-02 22:03:40 -0700156 zip = pctx.AndroidStaticRule("zip",
157 blueprint.RuleParams{
158 Command: `${config.SoongZipCmd} -o $out @$out.rsp`,
159 CommandDeps: []string{"${config.SoongZipCmd}"},
160 Rspfile: "$out.rsp",
161 RspfileContent: "$jarArgs",
162 },
163 "jarArgs")
164
Colin Cross0a6e0072017-08-30 14:24:55 -0700165 combineJar = pctx.AndroidStaticRule("combineJar",
166 blueprint.RuleParams{
Colin Crossf91a08c2018-02-07 15:41:31 -0800167 Command: `${config.MergeZipsCmd} --ignore-duplicates -j $jarArgs $out $in`,
Colin Cross0a6e0072017-08-30 14:24:55 -0700168 CommandDeps: []string{"${config.MergeZipsCmd}"},
169 },
Colin Cross635acc92017-09-12 22:50:46 -0700170 "jarArgs")
Colin Cross2fe66872015-03-30 17:20:39 -0700171
Colin Cross9d45bb72016-08-29 16:14:13 -0700172 jarjar = pctx.AndroidStaticRule("jarjar",
Colin Cross65bf4f22015-04-03 16:54:17 -0700173 blueprint.RuleParams{
Artur Satayev762d9f32020-04-15 12:50:04 +0100174 Command: "${config.JavaCmd} ${config.JavaVmFlags}" +
175 // b/146418363 Enable Android specific jarjar transformer to drop compat annotations
176 // for newly repackaged classes. Dropping @UnsupportedAppUsage on repackaged classes
177 // avoids adding new hiddenapis after jarjar'ing.
178 " -DremoveAndroidCompatAnnotations=true" +
179 " -jar ${config.JarjarCmd} process $rulesFile $in $out",
Colin Cross64162712017-08-08 13:17:59 -0700180 CommandDeps: []string{"${config.JavaCmd}", "${config.JarjarCmd}", "$rulesFile"},
Colin Cross65bf4f22015-04-03 16:54:17 -0700181 },
182 "rulesFile")
Nan Zhang4c819fb2018-08-27 18:31:46 -0700183
Vladimir Marko0975ee02019-04-02 10:29:55 +0100184 packageCheck = pctx.AndroidStaticRule("packageCheck",
185 blueprint.RuleParams{
186 Command: "rm -f $out && " +
187 "${config.PackageCheckCmd} $in $packages && " +
188 "touch $out",
189 CommandDeps: []string{"${config.PackageCheckCmd}"},
190 },
191 "packages")
192
Nan Zhang4c819fb2018-08-27 18:31:46 -0700193 jetifier = pctx.AndroidStaticRule("jetifier",
194 blueprint.RuleParams{
Sasha Smundak26c6d9e2019-06-11 13:30:13 -0700195 Command: "${config.JavaCmd} ${config.JavaVmFlags} -jar ${config.JetifierJar} -l error -o $out -i $in",
Nan Zhang4c819fb2018-08-27 18:31:46 -0700196 CommandDeps: []string{"${config.JavaCmd}", "${config.JetifierJar}"},
197 },
198 )
Colin Cross43f08db2018-11-12 10:13:39 -0800199
200 zipalign = pctx.AndroidStaticRule("zipalign",
201 blueprint.RuleParams{
Colin Crosse4246ab2019-02-05 21:55:21 -0800202 Command: "if ! ${config.ZipAlign} -c -p 4 $in > /dev/null; then " +
203 "${config.ZipAlign} -f -p 4 $in $out; " +
Colin Cross43f08db2018-11-12 10:13:39 -0800204 "else " +
205 "cp -f $in $out; " +
206 "fi",
207 CommandDeps: []string{"${config.ZipAlign}"},
208 },
209 )
Colin Cross2fe66872015-03-30 17:20:39 -0700210)
211
212func init() {
Colin Crosscc0ce802019-04-02 16:14:11 -0700213 pctx.Import("android/soong/android")
Colin Cross64162712017-08-08 13:17:59 -0700214 pctx.Import("android/soong/java/config")
Ramy Medhat1dcc27e2020-04-21 21:36:23 -0400215 pctx.Import("android/soong/remoteexec")
Colin Cross2fe66872015-03-30 17:20:39 -0700216}
217
218type javaBuilderFlags struct {
Colin Cross6cef4812019-10-17 14:23:50 -0700219 javacFlags string
220 bootClasspath classpath
221 classpath classpath
222 java9Classpath classpath
223 processorPath classpath
Colin Cross5a116862020-04-22 11:44:34 -0700224 processors []string
Colin Cross6cef4812019-10-17 14:23:50 -0700225 systemModules *systemModules
226 aidlFlags string
227 aidlDeps android.Paths
228 javaVersion javaVersion
Colin Cross6af17aa2017-09-20 12:59:05 -0700229
Andreas Gampef3e5b552018-01-22 21:27:21 -0800230 errorProneExtraJavacFlags string
Colin Cross66548102018-06-19 22:47:35 -0700231 errorProneProcessorPath classpath
Andreas Gampef3e5b552018-01-22 21:27:21 -0800232
Colin Cross93e85952017-08-15 13:34:18 -0700233 kotlincFlags string
234 kotlincClasspath classpath
235
Colin Cross19878da2019-03-28 14:45:07 -0700236 proto android.ProtoFlags
Colin Cross2fe66872015-03-30 17:20:39 -0700237}
238
Nan Zhang61eaedb2017-11-02 13:28:15 -0700239func TransformJavaToClasses(ctx android.ModuleContext, outputFile android.WritablePath, shardIdx int,
240 srcFiles, srcJars android.Paths, flags javaBuilderFlags, deps android.Paths) {
Colin Cross2fe66872015-03-30 17:20:39 -0700241
Nan Zhang61eaedb2017-11-02 13:28:15 -0700242 // Compile java sources into .class files
243 desc := "javac"
244 if shardIdx >= 0 {
245 desc += strconv.Itoa(shardIdx)
246 }
247
Colin Cross66548102018-06-19 22:47:35 -0700248 transformJavaToClasses(ctx, outputFile, shardIdx, srcFiles, srcJars, flags, deps, "javac", desc)
Colin Cross2fe66872015-03-30 17:20:39 -0700249}
250
Colin Crosse9a275b2017-10-16 17:09:48 -0700251func RunErrorProne(ctx android.ModuleContext, outputFile android.WritablePath,
Colin Cross8eadbf02017-10-24 17:46:00 -0700252 srcFiles, srcJars android.Paths, flags javaBuilderFlags) {
Colin Crossc6bbef32017-08-14 14:16:06 -0700253
Colin Cross66548102018-06-19 22:47:35 -0700254 flags.processorPath = append(flags.errorProneProcessorPath, flags.processorPath...)
Colin Crossfee57cb2017-09-05 13:16:45 -0700255
Andreas Gampef3e5b552018-01-22 21:27:21 -0800256 if len(flags.errorProneExtraJavacFlags) > 0 {
257 if len(flags.javacFlags) > 0 {
Colin Cross66548102018-06-19 22:47:35 -0700258 flags.javacFlags += " " + flags.errorProneExtraJavacFlags
Andreas Gampef3e5b552018-01-22 21:27:21 -0800259 } else {
260 flags.javacFlags = flags.errorProneExtraJavacFlags
261 }
262 }
263
Nan Zhang61eaedb2017-11-02 13:28:15 -0700264 transformJavaToClasses(ctx, outputFile, -1, srcFiles, srcJars, flags, nil,
Colin Cross66548102018-06-19 22:47:35 -0700265 "errorprone", "errorprone")
Colin Cross070879e2017-10-11 11:21:07 -0700266}
267
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800268// Emits the rule to generate Xref input file (.kzip file) for the given set of source files and source jars
269// to compile with given set of builder flags, etc.
Colin Cross3b706fd2019-09-05 16:44:18 -0700270func emitXrefRule(ctx android.ModuleContext, xrefFile android.WritablePath, idx int,
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800271 srcFiles, srcJars android.Paths,
Colin Cross3b706fd2019-09-05 16:44:18 -0700272 flags javaBuilderFlags, deps android.Paths) {
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800273
274 deps = append(deps, srcJars...)
Sasha Smundak09950a42019-11-04 16:29:45 -0800275 classpath := flags.classpath
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800276
277 var bootClasspath string
Colin Cross1e743852019-10-28 11:37:20 -0700278 if flags.javaVersion.usesJavaModules() {
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800279 var systemModuleDeps android.Paths
280 bootClasspath, systemModuleDeps = flags.systemModules.FormJavaSystemModulesPath(ctx.Device())
281 deps = append(deps, systemModuleDeps...)
Sasha Smundak09950a42019-11-04 16:29:45 -0800282 classpath = append(flags.java9Classpath, classpath...)
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800283 } else {
284 deps = append(deps, flags.bootClasspath...)
285 if len(flags.bootClasspath) == 0 && ctx.Device() {
286 // explicitly specify -bootclasspath "" if the bootclasspath is empty to
287 // ensure java does not fall back to the default bootclasspath.
288 bootClasspath = `-bootclasspath ""`
289 } else {
290 bootClasspath = flags.bootClasspath.FormJavaClassPath("-bootclasspath")
291 }
292 }
293
Sasha Smundak09950a42019-11-04 16:29:45 -0800294 deps = append(deps, classpath...)
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800295 deps = append(deps, flags.processorPath...)
296
297 processor := "-proc:none"
Colin Cross5a116862020-04-22 11:44:34 -0700298 if len(flags.processors) > 0 {
299 processor = "-processor " + strings.Join(flags.processors, ",")
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800300 }
301
Colin Cross3b706fd2019-09-05 16:44:18 -0700302 intermediatesDir := "xref"
303 if idx >= 0 {
304 intermediatesDir += strconv.Itoa(idx)
305 }
306
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800307 ctx.Build(pctx,
308 android.BuildParams{
309 Rule: kytheExtract,
310 Description: "Xref Java extractor",
311 Output: xrefFile,
312 Inputs: srcFiles,
313 Implicits: deps,
314 Args: map[string]string{
315 "annoDir": android.PathForModuleOut(ctx, intermediatesDir, "anno").String(),
316 "bootClasspath": bootClasspath,
Sasha Smundak09950a42019-11-04 16:29:45 -0800317 "classpath": classpath.FormJavaClassPath("-classpath"),
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800318 "javacFlags": flags.javacFlags,
Colin Cross1e743852019-10-28 11:37:20 -0700319 "javaVersion": flags.javaVersion.String(),
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800320 "outDir": android.PathForModuleOut(ctx, "javac", "classes.xref").String(),
321 "processorpath": flags.processorPath.FormJavaClassPath("-processorpath"),
322 "processor": processor,
323 "srcJarDir": android.PathForModuleOut(ctx, intermediatesDir, "srcjars.xref").String(),
324 "srcJars": strings.Join(srcJars.Strings(), " "),
325 },
326 })
327}
328
Nan Zhanged19fc32017-10-19 13:06:22 -0700329func TransformJavaToHeaderClasses(ctx android.ModuleContext, outputFile android.WritablePath,
Colin Cross8eadbf02017-10-24 17:46:00 -0700330 srcFiles, srcJars android.Paths, flags javaBuilderFlags) {
Nan Zhanged19fc32017-10-19 13:06:22 -0700331
332 var deps android.Paths
333 deps = append(deps, srcJars...)
Nan Zhanged19fc32017-10-19 13:06:22 -0700334
Colin Cross6cef4812019-10-17 14:23:50 -0700335 classpath := flags.classpath
336
Nan Zhanged19fc32017-10-19 13:06:22 -0700337 var bootClasspath string
Colin Crossbf3119e2019-10-28 14:25:10 -0700338 if flags.javaVersion.usesJavaModules() {
339 var systemModuleDeps android.Paths
340 bootClasspath, systemModuleDeps = flags.systemModules.FormTurbineSystemModulesPath(ctx.Device())
341 deps = append(deps, systemModuleDeps...)
Colin Cross6cef4812019-10-17 14:23:50 -0700342 classpath = append(flags.java9Classpath, classpath...)
Nan Zhanged19fc32017-10-19 13:06:22 -0700343 } else {
Colin Crossbf3119e2019-10-28 14:25:10 -0700344 deps = append(deps, flags.bootClasspath...)
345 if len(flags.bootClasspath) == 0 && ctx.Device() {
346 // explicitly specify -bootclasspath "" if the bootclasspath is empty to
347 // ensure turbine does not fall back to the default bootclasspath.
348 bootClasspath = `--bootclasspath ""`
349 } else {
Colin Crossc2557d12019-10-31 15:22:57 -0700350 bootClasspath = flags.bootClasspath.FormTurbineClassPath("--bootclasspath ")
Colin Crossbf3119e2019-10-28 14:25:10 -0700351 }
Nan Zhanged19fc32017-10-19 13:06:22 -0700352 }
Colin Cross8eadbf02017-10-24 17:46:00 -0700353
Colin Cross6cef4812019-10-17 14:23:50 -0700354 deps = append(deps, classpath...)
Colin Crossbf3119e2019-10-28 14:25:10 -0700355 deps = append(deps, flags.processorPath...)
356
Kousik Kumar1372c1b2020-05-20 07:55:56 -0700357 rule := turbine
358 args := map[string]string{
359 "javacFlags": flags.javacFlags,
360 "bootClasspath": bootClasspath,
361 "srcJars": strings.Join(srcJars.Strings(), " "),
362 "classpath": classpath.FormTurbineClassPath("--classpath "),
363 "outDir": android.PathForModuleOut(ctx, "turbine", "classes").String(),
364 "javaVersion": flags.javaVersion.String(),
365 }
366 if ctx.Config().IsEnvTrue("RBE_TURBINE") {
367 rule = turbineRE
368 args["implicits"] = strings.Join(deps.Strings(), ",")
369 }
Colin Crossae887032017-10-23 17:16:14 -0700370 ctx.Build(pctx, android.BuildParams{
Kousik Kumar1372c1b2020-05-20 07:55:56 -0700371 Rule: rule,
Nan Zhanged19fc32017-10-19 13:06:22 -0700372 Description: "turbine",
373 Output: outputFile,
374 Inputs: srcFiles,
375 Implicits: deps,
Kousik Kumar1372c1b2020-05-20 07:55:56 -0700376 Args: args,
Nan Zhanged19fc32017-10-19 13:06:22 -0700377 })
378}
379
Colin Cross070879e2017-10-11 11:21:07 -0700380// transformJavaToClasses takes source files and converts them to a jar containing .class files.
Colin Cross59149b62017-10-16 18:07:29 -0700381// srcFiles is a list of paths to sources, srcJars is a list of paths to jar files that contain
382// sources. flags contains various command line flags to be passed to the compiler.
Colin Cross070879e2017-10-11 11:21:07 -0700383//
384// This method may be used for different compilers, including javac and Error Prone. The rule
385// argument specifies which command line to use and desc sets the description of the rule that will
386// be printed at build time. The stem argument provides the file name of the output jar, and
387// suffix will be appended to various intermediate files and directories to avoid collisions when
388// this function is called twice in the same module directory.
Colin Crosse9a275b2017-10-16 17:09:48 -0700389func transformJavaToClasses(ctx android.ModuleContext, outputFile android.WritablePath,
Nan Zhang61eaedb2017-11-02 13:28:15 -0700390 shardIdx int, srcFiles, srcJars android.Paths,
Colin Crosse9a275b2017-10-16 17:09:48 -0700391 flags javaBuilderFlags, deps android.Paths,
Colin Cross66548102018-06-19 22:47:35 -0700392 intermediatesDir, desc string) {
Colin Crossc6bbef32017-08-14 14:16:06 -0700393
Colin Cross59149b62017-10-16 18:07:29 -0700394 deps = append(deps, srcJars...)
Colin Cross1369cdb2017-09-29 17:58:17 -0700395
Colin Cross6cef4812019-10-17 14:23:50 -0700396 classpath := flags.classpath
397
Colin Cross1369cdb2017-09-29 17:58:17 -0700398 var bootClasspath string
Colin Cross1e743852019-10-28 11:37:20 -0700399 if flags.javaVersion.usesJavaModules() {
Colin Crossb77043e2019-07-16 13:57:13 -0700400 var systemModuleDeps android.Paths
401 bootClasspath, systemModuleDeps = flags.systemModules.FormJavaSystemModulesPath(ctx.Device())
402 deps = append(deps, systemModuleDeps...)
Colin Cross6cef4812019-10-17 14:23:50 -0700403 classpath = append(flags.java9Classpath, classpath...)
Colin Cross1369cdb2017-09-29 17:58:17 -0700404 } else {
405 deps = append(deps, flags.bootClasspath...)
Nan Zhanged19fc32017-10-19 13:06:22 -0700406 if len(flags.bootClasspath) == 0 && ctx.Device() {
407 // explicitly specify -bootclasspath "" if the bootclasspath is empty to
408 // ensure java does not fall back to the default bootclasspath.
409 bootClasspath = `-bootclasspath ""`
410 } else {
411 bootClasspath = flags.bootClasspath.FormJavaClassPath("-bootclasspath")
412 }
Colin Cross1369cdb2017-09-29 17:58:17 -0700413 }
414
Colin Cross6cef4812019-10-17 14:23:50 -0700415 deps = append(deps, classpath...)
Colin Cross6a77c982018-06-19 22:43:34 -0700416 deps = append(deps, flags.processorPath...)
Colin Crossc6bbef32017-08-14 14:16:06 -0700417
Colin Cross7788c122019-01-23 16:14:02 -0800418 processor := "-proc:none"
Colin Cross5a116862020-04-22 11:44:34 -0700419 if len(flags.processors) > 0 {
420 processor = "-processor " + strings.Join(flags.processors, ",")
Colin Crossbe9cdb82019-01-21 21:37:16 -0800421 }
422
Nan Zhang61eaedb2017-11-02 13:28:15 -0700423 srcJarDir := "srcjars"
424 outDir := "classes"
425 annoDir := "anno"
426 if shardIdx >= 0 {
427 shardDir := "shard" + strconv.Itoa(shardIdx)
428 srcJarDir = filepath.Join(shardDir, srcJarDir)
429 outDir = filepath.Join(shardDir, outDir)
430 annoDir = filepath.Join(shardDir, annoDir)
431 }
Ramy Medhat1dcc27e2020-04-21 21:36:23 -0400432 rule := javac
433 if ctx.Config().IsEnvTrue("RBE_JAVAC") {
434 rule = javacRE
435 }
Colin Crossae887032017-10-23 17:16:14 -0700436 ctx.Build(pctx, android.BuildParams{
Ramy Medhat1dcc27e2020-04-21 21:36:23 -0400437 Rule: rule,
Colin Cross070879e2017-10-11 11:21:07 -0700438 Description: desc,
439 Output: outputFile,
Colin Crossc6bbef32017-08-14 14:16:06 -0700440 Inputs: srcFiles,
441 Implicits: deps,
442 Args: map[string]string{
Colin Cross59149b62017-10-16 18:07:29 -0700443 "javacFlags": flags.javacFlags,
Colin Cross1369cdb2017-09-29 17:58:17 -0700444 "bootClasspath": bootClasspath,
Colin Cross6cef4812019-10-17 14:23:50 -0700445 "classpath": classpath.FormJavaClassPath("-classpath"),
Colin Cross6a77c982018-06-19 22:43:34 -0700446 "processorpath": flags.processorPath.FormJavaClassPath("-processorpath"),
Colin Crossbe9cdb82019-01-21 21:37:16 -0800447 "processor": processor,
Colin Cross8eadbf02017-10-24 17:46:00 -0700448 "srcJars": strings.Join(srcJars.Strings(), " "),
Nan Zhang61eaedb2017-11-02 13:28:15 -0700449 "srcJarDir": android.PathForModuleOut(ctx, intermediatesDir, srcJarDir).String(),
450 "outDir": android.PathForModuleOut(ctx, intermediatesDir, outDir).String(),
451 "annoDir": android.PathForModuleOut(ctx, intermediatesDir, annoDir).String(),
Colin Cross1e743852019-10-28 11:37:20 -0700452 "javaVersion": flags.javaVersion.String(),
Colin Crossc6bbef32017-08-14 14:16:06 -0700453 },
454 })
Colin Crossc6bbef32017-08-14 14:16:06 -0700455}
456
Colin Crosse9a275b2017-10-16 17:09:48 -0700457func TransformResourcesToJar(ctx android.ModuleContext, outputFile android.WritablePath,
458 jarArgs []string, deps android.Paths) {
Colin Cross2fe66872015-03-30 17:20:39 -0700459
Colin Crossae887032017-10-23 17:16:14 -0700460 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700461 Rule: jar,
462 Description: "jar",
463 Output: outputFile,
464 Implicits: deps,
Colin Cross2fe66872015-03-30 17:20:39 -0700465 Args: map[string]string{
Colin Cross0b9f31f2019-02-28 11:00:01 -0800466 "jarArgs": strings.Join(proptools.NinjaAndShellEscapeList(jarArgs), " "),
Colin Cross2fe66872015-03-30 17:20:39 -0700467 },
468 })
Colin Cross2fe66872015-03-30 17:20:39 -0700469}
470
Nan Zhanged19fc32017-10-19 13:06:22 -0700471func TransformJarsToJar(ctx android.ModuleContext, outputFile android.WritablePath, desc string,
Colin Cross37f6d792018-07-12 12:28:41 -0700472 jars android.Paths, manifest android.OptionalPath, stripDirEntries bool, filesToStrip []string,
473 dirsToStrip []string) {
Colin Cross0a6e0072017-08-30 14:24:55 -0700474
Colin Cross635acc92017-09-12 22:50:46 -0700475 var deps android.Paths
476
477 var jarArgs []string
478 if manifest.Valid() {
Nan Zhanged19fc32017-10-19 13:06:22 -0700479 jarArgs = append(jarArgs, "-m ", manifest.String())
Colin Cross635acc92017-09-12 22:50:46 -0700480 deps = append(deps, manifest.Path())
481 }
482
Colin Cross37f6d792018-07-12 12:28:41 -0700483 for _, dir := range dirsToStrip {
484 jarArgs = append(jarArgs, "-stripDir ", dir)
485 }
486
487 for _, file := range filesToStrip {
488 jarArgs = append(jarArgs, "-stripFile ", file)
Nan Zhanged19fc32017-10-19 13:06:22 -0700489 }
490
Colin Cross7b60cdd2017-12-21 13:52:58 -0800491 // Remove any module-info.class files that may have come from prebuilt jars, they cause problems
492 // for downstream tools like desugar.
493 jarArgs = append(jarArgs, "-stripFile module-info.class")
494
Colin Cross37f6d792018-07-12 12:28:41 -0700495 if stripDirEntries {
Colin Cross635acc92017-09-12 22:50:46 -0700496 jarArgs = append(jarArgs, "-D")
497 }
498
Colin Crossae887032017-10-23 17:16:14 -0700499 ctx.Build(pctx, android.BuildParams{
Colin Cross0a6e0072017-08-30 14:24:55 -0700500 Rule: combineJar,
Nan Zhanged19fc32017-10-19 13:06:22 -0700501 Description: desc,
Colin Cross0a6e0072017-08-30 14:24:55 -0700502 Output: outputFile,
503 Inputs: jars,
Colin Cross635acc92017-09-12 22:50:46 -0700504 Implicits: deps,
505 Args: map[string]string{
506 "jarArgs": strings.Join(jarArgs, " "),
507 },
Colin Cross0a6e0072017-08-30 14:24:55 -0700508 })
Colin Cross0a6e0072017-08-30 14:24:55 -0700509}
510
Colin Crosse9a275b2017-10-16 17:09:48 -0700511func TransformJarJar(ctx android.ModuleContext, outputFile android.WritablePath,
512 classesJar android.Path, rulesFile android.Path) {
Colin Crossae887032017-10-23 17:16:14 -0700513 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700514 Rule: jarjar,
515 Description: "jarjar",
516 Output: outputFile,
517 Input: classesJar,
518 Implicit: rulesFile,
Colin Cross65bf4f22015-04-03 16:54:17 -0700519 Args: map[string]string{
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700520 "rulesFile": rulesFile.String(),
Colin Cross65bf4f22015-04-03 16:54:17 -0700521 },
522 })
Colin Cross65bf4f22015-04-03 16:54:17 -0700523}
Colin Cross6ade34f2017-09-15 13:00:47 -0700524
Vladimir Marko0975ee02019-04-02 10:29:55 +0100525func CheckJarPackages(ctx android.ModuleContext, outputFile android.WritablePath,
526 classesJar android.Path, permittedPackages []string) {
527 ctx.Build(pctx, android.BuildParams{
528 Rule: packageCheck,
529 Description: "packageCheck",
530 Output: outputFile,
531 Input: classesJar,
532 Args: map[string]string{
533 "packages": strings.Join(permittedPackages, " "),
534 },
535 })
536}
537
Nan Zhang4c819fb2018-08-27 18:31:46 -0700538func TransformJetifier(ctx android.ModuleContext, outputFile android.WritablePath,
539 inputFile android.Path) {
540 ctx.Build(pctx, android.BuildParams{
541 Rule: jetifier,
542 Description: "jetifier",
543 Output: outputFile,
544 Input: inputFile,
545 })
546}
547
Colin Cross094054a2018-10-17 15:10:48 -0700548func GenerateMainClassManifest(ctx android.ModuleContext, outputFile android.WritablePath, mainClass string) {
549 ctx.Build(pctx, android.BuildParams{
550 Rule: android.WriteFile,
551 Description: "manifest",
552 Output: outputFile,
553 Args: map[string]string{
554 "content": "Main-Class: " + mainClass + "\n",
555 },
556 })
557}
558
Colin Cross43f08db2018-11-12 10:13:39 -0800559func TransformZipAlign(ctx android.ModuleContext, outputFile android.WritablePath, inputFile android.Path) {
560 ctx.Build(pctx, android.BuildParams{
561 Rule: zipalign,
562 Description: "align",
563 Input: inputFile,
564 Output: outputFile,
565 })
566}
567
Colin Cross33961b52019-07-11 11:01:22 -0700568type classpath android.Paths
Colin Cross6ade34f2017-09-15 13:00:47 -0700569
Colin Crossc2557d12019-10-31 15:22:57 -0700570func (x *classpath) formJoinedClassPath(optName string, sep string) string {
Colin Cross81440082018-08-15 20:21:55 -0700571 if optName != "" && !strings.HasSuffix(optName, "=") && !strings.HasSuffix(optName, " ") {
572 optName += " "
573 }
Colin Cross59149b62017-10-16 18:07:29 -0700574 if len(*x) > 0 {
Colin Crossc2557d12019-10-31 15:22:57 -0700575 return optName + strings.Join(x.Strings(), sep)
Colin Cross6ade34f2017-09-15 13:00:47 -0700576 } else {
577 return ""
578 }
579}
Colin Crossc2557d12019-10-31 15:22:57 -0700580func (x *classpath) FormJavaClassPath(optName string) string {
581 return x.formJoinedClassPath(optName, ":")
582}
Colin Cross6ade34f2017-09-15 13:00:47 -0700583
Colin Crossc2557d12019-10-31 15:22:57 -0700584func (x *classpath) FormTurbineClassPath(optName string) string {
585 return x.formJoinedClassPath(optName, " ")
586}
587
588// FormRepeatedClassPath returns a list of arguments with the given optName prefixed to each element of the classpath.
589func (x *classpath) FormRepeatedClassPath(optName string) []string {
Colin Cross6ade34f2017-09-15 13:00:47 -0700590 if x == nil || *x == nil {
591 return nil
592 }
593 flags := make([]string, len(*x))
594 for i, v := range *x {
Colin Crossafbb1732019-01-17 15:42:52 -0800595 flags[i] = optName + v.String()
Colin Cross6ade34f2017-09-15 13:00:47 -0700596 }
597
598 return flags
599}
600
Colin Cross6ade34f2017-09-15 13:00:47 -0700601// Convert a classpath to an android.Paths
602func (x *classpath) Paths() android.Paths {
603 return append(android.Paths(nil), (*x)...)
604}
605
606func (x *classpath) Strings() []string {
607 if x == nil {
608 return nil
609 }
610 ret := make([]string, len(*x))
611 for i, path := range *x {
612 ret[i] = path.String()
613 }
614 return ret
615}
Colin Crossb77043e2019-07-16 13:57:13 -0700616
617type systemModules struct {
618 dir android.Path
619 deps android.Paths
620}
621
Colin Crossbf3119e2019-10-28 14:25:10 -0700622// Returns a --system argument in the form javac expects with -source 1.9 and the list of files to
623// depend on. If forceEmpty is true, returns --system=none if the list is empty to ensure javac
624// does not fall back to the default system modules.
Colin Crossb77043e2019-07-16 13:57:13 -0700625func (x *systemModules) FormJavaSystemModulesPath(forceEmpty bool) (string, android.Paths) {
626 if x != nil {
627 return "--system=" + x.dir.String(), x.deps
628 } else if forceEmpty {
629 return "--system=none", nil
630 } else {
631 return "", nil
632 }
633}
Colin Crossbf3119e2019-10-28 14:25:10 -0700634
635// Returns a --system argument in the form turbine expects with -source 1.9 and the list of files to
636// depend on. If forceEmpty is true, returns --bootclasspath "" if the list is empty to ensure turbine
637// does not fall back to the default bootclasspath.
638func (x *systemModules) FormTurbineSystemModulesPath(forceEmpty bool) (string, android.Paths) {
639 if x != nil {
640 return "--system " + x.dir.String(), x.deps
641 } else if forceEmpty {
642 return `--bootclasspath ""`, nil
643 } else {
644 return "", nil
645 }
646}