blob: cf6ab6b59101e75c2eb31783ca079718fe6c5c33 [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 Cross3203dde2017-08-28 17:23:21 -070042 `${config.JavacWrapper}${config.JavacCmd} ${config.JavacHeapFlags} ${config.CommonJdkFlags} ` +
Colin Cross64162712017-08-08 13:17:59 -070043 `$javacFlags $bootClasspath $classpath ` +
44 `-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`,
47 CommandDeps: []string{"${config.JavacCmd}", "${config.SoongZipCmd}"},
Colin Cross2fe66872015-03-30 17:20:39 -070048 Rspfile: "$out.rsp",
49 RspfileContent: "$in",
Colin Cross2fe66872015-03-30 17:20:39 -070050 },
Colin Cross64162712017-08-08 13:17:59 -070051 "javacFlags", "bootClasspath", "classpath", "outDir", "annoDir", "javaVersion")
Colin Cross2fe66872015-03-30 17:20:39 -070052
Colin Crossc6bbef32017-08-14 14:16:06 -070053 errorprone = pctx.AndroidStaticRule("errorprone",
54 blueprint.RuleParams{
55 Command: `rm -rf "$outDir" "$annoDir" && mkdir -p "$outDir" "$annoDir" && ` +
Colin Cross3a5de652017-09-11 23:10:21 -070056 `${config.ErrorProneCmd} ` +
Colin Crossc6bbef32017-08-14 14:16:06 -070057 `$javacFlags $bootClasspath $classpath ` +
58 `-source $javaVersion -target $javaVersion ` +
59 `-d $outDir -s $annoDir @$out.rsp && ` +
Colin Cross0a6e0072017-08-30 14:24:55 -070060 `${config.SoongZipCmd} -jar -o $out -C $outDir -D $outDir`,
Colin Crossc6bbef32017-08-14 14:16:06 -070061 CommandDeps: []string{
62 "${config.JavaCmd}",
63 "${config.ErrorProneJavacJar}",
64 "${config.ErrorProneJar}",
Colin Cross0a6e0072017-08-30 14:24:55 -070065 "${config.SoongZipCmd}",
Colin Crossc6bbef32017-08-14 14:16:06 -070066 },
67 Rspfile: "$out.rsp",
68 RspfileContent: "$in",
69 },
70 "javacFlags", "bootClasspath", "classpath", "outDir", "annoDir", "javaVersion")
71
Colin Cross9d45bb72016-08-29 16:14:13 -070072 jar = pctx.AndroidStaticRule("jar",
Colin Cross2fe66872015-03-30 17:20:39 -070073 blueprint.RuleParams{
Colin Cross0a6e0072017-08-30 14:24:55 -070074 Command: `${config.SoongZipCmd} -jar -o $out $jarArgs`,
75 CommandDeps: []string{"${config.SoongZipCmd}"},
Colin Cross2fe66872015-03-30 17:20:39 -070076 },
Colin Cross0a6e0072017-08-30 14:24:55 -070077 "jarArgs")
78
79 combineJar = pctx.AndroidStaticRule("combineJar",
80 blueprint.RuleParams{
Colin Cross635acc92017-09-12 22:50:46 -070081 Command: `${config.MergeZipsCmd} -j $jarArgs $out $in`,
Colin Cross0a6e0072017-08-30 14:24:55 -070082 CommandDeps: []string{"${config.MergeZipsCmd}"},
83 },
Colin Cross635acc92017-09-12 22:50:46 -070084 "jarArgs")
Colin Cross2fe66872015-03-30 17:20:39 -070085
Colin Cross9d45bb72016-08-29 16:14:13 -070086 dx = pctx.AndroidStaticRule("dx",
Colin Cross2fe66872015-03-30 17:20:39 -070087 blueprint.RuleParams{
Colin Cross6d1e72d2015-04-10 17:44:24 -070088 Command: `rm -rf "$outDir" && mkdir -p "$outDir" && ` +
Colin Cross0a6e0072017-08-30 14:24:55 -070089 `${config.DxCmd} --dex --output=$outDir $dxFlags $in || ( rm -rf "$outDir"; exit 41 ) && ` +
90 `find "$outDir" -name "classes*.dex" | sort > $out`,
91 CommandDeps: []string{"${config.DxCmd}"},
Colin Cross2fe66872015-03-30 17:20:39 -070092 },
93 "outDir", "dxFlags")
Colin Crosse1d62a82015-04-03 16:53:05 -070094
Colin Cross9d45bb72016-08-29 16:14:13 -070095 jarjar = pctx.AndroidStaticRule("jarjar",
Colin Cross65bf4f22015-04-03 16:54:17 -070096 blueprint.RuleParams{
Colin Cross64162712017-08-08 13:17:59 -070097 Command: "${config.JavaCmd} -jar ${config.JarjarCmd} process $rulesFile $in $out",
98 CommandDeps: []string{"${config.JavaCmd}", "${config.JarjarCmd}", "$rulesFile"},
Colin Cross65bf4f22015-04-03 16:54:17 -070099 },
100 "rulesFile")
Colin Cross2fe66872015-03-30 17:20:39 -0700101)
102
103func init() {
Colin Cross64162712017-08-08 13:17:59 -0700104 pctx.Import("android/soong/java/config")
Colin Cross2fe66872015-03-30 17:20:39 -0700105}
106
107type javaBuilderFlags struct {
108 javacFlags string
109 dxFlags string
110 bootClasspath string
111 classpath string
Colin Crossc0b06f12015-04-08 13:03:43 -0700112 aidlFlags string
Colin Cross64162712017-08-08 13:17:59 -0700113 javaVersion string
Colin Cross2fe66872015-03-30 17:20:39 -0700114}
115
116type jarSpec struct {
Colin Cross0a6e0072017-08-30 14:24:55 -0700117 fileList, dir android.Path
Colin Cross2fe66872015-03-30 17:20:39 -0700118}
119
Colin Cross0a6e0072017-08-30 14:24:55 -0700120func (j jarSpec) soongJarArgs() string {
121 return "-C " + j.dir.String() + " -l " + j.fileList.String()
Colin Crossb852a582017-08-10 17:58:12 -0700122}
123
Colin Cross0a6e0072017-08-30 14:24:55 -0700124func TransformJavaToClasses(ctx android.ModuleContext, srcFiles, srcFileLists android.Paths,
125 flags javaBuilderFlags, deps android.Paths) android.ModuleOutPath {
Colin Cross2fe66872015-03-30 17:20:39 -0700126
Colin Cross635c3b02016-05-18 15:37:25 -0700127 classDir := android.PathForModuleOut(ctx, "classes")
Colin Cross64162712017-08-08 13:17:59 -0700128 annoDir := android.PathForModuleOut(ctx, "anno")
Colin Cross635acc92017-09-12 22:50:46 -0700129 classJar := android.PathForModuleOut(ctx, "classes-compiled.jar")
Colin Cross2fe66872015-03-30 17:20:39 -0700130
Colin Cross635c3b02016-05-18 15:37:25 -0700131 javacFlags := flags.javacFlags + android.JoinWithPrefix(srcFileLists.Strings(), "@")
Colin Crosse7a9f3f2015-04-13 14:02:52 -0700132
133 deps = append(deps, srcFileLists...)
134
Colin Cross635c3b02016-05-18 15:37:25 -0700135 ctx.ModuleBuild(pctx, android.ModuleBuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700136 Rule: javac,
137 Description: "javac",
Colin Cross0a6e0072017-08-30 14:24:55 -0700138 Output: classJar,
Colin Cross67a5c132017-05-09 13:45:28 -0700139 Inputs: srcFiles,
140 Implicits: deps,
Colin Cross2fe66872015-03-30 17:20:39 -0700141 Args: map[string]string{
Colin Crosse7a9f3f2015-04-13 14:02:52 -0700142 "javacFlags": javacFlags,
Colin Cross2fe66872015-03-30 17:20:39 -0700143 "bootClasspath": flags.bootClasspath,
144 "classpath": flags.classpath,
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700145 "outDir": classDir.String(),
Colin Cross64162712017-08-08 13:17:59 -0700146 "annoDir": annoDir.String(),
147 "javaVersion": flags.javaVersion,
Colin Cross2fe66872015-03-30 17:20:39 -0700148 },
149 })
150
Colin Cross0a6e0072017-08-30 14:24:55 -0700151 return classJar
Colin Cross2fe66872015-03-30 17:20:39 -0700152}
153
Colin Crossc6bbef32017-08-14 14:16:06 -0700154func RunErrorProne(ctx android.ModuleContext, srcFiles android.Paths, srcFileLists android.Paths,
155 flags javaBuilderFlags, deps android.Paths) android.Path {
156
Colin Crossfee57cb2017-09-05 13:16:45 -0700157 if config.ErrorProneJar == "" {
158 ctx.ModuleErrorf("cannot build with Error Prone, missing external/error_prone?")
159 return nil
160 }
161
Colin Crossc6bbef32017-08-14 14:16:06 -0700162 classDir := android.PathForModuleOut(ctx, "classes-errorprone")
163 annoDir := android.PathForModuleOut(ctx, "anno-errorprone")
164 classFileList := android.PathForModuleOut(ctx, "classes-errorprone.list")
165
166 javacFlags := flags.javacFlags + android.JoinWithPrefix(srcFileLists.Strings(), "@")
167
168 deps = append(deps, srcFileLists...)
169
170 ctx.ModuleBuild(pctx, android.ModuleBuildParams{
171 Rule: errorprone,
172 Description: "errorprone",
173 Output: classFileList,
174 Inputs: srcFiles,
175 Implicits: deps,
176 Args: map[string]string{
177 "javacFlags": javacFlags,
178 "bootClasspath": flags.bootClasspath,
179 "classpath": flags.classpath,
180 "outDir": classDir.String(),
181 "annoDir": annoDir.String(),
182 "javaVersion": flags.javaVersion,
183 },
184 })
185
186 return classFileList
187}
188
Colin Cross0a6e0072017-08-30 14:24:55 -0700189func TransformResourcesToJar(ctx android.ModuleContext, resources []jarSpec,
Colin Cross635acc92017-09-12 22:50:46 -0700190 deps android.Paths) android.Path {
Colin Cross2fe66872015-03-30 17:20:39 -0700191
Colin Cross0a6e0072017-08-30 14:24:55 -0700192 outputFile := android.PathForModuleOut(ctx, "res.jar")
Colin Cross2fe66872015-03-30 17:20:39 -0700193
Colin Cross2fe66872015-03-30 17:20:39 -0700194 jarArgs := []string{}
195
Colin Cross0a6e0072017-08-30 14:24:55 -0700196 for _, j := range resources {
197 deps = append(deps, j.fileList)
198 jarArgs = append(jarArgs, j.soongJarArgs())
Colin Cross2fe66872015-03-30 17:20:39 -0700199 }
200
Colin Cross635c3b02016-05-18 15:37:25 -0700201 ctx.ModuleBuild(pctx, android.ModuleBuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700202 Rule: jar,
203 Description: "jar",
204 Output: outputFile,
205 Implicits: deps,
Colin Cross2fe66872015-03-30 17:20:39 -0700206 Args: map[string]string{
Colin Cross0a6e0072017-08-30 14:24:55 -0700207 "jarArgs": strings.Join(jarArgs, " "),
Colin Cross2fe66872015-03-30 17:20:39 -0700208 },
209 })
210
211 return outputFile
212}
213
Colin Cross635acc92017-09-12 22:50:46 -0700214func TransformJarsToJar(ctx android.ModuleContext, stem string, jars android.Paths,
215 manifest android.OptionalPath, stripDirs bool) android.Path {
Colin Cross0a6e0072017-08-30 14:24:55 -0700216
217 outputFile := android.PathForModuleOut(ctx, stem)
218
Colin Cross635acc92017-09-12 22:50:46 -0700219 if len(jars) == 1 && !manifest.Valid() {
Colin Cross0a6e0072017-08-30 14:24:55 -0700220 return jars[0]
221 }
222
Colin Cross635acc92017-09-12 22:50:46 -0700223 var deps android.Paths
224
225 var jarArgs []string
226 if manifest.Valid() {
227 jarArgs = append(jarArgs, "-m "+manifest.String())
228 deps = append(deps, manifest.Path())
229 }
230
231 if stripDirs {
232 jarArgs = append(jarArgs, "-D")
233 }
234
Colin Cross0a6e0072017-08-30 14:24:55 -0700235 ctx.ModuleBuild(pctx, android.ModuleBuildParams{
236 Rule: combineJar,
237 Description: "combine jars",
238 Output: outputFile,
239 Inputs: jars,
Colin Cross635acc92017-09-12 22:50:46 -0700240 Implicits: deps,
241 Args: map[string]string{
242 "jarArgs": strings.Join(jarArgs, " "),
243 },
Colin Cross0a6e0072017-08-30 14:24:55 -0700244 })
245
246 return outputFile
247}
248
Colin Cross635c3b02016-05-18 15:37:25 -0700249func TransformClassesJarToDex(ctx android.ModuleContext, classesJar android.Path,
Colin Cross6d1e72d2015-04-10 17:44:24 -0700250 flags javaBuilderFlags) jarSpec {
Colin Cross2fe66872015-03-30 17:20:39 -0700251
Colin Cross635c3b02016-05-18 15:37:25 -0700252 outDir := android.PathForModuleOut(ctx, "dex")
253 outputFile := android.PathForModuleOut(ctx, "dex.filelist")
Colin Cross2fe66872015-03-30 17:20:39 -0700254
Colin Cross635c3b02016-05-18 15:37:25 -0700255 ctx.ModuleBuild(pctx, android.ModuleBuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700256 Rule: dx,
257 Description: "dx",
258 Output: outputFile,
259 Input: classesJar,
Colin Cross2fe66872015-03-30 17:20:39 -0700260 Args: map[string]string{
261 "dxFlags": flags.dxFlags,
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700262 "outDir": outDir.String(),
Colin Cross2fe66872015-03-30 17:20:39 -0700263 },
264 })
265
Colin Cross0a6e0072017-08-30 14:24:55 -0700266 return jarSpec{outputFile, outDir}
Colin Cross2fe66872015-03-30 17:20:39 -0700267}
268
Colin Cross635c3b02016-05-18 15:37:25 -0700269func TransformDexToJavaLib(ctx android.ModuleContext, resources []jarSpec,
270 dexJarSpec jarSpec) android.Path {
Colin Cross2fe66872015-03-30 17:20:39 -0700271
Colin Cross635c3b02016-05-18 15:37:25 -0700272 outputFile := android.PathForModuleOut(ctx, "javalib.jar")
273 var deps android.Paths
Colin Cross2fe66872015-03-30 17:20:39 -0700274 var jarArgs []string
275
276 for _, j := range resources {
Colin Cross0a6e0072017-08-30 14:24:55 -0700277 deps = append(deps, j.fileList)
278 jarArgs = append(jarArgs, j.soongJarArgs())
Colin Cross2fe66872015-03-30 17:20:39 -0700279 }
280
Colin Cross0a6e0072017-08-30 14:24:55 -0700281 deps = append(deps, dexJarSpec.fileList)
282 jarArgs = append(jarArgs, dexJarSpec.soongJarArgs())
Colin Cross2fe66872015-03-30 17:20:39 -0700283
Colin Cross635c3b02016-05-18 15:37:25 -0700284 ctx.ModuleBuild(pctx, android.ModuleBuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700285 Rule: jar,
286 Description: "jar",
287 Output: outputFile,
288 Implicits: deps,
Colin Cross2fe66872015-03-30 17:20:39 -0700289 Args: map[string]string{
Colin Cross0a6e0072017-08-30 14:24:55 -0700290 "jarArgs": strings.Join(jarArgs, " "),
Colin Cross2fe66872015-03-30 17:20:39 -0700291 },
292 })
293
294 return outputFile
295}
Colin Crosse1d62a82015-04-03 16:53:05 -0700296
Colin Cross0a6e0072017-08-30 14:24:55 -0700297func TransformJarJar(ctx android.ModuleContext, classesJar android.Path, rulesFile android.Path) android.ModuleOutPath {
Colin Cross635c3b02016-05-18 15:37:25 -0700298 outputFile := android.PathForModuleOut(ctx, "classes-jarjar.jar")
299 ctx.ModuleBuild(pctx, android.ModuleBuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700300 Rule: jarjar,
301 Description: "jarjar",
302 Output: outputFile,
303 Input: classesJar,
304 Implicit: rulesFile,
Colin Cross65bf4f22015-04-03 16:54:17 -0700305 Args: map[string]string{
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700306 "rulesFile": rulesFile.String(),
Colin Cross65bf4f22015-04-03 16:54:17 -0700307 },
308 })
309
310 return outputFile
311}