blob: 573c8778618eb2883516a9f7d1df35140d6f8312 [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 (
Colin Cross2fe66872015-03-30 17:20:39 -070022 "strings"
23
Colin Cross2fe66872015-03-30 17:20:39 -070024 "github.com/google/blueprint"
Colin Crossfee57cb2017-09-05 13:16:45 -070025
26 "android/soong/android"
27 "android/soong/java/config"
Colin Cross2fe66872015-03-30 17:20:39 -070028)
29
30var (
Colin Cross635c3b02016-05-18 15:37:25 -070031 pctx = android.NewPackageContext("android/soong/java")
Colin Cross2fe66872015-03-30 17:20:39 -070032
33 // Compiling java is not conducive to proper dependency tracking. The path-matches-class-name
34 // requirement leads to unpredictable generated source file names, and a single .java file
35 // will get compiled into multiple .class files if it contains inner classes. To work around
36 // this, all java rules write into separate directories and then a post-processing step lists
37 // the files in the the directory into a list file that later rules depend on (and sometimes
38 // read from directly using @<listfile>)
Yoshisato Yanagisawa572324a2017-06-05 17:41:50 +090039 javac = pctx.AndroidGomaStaticRule("javac",
Colin Cross2fe66872015-03-30 17:20:39 -070040 blueprint.RuleParams{
Colin Cross64162712017-08-08 13:17:59 -070041 Command: `rm -rf "$outDir" "$annoDir" && mkdir -p "$outDir" "$annoDir" && ` +
Colin Crossa4820652017-10-17 13:56:52 -070042 `${config.SoongJavacWrapper} ${config.JavacWrapper}${config.JavacCmd} ${config.JavacHeapFlags} ${config.CommonJdkFlags} ` +
Colin Cross59149b62017-10-16 18:07:29 -070043 `$javacFlags $sourcepath $bootClasspath $classpath ` +
Colin Cross64162712017-08-08 13:17:59 -070044 `-source $javaVersion -target $javaVersion ` +
Colin Crossb852a582017-08-10 17:58:12 -070045 `-d $outDir -s $annoDir @$out.rsp && ` +
Colin Cross0a6e0072017-08-30 14:24:55 -070046 `${config.SoongZipCmd} -jar -o $out -C $outDir -D $outDir`,
Colin Crossa4820652017-10-17 13:56:52 -070047 CommandDeps: []string{"${config.JavacCmd}", "${config.SoongZipCmd}"},
48 CommandOrderOnly: []string{"${config.SoongJavacWrapper}"},
49 Rspfile: "$out.rsp",
50 RspfileContent: "$in",
Colin Cross2fe66872015-03-30 17:20:39 -070051 },
Colin Cross59149b62017-10-16 18:07:29 -070052 "javacFlags", "sourcepath", "bootClasspath", "classpath", "outDir", "annoDir", "javaVersion")
Colin Cross2fe66872015-03-30 17:20:39 -070053
Colin Cross93e85952017-08-15 13:34:18 -070054 kotlinc = pctx.AndroidGomaStaticRule("kotlinc",
55 blueprint.RuleParams{
56 // TODO(ccross): kotlinc doesn't support @ file for arguments, which will limit the
57 // maximum number of input files, especially on darwin.
58 Command: `rm -rf "$outDir" && mkdir -p "$outDir" && ` +
59 `${config.KotlincCmd} $classpath $kotlincFlags ` +
60 `-jvm-target $javaVersion -d $outDir $in && ` +
61 `${config.SoongZipCmd} -jar -o $out -C $outDir -D $outDir`,
62 CommandDeps: []string{
63 "${config.KotlincCmd}",
64 "${config.KotlinCompilerJar}",
65 "${config.SoongZipCmd}",
66 },
67 },
68 "kotlincFlags", "classpath", "outDir", "javaVersion")
69
Colin Crossc6bbef32017-08-14 14:16:06 -070070 errorprone = pctx.AndroidStaticRule("errorprone",
71 blueprint.RuleParams{
72 Command: `rm -rf "$outDir" "$annoDir" && mkdir -p "$outDir" "$annoDir" && ` +
Colin Crossa4820652017-10-17 13:56:52 -070073 `${config.SoongJavacWrapper} ${config.ErrorProneCmd} ` +
Colin Cross59149b62017-10-16 18:07:29 -070074 `$javacFlags $sourcepath $bootClasspath $classpath ` +
Colin Crossc6bbef32017-08-14 14:16:06 -070075 `-source $javaVersion -target $javaVersion ` +
76 `-d $outDir -s $annoDir @$out.rsp && ` +
Colin Cross0a6e0072017-08-30 14:24:55 -070077 `${config.SoongZipCmd} -jar -o $out -C $outDir -D $outDir`,
Colin Crossc6bbef32017-08-14 14:16:06 -070078 CommandDeps: []string{
79 "${config.JavaCmd}",
80 "${config.ErrorProneJavacJar}",
81 "${config.ErrorProneJar}",
Colin Cross0a6e0072017-08-30 14:24:55 -070082 "${config.SoongZipCmd}",
Colin Crossc6bbef32017-08-14 14:16:06 -070083 },
Colin Crossa4820652017-10-17 13:56:52 -070084 CommandOrderOnly: []string{"${config.SoongJavacWrapper}"},
85 Rspfile: "$out.rsp",
86 RspfileContent: "$in",
Colin Crossc6bbef32017-08-14 14:16:06 -070087 },
Colin Cross59149b62017-10-16 18:07:29 -070088 "javacFlags", "sourcepath", "bootClasspath", "classpath", "outDir", "annoDir", "javaVersion")
Colin Crossc6bbef32017-08-14 14:16:06 -070089
Nan Zhanged19fc32017-10-19 13:06:22 -070090 turbine = pctx.AndroidStaticRule("turbine",
91 blueprint.RuleParams{
92 Command: `rm -rf "$outDir" && mkdir -p "$outDir" && ` +
93 `${config.JavaCmd} -jar ${config.TurbineJar} --output $out.tmp ` +
94 `--temp_dir "$outDir" --sources @$out.rsp $sourcepath ` +
95 `--javacopts ${config.CommonJdkFlags} ` +
96 `$javacFlags -source $javaVersion -target $javaVersion $bootClasspath $classpath && ` +
97 `${config.Ziptime} $out.tmp && ` +
98 `(if cmp -s $out.tmp $out ; then rm $out.tmp ; else mv $out.tmp $out ; fi )`,
99 CommandDeps: []string{"${config.TurbineJar}", "${config.JavaCmd}", "${config.Ziptime}"},
100 Rspfile: "$out.rsp",
101 RspfileContent: "$in",
102 Restat: true,
103 },
104 "javacFlags", "sourcepath", "bootClasspath", "classpath", "outDir", "javaVersion")
105
Colin Cross9d45bb72016-08-29 16:14:13 -0700106 jar = pctx.AndroidStaticRule("jar",
Colin Cross2fe66872015-03-30 17:20:39 -0700107 blueprint.RuleParams{
Colin Cross0a6e0072017-08-30 14:24:55 -0700108 Command: `${config.SoongZipCmd} -jar -o $out $jarArgs`,
109 CommandDeps: []string{"${config.SoongZipCmd}"},
Colin Cross2fe66872015-03-30 17:20:39 -0700110 },
Colin Cross0a6e0072017-08-30 14:24:55 -0700111 "jarArgs")
112
113 combineJar = pctx.AndroidStaticRule("combineJar",
114 blueprint.RuleParams{
Colin Cross635acc92017-09-12 22:50:46 -0700115 Command: `${config.MergeZipsCmd} -j $jarArgs $out $in`,
Colin Cross0a6e0072017-08-30 14:24:55 -0700116 CommandDeps: []string{"${config.MergeZipsCmd}"},
117 },
Colin Cross635acc92017-09-12 22:50:46 -0700118 "jarArgs")
Colin Cross2fe66872015-03-30 17:20:39 -0700119
Colin Cross6ade34f2017-09-15 13:00:47 -0700120 desugar = pctx.AndroidStaticRule("desugar",
121 blueprint.RuleParams{
122 Command: `rm -rf $dumpDir && mkdir -p $dumpDir && ` +
123 `${config.JavaCmd} ` +
124 `-Djdk.internal.lambda.dumpProxyClasses=$$(cd $dumpDir && pwd) ` +
125 `$javaFlags ` +
126 `-jar ${config.DesugarJar} $classpathFlags $desugarFlags ` +
127 `-i $in -o $out`,
Nan Zhanged19fc32017-10-19 13:06:22 -0700128 CommandDeps: []string{"${config.DesugarJar}", "${config.JavaCmd}"},
Colin Cross6ade34f2017-09-15 13:00:47 -0700129 },
130 "javaFlags", "classpathFlags", "desugarFlags", "dumpDir")
131
Colin Cross9d45bb72016-08-29 16:14:13 -0700132 dx = pctx.AndroidStaticRule("dx",
Colin Cross2fe66872015-03-30 17:20:39 -0700133 blueprint.RuleParams{
Colin Cross6d1e72d2015-04-10 17:44:24 -0700134 Command: `rm -rf "$outDir" && mkdir -p "$outDir" && ` +
Colin Cross6ade34f2017-09-15 13:00:47 -0700135 `${config.DxCmd} --dex --output=$outDir $dxFlags $in && ` +
Colin Cross7db5d632017-10-04 17:07:09 -0700136 `${config.SoongZipCmd} -o $outDir/classes.dex.jar -C $outDir -D $outDir && ` +
137 `${config.MergeZipsCmd} -D -stripFile "*.class" $out $outDir/classes.dex.jar $in`,
Colin Cross6ade34f2017-09-15 13:00:47 -0700138 CommandDeps: []string{
139 "${config.DxCmd}",
140 "${config.SoongZipCmd}",
Colin Cross7db5d632017-10-04 17:07:09 -0700141 "${config.MergeZipsCmd}",
Colin Cross6ade34f2017-09-15 13:00:47 -0700142 },
Colin Cross2fe66872015-03-30 17:20:39 -0700143 },
144 "outDir", "dxFlags")
Colin Crosse1d62a82015-04-03 16:53:05 -0700145
Colin Cross9d45bb72016-08-29 16:14:13 -0700146 jarjar = pctx.AndroidStaticRule("jarjar",
Colin Cross65bf4f22015-04-03 16:54:17 -0700147 blueprint.RuleParams{
Colin Cross64162712017-08-08 13:17:59 -0700148 Command: "${config.JavaCmd} -jar ${config.JarjarCmd} process $rulesFile $in $out",
149 CommandDeps: []string{"${config.JavaCmd}", "${config.JarjarCmd}", "$rulesFile"},
Colin Cross65bf4f22015-04-03 16:54:17 -0700150 },
151 "rulesFile")
Colin Cross2fe66872015-03-30 17:20:39 -0700152)
153
154func init() {
Colin Cross64162712017-08-08 13:17:59 -0700155 pctx.Import("android/soong/java/config")
Colin Cross2fe66872015-03-30 17:20:39 -0700156}
157
158type javaBuilderFlags struct {
159 javacFlags string
160 dxFlags string
Colin Cross6ade34f2017-09-15 13:00:47 -0700161 bootClasspath classpath
162 classpath classpath
Colin Cross1369cdb2017-09-29 17:58:17 -0700163 systemModules classpath
Colin Cross6ade34f2017-09-15 13:00:47 -0700164 desugarFlags string
Colin Crossc0b06f12015-04-08 13:03:43 -0700165 aidlFlags string
Colin Cross64162712017-08-08 13:17:59 -0700166 javaVersion string
Colin Cross6af17aa2017-09-20 12:59:05 -0700167
Colin Cross93e85952017-08-15 13:34:18 -0700168 kotlincFlags string
169 kotlincClasspath classpath
170
Colin Cross6af17aa2017-09-20 12:59:05 -0700171 protoFlags string
172 protoOutFlag string
Colin Cross2fe66872015-03-30 17:20:39 -0700173}
174
Colin Cross93e85952017-08-15 13:34:18 -0700175func TransformKotlinToClasses(ctx android.ModuleContext, outputFile android.WritablePath,
176 srcFiles android.Paths, srcJars classpath,
177 flags javaBuilderFlags) {
178
Colin Cross1ee23172017-10-18 14:44:18 -0700179 classDir := android.PathForModuleOut(ctx, "kotlinc", "classes")
Colin Cross93e85952017-08-15 13:34:18 -0700180
181 inputs := append(android.Paths(nil), srcFiles...)
182 inputs = append(inputs, srcJars...)
183
Colin Crossae887032017-10-23 17:16:14 -0700184 ctx.Build(pctx, android.BuildParams{
Colin Cross93e85952017-08-15 13:34:18 -0700185 Rule: kotlinc,
186 Description: "kotlinc",
187 Output: outputFile,
188 Inputs: inputs,
189 Args: map[string]string{
Nan Zhanged19fc32017-10-19 13:06:22 -0700190 "classpath": flags.kotlincClasspath.FormJavaClassPath("--classpath"),
Colin Cross93e85952017-08-15 13:34:18 -0700191 "kotlincFlags": flags.kotlincFlags,
192 "outDir": classDir.String(),
193 "javaVersion": flags.javaVersion,
194 },
195 })
196}
197
Colin Crosse9a275b2017-10-16 17:09:48 -0700198func TransformJavaToClasses(ctx android.ModuleContext, outputFile android.WritablePath,
Colin Cross59149b62017-10-16 18:07:29 -0700199 srcFiles android.Paths, srcJars classpath,
Colin Crosse9a275b2017-10-16 17:09:48 -0700200 flags javaBuilderFlags, deps android.Paths) {
Colin Cross2fe66872015-03-30 17:20:39 -0700201
Colin Cross59149b62017-10-16 18:07:29 -0700202 transformJavaToClasses(ctx, outputFile, srcFiles, srcJars, flags, deps,
Colin Cross1ee23172017-10-18 14:44:18 -0700203 "javac", "javac", javac)
Colin Cross2fe66872015-03-30 17:20:39 -0700204}
205
Colin Crosse9a275b2017-10-16 17:09:48 -0700206func RunErrorProne(ctx android.ModuleContext, outputFile android.WritablePath,
Nan Zhanged19fc32017-10-19 13:06:22 -0700207 srcFiles android.Paths, srcJars classpath, flags javaBuilderFlags) {
Colin Crossc6bbef32017-08-14 14:16:06 -0700208
Colin Crossfee57cb2017-09-05 13:16:45 -0700209 if config.ErrorProneJar == "" {
210 ctx.ModuleErrorf("cannot build with Error Prone, missing external/error_prone?")
Colin Crossfee57cb2017-09-05 13:16:45 -0700211 }
212
Colin Cross59149b62017-10-16 18:07:29 -0700213 transformJavaToClasses(ctx, outputFile, srcFiles, srcJars, flags, nil,
Colin Cross1ee23172017-10-18 14:44:18 -0700214 "errorprone", "errorprone", errorprone)
Colin Cross070879e2017-10-11 11:21:07 -0700215}
216
Nan Zhanged19fc32017-10-19 13:06:22 -0700217func TransformJavaToHeaderClasses(ctx android.ModuleContext, outputFile android.WritablePath,
218 srcFiles android.Paths, srcJars classpath, flags javaBuilderFlags) {
219
220 var deps android.Paths
221 deps = append(deps, srcJars...)
222 deps = append(deps, flags.bootClasspath...)
223 deps = append(deps, flags.classpath...)
224
225 var bootClasspath string
226 if len(flags.bootClasspath) == 0 && ctx.Device() {
227 // explicitly specify -bootclasspath "" if the bootclasspath is empty to
228 // ensure java does not fall back to the default bootclasspath.
229 bootClasspath = `--bootclasspath ""`
230 } else {
231 bootClasspath = flags.bootClasspath.FormJavaClassPath("--bootclasspath")
232 }
233 var sourcepath string
234 if len(srcJars) > 0 {
235 sourcepath = "--sourcepath_jars" + " " + strings.Join(srcJars.Strings(), " ")
236 } else {
237 sourcepath = ""
238 }
Colin Crossae887032017-10-23 17:16:14 -0700239 ctx.Build(pctx, android.BuildParams{
Nan Zhanged19fc32017-10-19 13:06:22 -0700240 Rule: turbine,
241 Description: "turbine",
242 Output: outputFile,
243 Inputs: srcFiles,
244 Implicits: deps,
245 Args: map[string]string{
246 "javacFlags": flags.javacFlags,
247 "bootClasspath": bootClasspath,
248 "sourcepath": sourcepath,
249 "classpath": flags.classpath.FormJavaClassPath("--classpath"),
250 "outDir": android.PathForModuleOut(ctx, "turbine", "classes").String(),
251 "javaVersion": flags.javaVersion,
252 },
253 })
254}
255
Colin Cross070879e2017-10-11 11:21:07 -0700256// transformJavaToClasses takes source files and converts them to a jar containing .class files.
Colin Cross59149b62017-10-16 18:07:29 -0700257// srcFiles is a list of paths to sources, srcJars is a list of paths to jar files that contain
258// sources. flags contains various command line flags to be passed to the compiler.
Colin Cross070879e2017-10-11 11:21:07 -0700259//
260// This method may be used for different compilers, including javac and Error Prone. The rule
261// argument specifies which command line to use and desc sets the description of the rule that will
262// be printed at build time. The stem argument provides the file name of the output jar, and
263// suffix will be appended to various intermediate files and directories to avoid collisions when
264// this function is called twice in the same module directory.
Colin Crosse9a275b2017-10-16 17:09:48 -0700265func transformJavaToClasses(ctx android.ModuleContext, outputFile android.WritablePath,
Colin Cross59149b62017-10-16 18:07:29 -0700266 srcFiles android.Paths, srcJars classpath,
Colin Crosse9a275b2017-10-16 17:09:48 -0700267 flags javaBuilderFlags, deps android.Paths,
Colin Cross1ee23172017-10-18 14:44:18 -0700268 intermediatesDir, desc string, rule blueprint.Rule) {
Colin Crossc6bbef32017-08-14 14:16:06 -0700269
Colin Cross59149b62017-10-16 18:07:29 -0700270 deps = append(deps, srcJars...)
Colin Cross1369cdb2017-09-29 17:58:17 -0700271
272 var bootClasspath string
273 if flags.javaVersion == "1.9" {
274 deps = append(deps, flags.systemModules...)
Nan Zhanged19fc32017-10-19 13:06:22 -0700275 bootClasspath = flags.systemModules.FormJavaSystemModulesPath("--system=", ctx.Device())
Colin Cross1369cdb2017-09-29 17:58:17 -0700276 } else {
277 deps = append(deps, flags.bootClasspath...)
Nan Zhanged19fc32017-10-19 13:06:22 -0700278 if len(flags.bootClasspath) == 0 && ctx.Device() {
279 // explicitly specify -bootclasspath "" if the bootclasspath is empty to
280 // ensure java does not fall back to the default bootclasspath.
281 bootClasspath = `-bootclasspath ""`
282 } else {
283 bootClasspath = flags.bootClasspath.FormJavaClassPath("-bootclasspath")
284 }
Colin Cross1369cdb2017-09-29 17:58:17 -0700285 }
286
Colin Cross6ade34f2017-09-15 13:00:47 -0700287 deps = append(deps, flags.classpath...)
Colin Crossc6bbef32017-08-14 14:16:06 -0700288
Colin Crossae887032017-10-23 17:16:14 -0700289 ctx.Build(pctx, android.BuildParams{
Colin Cross070879e2017-10-11 11:21:07 -0700290 Rule: rule,
291 Description: desc,
292 Output: outputFile,
Colin Crossc6bbef32017-08-14 14:16:06 -0700293 Inputs: srcFiles,
294 Implicits: deps,
295 Args: map[string]string{
Colin Cross59149b62017-10-16 18:07:29 -0700296 "javacFlags": flags.javacFlags,
Colin Cross1369cdb2017-09-29 17:58:17 -0700297 "bootClasspath": bootClasspath,
Nan Zhanged19fc32017-10-19 13:06:22 -0700298 // Returns a -sourcepath argument in the form javac expects. If the list is empty returns
299 // -sourcepath "" to ensure javac does not fall back to searching the classpath for sources.
300 "sourcepath": srcJars.FormJavaClassPath("-sourcepath"),
301 "classpath": flags.classpath.FormJavaClassPath("-classpath"),
302 "outDir": android.PathForModuleOut(ctx, intermediatesDir, "classes").String(),
303 "annoDir": android.PathForModuleOut(ctx, intermediatesDir, "anno").String(),
304 "javaVersion": flags.javaVersion,
Colin Crossc6bbef32017-08-14 14:16:06 -0700305 },
306 })
Colin Crossc6bbef32017-08-14 14:16:06 -0700307}
308
Colin Crosse9a275b2017-10-16 17:09:48 -0700309func TransformResourcesToJar(ctx android.ModuleContext, outputFile android.WritablePath,
310 jarArgs []string, deps android.Paths) {
Colin Cross2fe66872015-03-30 17:20:39 -0700311
Colin Crossae887032017-10-23 17:16:14 -0700312 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700313 Rule: jar,
314 Description: "jar",
315 Output: outputFile,
316 Implicits: deps,
Colin Cross2fe66872015-03-30 17:20:39 -0700317 Args: map[string]string{
Colin Cross0a6e0072017-08-30 14:24:55 -0700318 "jarArgs": strings.Join(jarArgs, " "),
Colin Cross2fe66872015-03-30 17:20:39 -0700319 },
320 })
Colin Cross2fe66872015-03-30 17:20:39 -0700321}
322
Nan Zhanged19fc32017-10-19 13:06:22 -0700323func TransformJarsToJar(ctx android.ModuleContext, outputFile android.WritablePath, desc string,
324 jars android.Paths, manifest android.OptionalPath, stripDirs bool, dirsToStrip []string) {
Colin Cross0a6e0072017-08-30 14:24:55 -0700325
Colin Cross635acc92017-09-12 22:50:46 -0700326 var deps android.Paths
327
328 var jarArgs []string
329 if manifest.Valid() {
Nan Zhanged19fc32017-10-19 13:06:22 -0700330 jarArgs = append(jarArgs, "-m ", manifest.String())
Colin Cross635acc92017-09-12 22:50:46 -0700331 deps = append(deps, manifest.Path())
332 }
333
Nan Zhanged19fc32017-10-19 13:06:22 -0700334 if dirsToStrip != nil {
335 for _, dir := range dirsToStrip {
336 jarArgs = append(jarArgs, "-stripDir ", dir)
337 }
338 }
339
Colin Cross635acc92017-09-12 22:50:46 -0700340 if stripDirs {
341 jarArgs = append(jarArgs, "-D")
342 }
343
Colin Crossae887032017-10-23 17:16:14 -0700344 ctx.Build(pctx, android.BuildParams{
Colin Cross0a6e0072017-08-30 14:24:55 -0700345 Rule: combineJar,
Nan Zhanged19fc32017-10-19 13:06:22 -0700346 Description: desc,
Colin Cross0a6e0072017-08-30 14:24:55 -0700347 Output: outputFile,
348 Inputs: jars,
Colin Cross635acc92017-09-12 22:50:46 -0700349 Implicits: deps,
350 Args: map[string]string{
351 "jarArgs": strings.Join(jarArgs, " "),
352 },
Colin Cross0a6e0072017-08-30 14:24:55 -0700353 })
Colin Cross0a6e0072017-08-30 14:24:55 -0700354}
355
Colin Crosse9a275b2017-10-16 17:09:48 -0700356func TransformDesugar(ctx android.ModuleContext, outputFile android.WritablePath,
357 classesJar android.Path, flags javaBuilderFlags) {
Colin Cross6ade34f2017-09-15 13:00:47 -0700358
Colin Cross1ee23172017-10-18 14:44:18 -0700359 dumpDir := android.PathForModuleOut(ctx, "desugar", "classes")
Colin Cross6ade34f2017-09-15 13:00:47 -0700360
361 javaFlags := ""
Colin Cross1369cdb2017-09-29 17:58:17 -0700362 if ctx.AConfig().UseOpenJDK9() {
Colin Cross6ade34f2017-09-15 13:00:47 -0700363 javaFlags = "--add-opens java.base/java.lang.invoke=ALL-UNNAMED"
364 }
365
366 var desugarFlags []string
Nan Zhanged19fc32017-10-19 13:06:22 -0700367 desugarFlags = append(desugarFlags, flags.bootClasspath.FormDesugarClasspath("--bootclasspath_entry")...)
368 desugarFlags = append(desugarFlags, flags.classpath.FormDesugarClasspath("--classpath_entry")...)
Colin Cross6ade34f2017-09-15 13:00:47 -0700369
370 var deps android.Paths
371 deps = append(deps, flags.bootClasspath...)
372 deps = append(deps, flags.classpath...)
373
Colin Crossae887032017-10-23 17:16:14 -0700374 ctx.Build(pctx, android.BuildParams{
Colin Cross6ade34f2017-09-15 13:00:47 -0700375 Rule: desugar,
376 Description: "desugar",
377 Output: outputFile,
378 Input: classesJar,
379 Implicits: deps,
380 Args: map[string]string{
381 "dumpDir": dumpDir.String(),
382 "javaFlags": javaFlags,
383 "classpathFlags": strings.Join(desugarFlags, " "),
384 "desugarFlags": flags.desugarFlags,
385 },
386 })
Colin Cross6ade34f2017-09-15 13:00:47 -0700387}
388
Colin Cross7db5d632017-10-04 17:07:09 -0700389// Converts a classes.jar file to classes*.dex, then combines the dex files with any resources
390// in the classes.jar file into a dex jar.
Colin Crosse9a275b2017-10-16 17:09:48 -0700391func TransformClassesJarToDexJar(ctx android.ModuleContext, outputFile android.WritablePath,
392 classesJar android.Path, flags javaBuilderFlags) {
Colin Cross2fe66872015-03-30 17:20:39 -0700393
Colin Cross635c3b02016-05-18 15:37:25 -0700394 outDir := android.PathForModuleOut(ctx, "dex")
Colin Cross2fe66872015-03-30 17:20:39 -0700395
Colin Crossae887032017-10-23 17:16:14 -0700396 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700397 Rule: dx,
398 Description: "dx",
399 Output: outputFile,
400 Input: classesJar,
Colin Cross2fe66872015-03-30 17:20:39 -0700401 Args: map[string]string{
402 "dxFlags": flags.dxFlags,
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700403 "outDir": outDir.String(),
Colin Cross2fe66872015-03-30 17:20:39 -0700404 },
405 })
Colin Cross2fe66872015-03-30 17:20:39 -0700406}
Colin Crosse1d62a82015-04-03 16:53:05 -0700407
Colin Crosse9a275b2017-10-16 17:09:48 -0700408func TransformJarJar(ctx android.ModuleContext, outputFile android.WritablePath,
409 classesJar android.Path, rulesFile android.Path) {
Colin Crossae887032017-10-23 17:16:14 -0700410 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700411 Rule: jarjar,
412 Description: "jarjar",
413 Output: outputFile,
414 Input: classesJar,
415 Implicit: rulesFile,
Colin Cross65bf4f22015-04-03 16:54:17 -0700416 Args: map[string]string{
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700417 "rulesFile": rulesFile.String(),
Colin Cross65bf4f22015-04-03 16:54:17 -0700418 },
419 })
Colin Cross65bf4f22015-04-03 16:54:17 -0700420}
Colin Cross6ade34f2017-09-15 13:00:47 -0700421
422type classpath []android.Path
423
Nan Zhanged19fc32017-10-19 13:06:22 -0700424func (x *classpath) FormJavaClassPath(optName string) string {
Colin Cross59149b62017-10-16 18:07:29 -0700425 if len(*x) > 0 {
Nan Zhanged19fc32017-10-19 13:06:22 -0700426 return optName + " " + strings.Join(x.Strings(), ":")
Colin Cross6ade34f2017-09-15 13:00:47 -0700427 } else {
428 return ""
429 }
430}
431
Colin Cross1369cdb2017-09-29 17:58:17 -0700432// Returns a --system argument in the form javac expects with -source 1.9. If forceEmpty is true,
433// returns --system=none if the list is empty to ensure javac does not fall back to the default
434// system modules.
Nan Zhanged19fc32017-10-19 13:06:22 -0700435func (x *classpath) FormJavaSystemModulesPath(optName string, forceEmpty bool) string {
Colin Cross1369cdb2017-09-29 17:58:17 -0700436 if len(*x) > 1 {
437 panic("more than one system module")
438 } else if len(*x) == 1 {
Nan Zhanged19fc32017-10-19 13:06:22 -0700439 return optName + strings.TrimSuffix((*x)[0].String(), "lib/modules")
Colin Cross1369cdb2017-09-29 17:58:17 -0700440 } else if forceEmpty {
Nan Zhanged19fc32017-10-19 13:06:22 -0700441 return optName + "none"
Colin Cross1369cdb2017-09-29 17:58:17 -0700442 } else {
443 return ""
444 }
445}
446
Nan Zhanged19fc32017-10-19 13:06:22 -0700447func (x *classpath) FormDesugarClasspath(optName string) []string {
Colin Cross6ade34f2017-09-15 13:00:47 -0700448 if x == nil || *x == nil {
449 return nil
450 }
451 flags := make([]string, len(*x))
452 for i, v := range *x {
Nan Zhanged19fc32017-10-19 13:06:22 -0700453 flags[i] = optName + " " + v.String()
Colin Cross6ade34f2017-09-15 13:00:47 -0700454 }
455
456 return flags
457}
458
459// Append an android.Paths to the end of the classpath list
460func (x *classpath) AddPaths(paths android.Paths) {
461 for _, path := range paths {
462 *x = append(*x, path)
463 }
464}
465
466// Convert a classpath to an android.Paths
467func (x *classpath) Paths() android.Paths {
468 return append(android.Paths(nil), (*x)...)
469}
470
471func (x *classpath) Strings() []string {
472 if x == nil {
473 return nil
474 }
475 ret := make([]string, len(*x))
476 for i, path := range *x {
477 ret[i] = path.String()
478 }
479 return ret
480}