blob: b7ff3abe53b51ab3e7b4c2f68b690fb112d8bf4c [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 Cross635c3b02016-05-18 15:37:25 -070024 "android/soong/android"
Colin Cross2fe66872015-03-30 17:20:39 -070025
26 "github.com/google/blueprint"
Colin Cross2fe66872015-03-30 17:20:39 -070027)
28
29var (
Colin Cross635c3b02016-05-18 15:37:25 -070030 pctx = android.NewPackageContext("android/soong/java")
Colin Cross2fe66872015-03-30 17:20:39 -070031
32 // Compiling java is not conducive to proper dependency tracking. The path-matches-class-name
33 // requirement leads to unpredictable generated source file names, and a single .java file
34 // will get compiled into multiple .class files if it contains inner classes. To work around
35 // this, all java rules write into separate directories and then a post-processing step lists
36 // the files in the the directory into a list file that later rules depend on (and sometimes
37 // read from directly using @<listfile>)
Yoshisato Yanagisawa572324a2017-06-05 17:41:50 +090038 javac = pctx.AndroidGomaStaticRule("javac",
Colin Cross2fe66872015-03-30 17:20:39 -070039 blueprint.RuleParams{
Colin Cross64162712017-08-08 13:17:59 -070040 Command: `rm -rf "$outDir" "$annoDir" && mkdir -p "$outDir" "$annoDir" && ` +
41 `${config.JavacWrapper}${config.JavacCmd} ${config.CommonJdkFlags} ` +
42 `$javacFlags $bootClasspath $classpath ` +
43 `-source $javaVersion -target $javaVersion ` +
Colin Crossb852a582017-08-10 17:58:12 -070044 `-d $outDir -s $annoDir @$out.rsp && ` +
45 `find $outDir -type f | sort | ${config.JarArgsCmd} $outDir > $out`,
46 CommandDeps: []string{"${config.JavacCmd}", "${config.JarArgsCmd}"},
Colin Cross2fe66872015-03-30 17:20:39 -070047 Rspfile: "$out.rsp",
48 RspfileContent: "$in",
Colin Cross2fe66872015-03-30 17:20:39 -070049 },
Colin Cross64162712017-08-08 13:17:59 -070050 "javacFlags", "bootClasspath", "classpath", "outDir", "annoDir", "javaVersion")
Colin Cross2fe66872015-03-30 17:20:39 -070051
Colin Crossc6bbef32017-08-14 14:16:06 -070052 errorprone = pctx.AndroidStaticRule("errorprone",
53 blueprint.RuleParams{
54 Command: `rm -rf "$outDir" "$annoDir" && mkdir -p "$outDir" "$annoDir" && ` +
55 `${config.ErrorProneCmd}` +
56 `$javacFlags $bootClasspath $classpath ` +
57 `-source $javaVersion -target $javaVersion ` +
58 `-d $outDir -s $annoDir @$out.rsp && ` +
59 `find $outDir -type f | sort | ${config.JarArgsCmd} $outDir > $out`,
60 CommandDeps: []string{
61 "${config.JavaCmd}",
62 "${config.ErrorProneJavacJar}",
63 "${config.ErrorProneJar}",
64 "${config.JarArgsCmd}",
65 },
66 Rspfile: "$out.rsp",
67 RspfileContent: "$in",
68 },
69 "javacFlags", "bootClasspath", "classpath", "outDir", "annoDir", "javaVersion")
70
Colin Cross9d45bb72016-08-29 16:14:13 -070071 jar = pctx.AndroidStaticRule("jar",
Colin Cross2fe66872015-03-30 17:20:39 -070072 blueprint.RuleParams{
Colin Crossb852a582017-08-10 17:58:12 -070073 Command: `${config.JarCmd} $operation ${out}.tmp $manifest $jarArgs && ${config.Zip2ZipCmd} -t -i ${out}.tmp -o ${out} && rm ${out}.tmp`,
74 CommandDeps: []string{"${config.JarCmd}"},
Colin Cross2fe66872015-03-30 17:20:39 -070075 },
Colin Crossb852a582017-08-10 17:58:12 -070076 "operation", "manifest", "jarArgs")
Colin Cross2fe66872015-03-30 17:20:39 -070077
Colin Cross9d45bb72016-08-29 16:14:13 -070078 dx = pctx.AndroidStaticRule("dx",
Colin Cross2fe66872015-03-30 17:20:39 -070079 blueprint.RuleParams{
Colin Cross6d1e72d2015-04-10 17:44:24 -070080 Command: `rm -rf "$outDir" && mkdir -p "$outDir" && ` +
Colin Crossb852a582017-08-10 17:58:12 -070081 `${config.DxCmd} --dex --output=$outDir $dxFlags $in && ` +
82 `find "$outDir" -name "classes*.dex" | sort | ${config.JarArgsCmd} ${outDir} > $out`,
83 CommandDeps: []string{"${config.DxCmd}", "${config.JarArgsCmd}"},
Colin Cross2fe66872015-03-30 17:20:39 -070084 },
85 "outDir", "dxFlags")
Colin Crosse1d62a82015-04-03 16:53:05 -070086
Colin Cross9d45bb72016-08-29 16:14:13 -070087 jarjar = pctx.AndroidStaticRule("jarjar",
Colin Cross65bf4f22015-04-03 16:54:17 -070088 blueprint.RuleParams{
Colin Cross64162712017-08-08 13:17:59 -070089 Command: "${config.JavaCmd} -jar ${config.JarjarCmd} process $rulesFile $in $out",
90 CommandDeps: []string{"${config.JavaCmd}", "${config.JarjarCmd}", "$rulesFile"},
Colin Cross65bf4f22015-04-03 16:54:17 -070091 },
92 "rulesFile")
93
Colin Cross9d45bb72016-08-29 16:14:13 -070094 extractPrebuilt = pctx.AndroidStaticRule("extractPrebuilt",
Colin Crosse1d62a82015-04-03 16:53:05 -070095 blueprint.RuleParams{
96 Command: `rm -rf $outDir && unzip -qo $in -d $outDir && ` +
Colin Crossb852a582017-08-10 17:58:12 -070097 `find $outDir -name "*.class" | sort | ${config.JarArgsCmd} ${outDir} > $classFile && ` +
98 `find $outDir -type f -a \! -name "*.class" -a \! -name "MANIFEST.MF" | sort | ${config.JarArgsCmd} ${outDir} > $resourceFile`,
99 CommandDeps: []string{"${config.JarArgsCmd}"},
Colin Crosse1d62a82015-04-03 16:53:05 -0700100 },
101 "outDir", "classFile", "resourceFile")
Colin Crossb852a582017-08-10 17:58:12 -0700102
103 fileListToJarArgs = pctx.AndroidStaticRule("fileListToJarArgs",
104 blueprint.RuleParams{
105 Command: `${config.JarArgsCmd} -f $in -p ${outDir} -o $out`,
106 CommandDeps: []string{"${config.JarjarCmd}"},
107 },
108 "outDir")
Colin Cross2fe66872015-03-30 17:20:39 -0700109)
110
111func init() {
Colin Cross64162712017-08-08 13:17:59 -0700112 pctx.Import("android/soong/java/config")
Colin Cross2fe66872015-03-30 17:20:39 -0700113}
114
115type javaBuilderFlags struct {
116 javacFlags string
117 dxFlags string
118 bootClasspath string
119 classpath string
Colin Crossc0b06f12015-04-08 13:03:43 -0700120 aidlFlags string
Colin Cross64162712017-08-08 13:17:59 -0700121 javaVersion string
Colin Cross2fe66872015-03-30 17:20:39 -0700122}
123
124type jarSpec struct {
Colin Crossb852a582017-08-10 17:58:12 -0700125 android.ModuleOutPath
Colin Cross2fe66872015-03-30 17:20:39 -0700126}
127
Colin Crossb852a582017-08-10 17:58:12 -0700128func (j jarSpec) jarArgs() string {
129 return "@" + j.String()
130}
131
132func (j jarSpec) path() android.Path {
133 return j.ModuleOutPath
Colin Cross2fe66872015-03-30 17:20:39 -0700134}
135
Colin Cross635c3b02016-05-18 15:37:25 -0700136func TransformJavaToClasses(ctx android.ModuleContext, srcFiles android.Paths, srcFileLists android.Paths,
137 flags javaBuilderFlags, deps android.Paths) jarSpec {
Colin Cross2fe66872015-03-30 17:20:39 -0700138
Colin Cross635c3b02016-05-18 15:37:25 -0700139 classDir := android.PathForModuleOut(ctx, "classes")
Colin Cross64162712017-08-08 13:17:59 -0700140 annoDir := android.PathForModuleOut(ctx, "anno")
Colin Cross635c3b02016-05-18 15:37:25 -0700141 classFileList := android.PathForModuleOut(ctx, "classes.list")
Colin Cross2fe66872015-03-30 17:20:39 -0700142
Colin Cross635c3b02016-05-18 15:37:25 -0700143 javacFlags := flags.javacFlags + android.JoinWithPrefix(srcFileLists.Strings(), "@")
Colin Crosse7a9f3f2015-04-13 14:02:52 -0700144
145 deps = append(deps, srcFileLists...)
146
Colin Cross635c3b02016-05-18 15:37:25 -0700147 ctx.ModuleBuild(pctx, android.ModuleBuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700148 Rule: javac,
149 Description: "javac",
150 Output: classFileList,
151 Inputs: srcFiles,
152 Implicits: deps,
Colin Cross2fe66872015-03-30 17:20:39 -0700153 Args: map[string]string{
Colin Crosse7a9f3f2015-04-13 14:02:52 -0700154 "javacFlags": javacFlags,
Colin Cross2fe66872015-03-30 17:20:39 -0700155 "bootClasspath": flags.bootClasspath,
156 "classpath": flags.classpath,
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700157 "outDir": classDir.String(),
Colin Cross64162712017-08-08 13:17:59 -0700158 "annoDir": annoDir.String(),
159 "javaVersion": flags.javaVersion,
Colin Cross2fe66872015-03-30 17:20:39 -0700160 },
161 })
162
Colin Crossb852a582017-08-10 17:58:12 -0700163 return jarSpec{classFileList}
Colin Cross2fe66872015-03-30 17:20:39 -0700164}
165
Colin Crossc6bbef32017-08-14 14:16:06 -0700166func RunErrorProne(ctx android.ModuleContext, srcFiles android.Paths, srcFileLists android.Paths,
167 flags javaBuilderFlags, deps android.Paths) android.Path {
168
169 classDir := android.PathForModuleOut(ctx, "classes-errorprone")
170 annoDir := android.PathForModuleOut(ctx, "anno-errorprone")
171 classFileList := android.PathForModuleOut(ctx, "classes-errorprone.list")
172
173 javacFlags := flags.javacFlags + android.JoinWithPrefix(srcFileLists.Strings(), "@")
174
175 deps = append(deps, srcFileLists...)
176
177 ctx.ModuleBuild(pctx, android.ModuleBuildParams{
178 Rule: errorprone,
179 Description: "errorprone",
180 Output: classFileList,
181 Inputs: srcFiles,
182 Implicits: deps,
183 Args: map[string]string{
184 "javacFlags": javacFlags,
185 "bootClasspath": flags.bootClasspath,
186 "classpath": flags.classpath,
187 "outDir": classDir.String(),
188 "annoDir": annoDir.String(),
189 "javaVersion": flags.javaVersion,
190 },
191 })
192
193 return classFileList
194}
195
Colin Cross635c3b02016-05-18 15:37:25 -0700196func TransformClassesToJar(ctx android.ModuleContext, classes []jarSpec,
Colin Crossc6bbef32017-08-14 14:16:06 -0700197 manifest android.OptionalPath, deps android.Paths) android.Path {
Colin Cross2fe66872015-03-30 17:20:39 -0700198
Colin Cross635c3b02016-05-18 15:37:25 -0700199 outputFile := android.PathForModuleOut(ctx, "classes-full-debug.jar")
Colin Cross2fe66872015-03-30 17:20:39 -0700200
Colin Cross2fe66872015-03-30 17:20:39 -0700201 jarArgs := []string{}
202
203 for _, j := range classes {
Colin Crossb852a582017-08-10 17:58:12 -0700204 deps = append(deps, j.path())
205 jarArgs = append(jarArgs, j.jarArgs())
Colin Cross2fe66872015-03-30 17:20:39 -0700206 }
207
Colin Crossb852a582017-08-10 17:58:12 -0700208 operation := "cf"
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700209 if manifest.Valid() {
Colin Crossb852a582017-08-10 17:58:12 -0700210 operation = "cfm"
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700211 deps = append(deps, manifest.Path())
Colin Cross2fe66872015-03-30 17:20:39 -0700212 }
213
Colin Cross635c3b02016-05-18 15:37:25 -0700214 ctx.ModuleBuild(pctx, android.ModuleBuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700215 Rule: jar,
216 Description: "jar",
217 Output: outputFile,
218 Implicits: deps,
Colin Cross2fe66872015-03-30 17:20:39 -0700219 Args: map[string]string{
Colin Crossb852a582017-08-10 17:58:12 -0700220 "jarArgs": strings.Join(jarArgs, " "),
221 "operation": operation,
222 "manifest": manifest.String(),
Colin Cross2fe66872015-03-30 17:20:39 -0700223 },
224 })
225
226 return outputFile
227}
228
Colin Cross635c3b02016-05-18 15:37:25 -0700229func TransformClassesJarToDex(ctx android.ModuleContext, classesJar android.Path,
Colin Cross6d1e72d2015-04-10 17:44:24 -0700230 flags javaBuilderFlags) jarSpec {
Colin Cross2fe66872015-03-30 17:20:39 -0700231
Colin Cross635c3b02016-05-18 15:37:25 -0700232 outDir := android.PathForModuleOut(ctx, "dex")
233 outputFile := android.PathForModuleOut(ctx, "dex.filelist")
Colin Cross2fe66872015-03-30 17:20:39 -0700234
Colin Cross635c3b02016-05-18 15:37:25 -0700235 ctx.ModuleBuild(pctx, android.ModuleBuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700236 Rule: dx,
237 Description: "dx",
238 Output: outputFile,
239 Input: classesJar,
Colin Cross2fe66872015-03-30 17:20:39 -0700240 Args: map[string]string{
241 "dxFlags": flags.dxFlags,
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700242 "outDir": outDir.String(),
Colin Cross2fe66872015-03-30 17:20:39 -0700243 },
244 })
245
Colin Crossb852a582017-08-10 17:58:12 -0700246 return jarSpec{outputFile}
Colin Cross2fe66872015-03-30 17:20:39 -0700247}
248
Colin Cross635c3b02016-05-18 15:37:25 -0700249func TransformDexToJavaLib(ctx android.ModuleContext, resources []jarSpec,
250 dexJarSpec jarSpec) android.Path {
Colin Cross2fe66872015-03-30 17:20:39 -0700251
Colin Cross635c3b02016-05-18 15:37:25 -0700252 outputFile := android.PathForModuleOut(ctx, "javalib.jar")
253 var deps android.Paths
Colin Cross2fe66872015-03-30 17:20:39 -0700254 var jarArgs []string
255
256 for _, j := range resources {
Colin Crossb852a582017-08-10 17:58:12 -0700257 deps = append(deps, j.path())
258 jarArgs = append(jarArgs, j.jarArgs())
Colin Cross2fe66872015-03-30 17:20:39 -0700259 }
260
Colin Crossb852a582017-08-10 17:58:12 -0700261 deps = append(deps, dexJarSpec.path())
262 jarArgs = append(jarArgs, dexJarSpec.jarArgs())
Colin Cross2fe66872015-03-30 17:20:39 -0700263
Colin Cross635c3b02016-05-18 15:37:25 -0700264 ctx.ModuleBuild(pctx, android.ModuleBuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700265 Rule: jar,
266 Description: "jar",
267 Output: outputFile,
268 Implicits: deps,
Colin Cross2fe66872015-03-30 17:20:39 -0700269 Args: map[string]string{
Colin Crossb852a582017-08-10 17:58:12 -0700270 "operation": "cf",
271 "jarArgs": strings.Join(jarArgs, " "),
Colin Cross2fe66872015-03-30 17:20:39 -0700272 },
273 })
274
275 return outputFile
276}
Colin Crosse1d62a82015-04-03 16:53:05 -0700277
Colin Cross635c3b02016-05-18 15:37:25 -0700278func TransformJarJar(ctx android.ModuleContext, classesJar android.Path, rulesFile android.Path) android.Path {
279 outputFile := android.PathForModuleOut(ctx, "classes-jarjar.jar")
280 ctx.ModuleBuild(pctx, android.ModuleBuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700281 Rule: jarjar,
282 Description: "jarjar",
283 Output: outputFile,
284 Input: classesJar,
285 Implicit: rulesFile,
Colin Cross65bf4f22015-04-03 16:54:17 -0700286 Args: map[string]string{
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700287 "rulesFile": rulesFile.String(),
Colin Cross65bf4f22015-04-03 16:54:17 -0700288 },
289 })
290
291 return outputFile
292}
293
Colin Cross635c3b02016-05-18 15:37:25 -0700294func TransformPrebuiltJarToClasses(ctx android.ModuleContext,
Colin Cross74d73e22017-08-02 11:05:49 -0700295 subdir string, prebuilt android.Path) (classJarSpec, resourceJarSpec jarSpec) {
Colin Crosse1d62a82015-04-03 16:53:05 -0700296
Colin Cross74d73e22017-08-02 11:05:49 -0700297 classDir := android.PathForModuleOut(ctx, subdir, "classes")
298 classFileList := android.PathForModuleOut(ctx, subdir, "classes.list")
299 resourceFileList := android.PathForModuleOut(ctx, subdir, "resources.list")
Colin Crosse1d62a82015-04-03 16:53:05 -0700300
Colin Cross635c3b02016-05-18 15:37:25 -0700301 ctx.ModuleBuild(pctx, android.ModuleBuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700302 Rule: extractPrebuilt,
303 Description: "extract classes",
304 Outputs: android.WritablePaths{classFileList, resourceFileList},
305 Input: prebuilt,
Colin Crosse1d62a82015-04-03 16:53:05 -0700306 Args: map[string]string{
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700307 "outDir": classDir.String(),
308 "classFile": classFileList.String(),
309 "resourceFile": resourceFileList.String(),
Colin Crosse1d62a82015-04-03 16:53:05 -0700310 },
311 })
312
Colin Crossb852a582017-08-10 17:58:12 -0700313 return jarSpec{classFileList}, jarSpec{resourceFileList}
314}
315
316func TransformFileListToJarSpec(ctx android.ModuleContext, dir, fileListFile android.Path) jarSpec {
317 outputFile := android.PathForModuleOut(ctx, fileListFile.Base()+".jarArgs")
318
319 ctx.ModuleBuild(pctx, android.ModuleBuildParams{
320 Rule: fileListToJarArgs,
321 Description: "file list to jar args",
322 Output: outputFile,
323 Input: fileListFile,
324 Args: map[string]string{
325 "outDir": dir.String(),
326 },
327 })
328
329 return jarSpec{outputFile}
Colin Crosse1d62a82015-04-03 16:53:05 -0700330}