blob: 2c2ecf53c582e3fd4b672a6923e6f33d8bee89ca [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"
Colin Cross2fe66872015-03-30 17:20:39 -070030)
31
32var (
Colin Cross635c3b02016-05-18 15:37:25 -070033 pctx = android.NewPackageContext("android/soong/java")
Colin Cross2fe66872015-03-30 17:20:39 -070034
35 // Compiling java is not conducive to proper dependency tracking. The path-matches-class-name
36 // requirement leads to unpredictable generated source file names, and a single .java file
37 // will get compiled into multiple .class files if it contains inner classes. To work around
Colin Crossf7eac7a2018-02-08 12:48:39 -080038 // this, all java rules write into separate directories and then are combined into a .jar file
39 // (if the rule produces .class files) or a .srcjar file (if the rule produces .java files).
40 // .srcjar files are unzipped into a temporary directory when compiled with javac.
Yoshisato Yanagisawa572324a2017-06-05 17:41:50 +090041 javac = pctx.AndroidGomaStaticRule("javac",
Colin Cross2fe66872015-03-30 17:20:39 -070042 blueprint.RuleParams{
Colin Cross8eadbf02017-10-24 17:46:00 -070043 Command: `rm -rf "$outDir" "$annoDir" "$srcJarDir" && mkdir -p "$outDir" "$annoDir" "$srcJarDir" && ` +
Colin Cross436b7652018-03-15 16:24:10 -070044 `${config.ZipSyncCmd} -d $srcJarDir -l $srcJarDir/list -f "*.java" $srcJars && ` +
Sundong Ahn24a099c2018-06-28 14:53:20 +090045 `(if [ -s $srcJarDir/list ] || [ -s $out.rsp ] ; then ` +
Sasha Smundak26c6d9e2019-06-11 13:30:13 -070046 `${config.SoongJavacWrapper} ${config.JavacWrapper}${config.JavacCmd} ` +
47 `${config.JavacHeapFlags} ${config.JavacVmFlags} ${config.CommonJdkFlags} ` +
Colin Crossbe9cdb82019-01-21 21:37:16 -080048 `$processorpath $processor $javacFlags $bootClasspath $classpath ` +
Colin Cross64162712017-08-08 13:17:59 -070049 `-source $javaVersion -target $javaVersion ` +
Sundong Ahn24a099c2018-06-28 14:53:20 +090050 `-d $outDir -s $annoDir @$out.rsp @$srcJarDir/list ; fi ) && ` +
Colin Cross44c29a82019-01-24 16:36:57 -080051 `${config.SoongZipCmd} -jar -o $out -C $outDir -D $outDir && ` +
52 `rm -rf "$srcJarDir"`,
Colin Cross8eadbf02017-10-24 17:46:00 -070053 CommandDeps: []string{
54 "${config.JavacCmd}",
55 "${config.SoongZipCmd}",
Colin Cross436b7652018-03-15 16:24:10 -070056 "${config.ZipSyncCmd}",
Colin Cross8eadbf02017-10-24 17:46:00 -070057 },
Colin Crossa4820652017-10-17 13:56:52 -070058 CommandOrderOnly: []string{"${config.SoongJavacWrapper}"},
59 Rspfile: "$out.rsp",
60 RspfileContent: "$in",
Colin Cross2fe66872015-03-30 17:20:39 -070061 },
Colin Crossbe9cdb82019-01-21 21:37:16 -080062 "javacFlags", "bootClasspath", "classpath", "processorpath", "processor", "srcJars", "srcJarDir",
Colin Cross8eadbf02017-10-24 17:46:00 -070063 "outDir", "annoDir", "javaVersion")
Colin Cross2fe66872015-03-30 17:20:39 -070064
Nan Zhanged19fc32017-10-19 13:06:22 -070065 turbine = pctx.AndroidStaticRule("turbine",
66 blueprint.RuleParams{
Colin Cross6981f652018-03-07 15:14:50 -080067 Command: `rm -rf "$outDir" && mkdir -p "$outDir" && ` +
Sasha Smundak26c6d9e2019-06-11 13:30:13 -070068 `${config.JavaCmd} ${config.JavaVmFlags} -jar ${config.TurbineJar} --output $out.tmp ` +
Colin Cross6981f652018-03-07 15:14:50 -080069 `--temp_dir "$outDir" --sources @$out.rsp --source_jars $srcJars ` +
Nan Zhanged19fc32017-10-19 13:06:22 -070070 `--javacopts ${config.CommonJdkFlags} ` +
Colin Cross924a0aa2018-03-07 10:51:05 -080071 `$javacFlags -source $javaVersion -target $javaVersion -- $bootClasspath $classpath && ` +
Nan Zhanged19fc32017-10-19 13:06:22 -070072 `${config.Ziptime} $out.tmp && ` +
73 `(if cmp -s $out.tmp $out ; then rm $out.tmp ; else mv $out.tmp $out ; fi )`,
Colin Cross8eadbf02017-10-24 17:46:00 -070074 CommandDeps: []string{
75 "${config.TurbineJar}",
76 "${config.JavaCmd}",
77 "${config.Ziptime}",
Colin Cross8eadbf02017-10-24 17:46:00 -070078 },
Nan Zhanged19fc32017-10-19 13:06:22 -070079 Rspfile: "$out.rsp",
80 RspfileContent: "$in",
81 Restat: true,
82 },
Colin Cross6981f652018-03-07 15:14:50 -080083 "javacFlags", "bootClasspath", "classpath", "srcJars", "outDir", "javaVersion")
Nan Zhanged19fc32017-10-19 13:06:22 -070084
Colin Cross9d45bb72016-08-29 16:14:13 -070085 jar = pctx.AndroidStaticRule("jar",
Colin Cross2fe66872015-03-30 17:20:39 -070086 blueprint.RuleParams{
Nan Zhang674dd932018-01-26 18:30:36 -080087 Command: `${config.SoongZipCmd} -jar -o $out @$out.rsp`,
88 CommandDeps: []string{"${config.SoongZipCmd}"},
89 Rspfile: "$out.rsp",
90 RspfileContent: "$jarArgs",
Colin Cross2fe66872015-03-30 17:20:39 -070091 },
Colin Cross0a6e0072017-08-30 14:24:55 -070092 "jarArgs")
93
Colin Crossa4f08812018-10-02 22:03:40 -070094 zip = pctx.AndroidStaticRule("zip",
95 blueprint.RuleParams{
96 Command: `${config.SoongZipCmd} -o $out @$out.rsp`,
97 CommandDeps: []string{"${config.SoongZipCmd}"},
98 Rspfile: "$out.rsp",
99 RspfileContent: "$jarArgs",
100 },
101 "jarArgs")
102
Colin Cross0a6e0072017-08-30 14:24:55 -0700103 combineJar = pctx.AndroidStaticRule("combineJar",
104 blueprint.RuleParams{
Colin Crossf91a08c2018-02-07 15:41:31 -0800105 Command: `${config.MergeZipsCmd} --ignore-duplicates -j $jarArgs $out $in`,
Colin Cross0a6e0072017-08-30 14:24:55 -0700106 CommandDeps: []string{"${config.MergeZipsCmd}"},
107 },
Colin Cross635acc92017-09-12 22:50:46 -0700108 "jarArgs")
Colin Cross2fe66872015-03-30 17:20:39 -0700109
Colin Cross9d45bb72016-08-29 16:14:13 -0700110 jarjar = pctx.AndroidStaticRule("jarjar",
Colin Cross65bf4f22015-04-03 16:54:17 -0700111 blueprint.RuleParams{
Sasha Smundak26c6d9e2019-06-11 13:30:13 -0700112 Command: "${config.JavaCmd} ${config.JavaVmFlags} -jar ${config.JarjarCmd} process $rulesFile $in $out",
Colin Cross64162712017-08-08 13:17:59 -0700113 CommandDeps: []string{"${config.JavaCmd}", "${config.JarjarCmd}", "$rulesFile"},
Colin Cross65bf4f22015-04-03 16:54:17 -0700114 },
115 "rulesFile")
Nan Zhang4c819fb2018-08-27 18:31:46 -0700116
Vladimir Marko0975ee02019-04-02 10:29:55 +0100117 packageCheck = pctx.AndroidStaticRule("packageCheck",
118 blueprint.RuleParams{
119 Command: "rm -f $out && " +
120 "${config.PackageCheckCmd} $in $packages && " +
121 "touch $out",
122 CommandDeps: []string{"${config.PackageCheckCmd}"},
123 },
124 "packages")
125
Nan Zhang4c819fb2018-08-27 18:31:46 -0700126 jetifier = pctx.AndroidStaticRule("jetifier",
127 blueprint.RuleParams{
Sasha Smundak26c6d9e2019-06-11 13:30:13 -0700128 Command: "${config.JavaCmd} ${config.JavaVmFlags} -jar ${config.JetifierJar} -l error -o $out -i $in",
Nan Zhang4c819fb2018-08-27 18:31:46 -0700129 CommandDeps: []string{"${config.JavaCmd}", "${config.JetifierJar}"},
130 },
131 )
Colin Cross43f08db2018-11-12 10:13:39 -0800132
133 zipalign = pctx.AndroidStaticRule("zipalign",
134 blueprint.RuleParams{
Colin Crosse4246ab2019-02-05 21:55:21 -0800135 Command: "if ! ${config.ZipAlign} -c -p 4 $in > /dev/null; then " +
136 "${config.ZipAlign} -f -p 4 $in $out; " +
Colin Cross43f08db2018-11-12 10:13:39 -0800137 "else " +
138 "cp -f $in $out; " +
139 "fi",
140 CommandDeps: []string{"${config.ZipAlign}"},
141 },
142 )
Colin Cross2fe66872015-03-30 17:20:39 -0700143)
144
145func init() {
Colin Crosscc0ce802019-04-02 16:14:11 -0700146 pctx.Import("android/soong/android")
Colin Cross64162712017-08-08 13:17:59 -0700147 pctx.Import("android/soong/java/config")
Colin Cross2fe66872015-03-30 17:20:39 -0700148}
149
150type javaBuilderFlags struct {
Dan Willemsenff60a732019-06-13 16:52:01 +0000151 javacFlags string
152 bootClasspath classpath
153 classpath classpath
154 processorPath classpath
155 processor string
156 systemModules classpath
157 systemModulesDeps android.Paths
158 aidlFlags string
159 aidlDeps android.Paths
160 javaVersion string
Colin Cross6af17aa2017-09-20 12:59:05 -0700161
Andreas Gampef3e5b552018-01-22 21:27:21 -0800162 errorProneExtraJavacFlags string
Colin Cross66548102018-06-19 22:47:35 -0700163 errorProneProcessorPath classpath
Andreas Gampef3e5b552018-01-22 21:27:21 -0800164
Colin Cross93e85952017-08-15 13:34:18 -0700165 kotlincFlags string
166 kotlincClasspath classpath
167
Colin Cross19878da2019-03-28 14:45:07 -0700168 proto android.ProtoFlags
Colin Cross2fe66872015-03-30 17:20:39 -0700169}
170
Nan Zhang61eaedb2017-11-02 13:28:15 -0700171func TransformJavaToClasses(ctx android.ModuleContext, outputFile android.WritablePath, shardIdx int,
172 srcFiles, srcJars android.Paths, flags javaBuilderFlags, deps android.Paths) {
Colin Cross2fe66872015-03-30 17:20:39 -0700173
Nan Zhang61eaedb2017-11-02 13:28:15 -0700174 // Compile java sources into .class files
175 desc := "javac"
176 if shardIdx >= 0 {
177 desc += strconv.Itoa(shardIdx)
178 }
179
Colin Cross66548102018-06-19 22:47:35 -0700180 transformJavaToClasses(ctx, outputFile, shardIdx, srcFiles, srcJars, flags, deps, "javac", desc)
Colin Cross2fe66872015-03-30 17:20:39 -0700181}
182
Colin Crosse9a275b2017-10-16 17:09:48 -0700183func RunErrorProne(ctx android.ModuleContext, outputFile android.WritablePath,
Colin Cross8eadbf02017-10-24 17:46:00 -0700184 srcFiles, srcJars android.Paths, flags javaBuilderFlags) {
Colin Crossc6bbef32017-08-14 14:16:06 -0700185
Colin Cross66548102018-06-19 22:47:35 -0700186 flags.processorPath = append(flags.errorProneProcessorPath, flags.processorPath...)
Colin Crossfee57cb2017-09-05 13:16:45 -0700187
Andreas Gampef3e5b552018-01-22 21:27:21 -0800188 if len(flags.errorProneExtraJavacFlags) > 0 {
189 if len(flags.javacFlags) > 0 {
Colin Cross66548102018-06-19 22:47:35 -0700190 flags.javacFlags += " " + flags.errorProneExtraJavacFlags
Andreas Gampef3e5b552018-01-22 21:27:21 -0800191 } else {
192 flags.javacFlags = flags.errorProneExtraJavacFlags
193 }
194 }
195
Nan Zhang61eaedb2017-11-02 13:28:15 -0700196 transformJavaToClasses(ctx, outputFile, -1, srcFiles, srcJars, flags, nil,
Colin Cross66548102018-06-19 22:47:35 -0700197 "errorprone", "errorprone")
Colin Cross070879e2017-10-11 11:21:07 -0700198}
199
Nan Zhanged19fc32017-10-19 13:06:22 -0700200func TransformJavaToHeaderClasses(ctx android.ModuleContext, outputFile android.WritablePath,
Colin Cross8eadbf02017-10-24 17:46:00 -0700201 srcFiles, srcJars android.Paths, flags javaBuilderFlags) {
Nan Zhanged19fc32017-10-19 13:06:22 -0700202
203 var deps android.Paths
204 deps = append(deps, srcJars...)
205 deps = append(deps, flags.bootClasspath...)
206 deps = append(deps, flags.classpath...)
207
208 var bootClasspath string
209 if len(flags.bootClasspath) == 0 && ctx.Device() {
210 // explicitly specify -bootclasspath "" if the bootclasspath is empty to
211 // ensure java does not fall back to the default bootclasspath.
212 bootClasspath = `--bootclasspath ""`
213 } else {
Colin Crossafbb1732019-01-17 15:42:52 -0800214 bootClasspath = strings.Join(flags.bootClasspath.FormTurbineClasspath("--bootclasspath "), " ")
Nan Zhanged19fc32017-10-19 13:06:22 -0700215 }
Colin Cross8eadbf02017-10-24 17:46:00 -0700216
Colin Crossae887032017-10-23 17:16:14 -0700217 ctx.Build(pctx, android.BuildParams{
Nan Zhanged19fc32017-10-19 13:06:22 -0700218 Rule: turbine,
219 Description: "turbine",
220 Output: outputFile,
221 Inputs: srcFiles,
222 Implicits: deps,
223 Args: map[string]string{
224 "javacFlags": flags.javacFlags,
225 "bootClasspath": bootClasspath,
Colin Cross8eadbf02017-10-24 17:46:00 -0700226 "srcJars": strings.Join(srcJars.Strings(), " "),
Colin Crossafbb1732019-01-17 15:42:52 -0800227 "classpath": strings.Join(flags.classpath.FormTurbineClasspath("--classpath "), " "),
Nan Zhanged19fc32017-10-19 13:06:22 -0700228 "outDir": android.PathForModuleOut(ctx, "turbine", "classes").String(),
229 "javaVersion": flags.javaVersion,
230 },
231 })
232}
233
Colin Cross070879e2017-10-11 11:21:07 -0700234// transformJavaToClasses takes source files and converts them to a jar containing .class files.
Colin Cross59149b62017-10-16 18:07:29 -0700235// srcFiles is a list of paths to sources, srcJars is a list of paths to jar files that contain
236// sources. flags contains various command line flags to be passed to the compiler.
Colin Cross070879e2017-10-11 11:21:07 -0700237//
238// This method may be used for different compilers, including javac and Error Prone. The rule
239// argument specifies which command line to use and desc sets the description of the rule that will
240// be printed at build time. The stem argument provides the file name of the output jar, and
241// suffix will be appended to various intermediate files and directories to avoid collisions when
242// this function is called twice in the same module directory.
Colin Crosse9a275b2017-10-16 17:09:48 -0700243func transformJavaToClasses(ctx android.ModuleContext, outputFile android.WritablePath,
Nan Zhang61eaedb2017-11-02 13:28:15 -0700244 shardIdx int, srcFiles, srcJars android.Paths,
Colin Crosse9a275b2017-10-16 17:09:48 -0700245 flags javaBuilderFlags, deps android.Paths,
Colin Cross66548102018-06-19 22:47:35 -0700246 intermediatesDir, desc string) {
Colin Crossc6bbef32017-08-14 14:16:06 -0700247
Colin Cross59149b62017-10-16 18:07:29 -0700248 deps = append(deps, srcJars...)
Colin Cross1369cdb2017-09-29 17:58:17 -0700249
250 var bootClasspath string
251 if flags.javaVersion == "1.9" {
Dan Willemsenff60a732019-06-13 16:52:01 +0000252 deps = append(deps, flags.systemModulesDeps...)
Nan Zhanged19fc32017-10-19 13:06:22 -0700253 bootClasspath = flags.systemModules.FormJavaSystemModulesPath("--system=", ctx.Device())
Colin Cross1369cdb2017-09-29 17:58:17 -0700254 } else {
255 deps = append(deps, flags.bootClasspath...)
Nan Zhanged19fc32017-10-19 13:06:22 -0700256 if len(flags.bootClasspath) == 0 && ctx.Device() {
257 // explicitly specify -bootclasspath "" if the bootclasspath is empty to
258 // ensure java does not fall back to the default bootclasspath.
259 bootClasspath = `-bootclasspath ""`
260 } else {
261 bootClasspath = flags.bootClasspath.FormJavaClassPath("-bootclasspath")
262 }
Colin Cross1369cdb2017-09-29 17:58:17 -0700263 }
264
Colin Cross6ade34f2017-09-15 13:00:47 -0700265 deps = append(deps, flags.classpath...)
Colin Cross6a77c982018-06-19 22:43:34 -0700266 deps = append(deps, flags.processorPath...)
Colin Crossc6bbef32017-08-14 14:16:06 -0700267
Colin Cross7788c122019-01-23 16:14:02 -0800268 processor := "-proc:none"
Colin Crossbe9cdb82019-01-21 21:37:16 -0800269 if flags.processor != "" {
270 processor = "-processor " + flags.processor
271 }
272
Nan Zhang61eaedb2017-11-02 13:28:15 -0700273 srcJarDir := "srcjars"
274 outDir := "classes"
275 annoDir := "anno"
276 if shardIdx >= 0 {
277 shardDir := "shard" + strconv.Itoa(shardIdx)
278 srcJarDir = filepath.Join(shardDir, srcJarDir)
279 outDir = filepath.Join(shardDir, outDir)
280 annoDir = filepath.Join(shardDir, annoDir)
281 }
Colin Crossae887032017-10-23 17:16:14 -0700282 ctx.Build(pctx, android.BuildParams{
Colin Cross66548102018-06-19 22:47:35 -0700283 Rule: javac,
Colin Cross070879e2017-10-11 11:21:07 -0700284 Description: desc,
285 Output: outputFile,
Colin Crossc6bbef32017-08-14 14:16:06 -0700286 Inputs: srcFiles,
287 Implicits: deps,
288 Args: map[string]string{
Colin Cross59149b62017-10-16 18:07:29 -0700289 "javacFlags": flags.javacFlags,
Colin Cross1369cdb2017-09-29 17:58:17 -0700290 "bootClasspath": bootClasspath,
Colin Cross8eadbf02017-10-24 17:46:00 -0700291 "classpath": flags.classpath.FormJavaClassPath("-classpath"),
Colin Cross6a77c982018-06-19 22:43:34 -0700292 "processorpath": flags.processorPath.FormJavaClassPath("-processorpath"),
Colin Crossbe9cdb82019-01-21 21:37:16 -0800293 "processor": processor,
Colin Cross8eadbf02017-10-24 17:46:00 -0700294 "srcJars": strings.Join(srcJars.Strings(), " "),
Nan Zhang61eaedb2017-11-02 13:28:15 -0700295 "srcJarDir": android.PathForModuleOut(ctx, intermediatesDir, srcJarDir).String(),
296 "outDir": android.PathForModuleOut(ctx, intermediatesDir, outDir).String(),
297 "annoDir": android.PathForModuleOut(ctx, intermediatesDir, annoDir).String(),
Colin Cross8eadbf02017-10-24 17:46:00 -0700298 "javaVersion": flags.javaVersion,
Colin Crossc6bbef32017-08-14 14:16:06 -0700299 },
300 })
Colin Crossc6bbef32017-08-14 14:16:06 -0700301}
302
Colin Crosse9a275b2017-10-16 17:09:48 -0700303func TransformResourcesToJar(ctx android.ModuleContext, outputFile android.WritablePath,
304 jarArgs []string, deps android.Paths) {
Colin Cross2fe66872015-03-30 17:20:39 -0700305
Colin Crossae887032017-10-23 17:16:14 -0700306 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700307 Rule: jar,
308 Description: "jar",
309 Output: outputFile,
310 Implicits: deps,
Colin Cross2fe66872015-03-30 17:20:39 -0700311 Args: map[string]string{
Colin Cross0b9f31f2019-02-28 11:00:01 -0800312 "jarArgs": strings.Join(proptools.NinjaAndShellEscapeList(jarArgs), " "),
Colin Cross2fe66872015-03-30 17:20:39 -0700313 },
314 })
Colin Cross2fe66872015-03-30 17:20:39 -0700315}
316
Nan Zhanged19fc32017-10-19 13:06:22 -0700317func TransformJarsToJar(ctx android.ModuleContext, outputFile android.WritablePath, desc string,
Colin Cross37f6d792018-07-12 12:28:41 -0700318 jars android.Paths, manifest android.OptionalPath, stripDirEntries bool, filesToStrip []string,
319 dirsToStrip []string) {
Colin Cross0a6e0072017-08-30 14:24:55 -0700320
Colin Cross635acc92017-09-12 22:50:46 -0700321 var deps android.Paths
322
323 var jarArgs []string
324 if manifest.Valid() {
Nan Zhanged19fc32017-10-19 13:06:22 -0700325 jarArgs = append(jarArgs, "-m ", manifest.String())
Colin Cross635acc92017-09-12 22:50:46 -0700326 deps = append(deps, manifest.Path())
327 }
328
Colin Cross37f6d792018-07-12 12:28:41 -0700329 for _, dir := range dirsToStrip {
330 jarArgs = append(jarArgs, "-stripDir ", dir)
331 }
332
333 for _, file := range filesToStrip {
334 jarArgs = append(jarArgs, "-stripFile ", file)
Nan Zhanged19fc32017-10-19 13:06:22 -0700335 }
336
Colin Cross7b60cdd2017-12-21 13:52:58 -0800337 // Remove any module-info.class files that may have come from prebuilt jars, they cause problems
338 // for downstream tools like desugar.
339 jarArgs = append(jarArgs, "-stripFile module-info.class")
340
Colin Cross37f6d792018-07-12 12:28:41 -0700341 if stripDirEntries {
Colin Cross635acc92017-09-12 22:50:46 -0700342 jarArgs = append(jarArgs, "-D")
343 }
344
Colin Crossae887032017-10-23 17:16:14 -0700345 ctx.Build(pctx, android.BuildParams{
Colin Cross0a6e0072017-08-30 14:24:55 -0700346 Rule: combineJar,
Nan Zhanged19fc32017-10-19 13:06:22 -0700347 Description: desc,
Colin Cross0a6e0072017-08-30 14:24:55 -0700348 Output: outputFile,
349 Inputs: jars,
Colin Cross635acc92017-09-12 22:50:46 -0700350 Implicits: deps,
351 Args: map[string]string{
352 "jarArgs": strings.Join(jarArgs, " "),
353 },
Colin Cross0a6e0072017-08-30 14:24:55 -0700354 })
Colin Cross0a6e0072017-08-30 14:24:55 -0700355}
356
Colin Crosse9a275b2017-10-16 17:09:48 -0700357func TransformJarJar(ctx android.ModuleContext, outputFile android.WritablePath,
358 classesJar android.Path, rulesFile android.Path) {
Colin Crossae887032017-10-23 17:16:14 -0700359 ctx.Build(pctx, android.BuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700360 Rule: jarjar,
361 Description: "jarjar",
362 Output: outputFile,
363 Input: classesJar,
364 Implicit: rulesFile,
Colin Cross65bf4f22015-04-03 16:54:17 -0700365 Args: map[string]string{
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700366 "rulesFile": rulesFile.String(),
Colin Cross65bf4f22015-04-03 16:54:17 -0700367 },
368 })
Colin Cross65bf4f22015-04-03 16:54:17 -0700369}
Colin Cross6ade34f2017-09-15 13:00:47 -0700370
Vladimir Marko0975ee02019-04-02 10:29:55 +0100371func CheckJarPackages(ctx android.ModuleContext, outputFile android.WritablePath,
372 classesJar android.Path, permittedPackages []string) {
373 ctx.Build(pctx, android.BuildParams{
374 Rule: packageCheck,
375 Description: "packageCheck",
376 Output: outputFile,
377 Input: classesJar,
378 Args: map[string]string{
379 "packages": strings.Join(permittedPackages, " "),
380 },
381 })
382}
383
Nan Zhang4c819fb2018-08-27 18:31:46 -0700384func TransformJetifier(ctx android.ModuleContext, outputFile android.WritablePath,
385 inputFile android.Path) {
386 ctx.Build(pctx, android.BuildParams{
387 Rule: jetifier,
388 Description: "jetifier",
389 Output: outputFile,
390 Input: inputFile,
391 })
392}
393
Colin Cross094054a2018-10-17 15:10:48 -0700394func GenerateMainClassManifest(ctx android.ModuleContext, outputFile android.WritablePath, mainClass string) {
395 ctx.Build(pctx, android.BuildParams{
396 Rule: android.WriteFile,
397 Description: "manifest",
398 Output: outputFile,
399 Args: map[string]string{
400 "content": "Main-Class: " + mainClass + "\n",
401 },
402 })
403}
404
Colin Cross43f08db2018-11-12 10:13:39 -0800405func TransformZipAlign(ctx android.ModuleContext, outputFile android.WritablePath, inputFile android.Path) {
406 ctx.Build(pctx, android.BuildParams{
407 Rule: zipalign,
408 Description: "align",
409 Input: inputFile,
410 Output: outputFile,
411 })
412}
413
Colin Cross33961b52019-07-11 11:01:22 -0700414type classpath android.Paths
Colin Cross6ade34f2017-09-15 13:00:47 -0700415
Nan Zhanged19fc32017-10-19 13:06:22 -0700416func (x *classpath) FormJavaClassPath(optName string) string {
Colin Cross81440082018-08-15 20:21:55 -0700417 if optName != "" && !strings.HasSuffix(optName, "=") && !strings.HasSuffix(optName, " ") {
418 optName += " "
419 }
Colin Cross59149b62017-10-16 18:07:29 -0700420 if len(*x) > 0 {
Colin Cross81440082018-08-15 20:21:55 -0700421 return optName + strings.Join(x.Strings(), ":")
Colin Cross6ade34f2017-09-15 13:00:47 -0700422 } else {
423 return ""
424 }
425}
426
Colin Cross1369cdb2017-09-29 17:58:17 -0700427// Returns a --system argument in the form javac expects with -source 1.9. If forceEmpty is true,
428// returns --system=none if the list is empty to ensure javac does not fall back to the default
429// system modules.
Nan Zhanged19fc32017-10-19 13:06:22 -0700430func (x *classpath) FormJavaSystemModulesPath(optName string, forceEmpty bool) string {
Colin Cross1369cdb2017-09-29 17:58:17 -0700431 if len(*x) > 1 {
432 panic("more than one system module")
433 } else if len(*x) == 1 {
Dan Willemsenff60a732019-06-13 16:52:01 +0000434 return optName + (*x)[0].String()
Colin Cross1369cdb2017-09-29 17:58:17 -0700435 } else if forceEmpty {
Nan Zhanged19fc32017-10-19 13:06:22 -0700436 return optName + "none"
Colin Cross1369cdb2017-09-29 17:58:17 -0700437 } else {
438 return ""
439 }
440}
441
Colin Crossbafb8972018-06-06 21:46:32 +0000442func (x *classpath) FormTurbineClasspath(optName string) []string {
Colin Cross6ade34f2017-09-15 13:00:47 -0700443 if x == nil || *x == nil {
444 return nil
445 }
446 flags := make([]string, len(*x))
447 for i, v := range *x {
Colin Crossafbb1732019-01-17 15:42:52 -0800448 flags[i] = optName + v.String()
Colin Cross6ade34f2017-09-15 13:00:47 -0700449 }
450
451 return flags
452}
453
Colin Cross6ade34f2017-09-15 13:00:47 -0700454// Convert a classpath to an android.Paths
455func (x *classpath) Paths() android.Paths {
456 return append(android.Paths(nil), (*x)...)
457}
458
459func (x *classpath) Strings() []string {
460 if x == nil {
461 return nil
462 }
463 ret := make([]string, len(*x))
464 for i, path := range *x {
465 ret[i] = path.String()
466 }
467 return ret
468}