blob: 017f64f8b634bd3b911ee9f0a500c83f454707b2 [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 ` +
44 `-d $outDir -s $annoDir @$out.rsp || ( rm -rf "$outDir"; exit 41 ) && ` +
Colin Cross2fe66872015-03-30 17:20:39 -070045 `find $outDir -name "*.class" > $out`,
46 Rspfile: "$out.rsp",
47 RspfileContent: "$in",
Colin Cross2fe66872015-03-30 17:20:39 -070048 },
Colin Cross64162712017-08-08 13:17:59 -070049 "javacFlags", "bootClasspath", "classpath", "outDir", "annoDir", "javaVersion")
Colin Cross2fe66872015-03-30 17:20:39 -070050
Colin Cross9d45bb72016-08-29 16:14:13 -070051 jar = pctx.AndroidStaticRule("jar",
Colin Cross2fe66872015-03-30 17:20:39 -070052 blueprint.RuleParams{
Colin Cross64162712017-08-08 13:17:59 -070053 Command: `${config.SoongZipCmd} -o $out -d $jarArgs`,
54 CommandDeps: []string{"${config.SoongZipCmd}"},
Colin Cross2fe66872015-03-30 17:20:39 -070055 },
56 "jarCmd", "jarArgs")
57
Colin Cross9d45bb72016-08-29 16:14:13 -070058 dx = pctx.AndroidStaticRule("dx",
Colin Cross2fe66872015-03-30 17:20:39 -070059 blueprint.RuleParams{
Colin Cross6d1e72d2015-04-10 17:44:24 -070060 Command: `rm -rf "$outDir" && mkdir -p "$outDir" && ` +
Colin Cross64162712017-08-08 13:17:59 -070061 `${config.DxCmd} --dex --output=$outDir $dxFlags $in || ( rm -rf "$outDir"; exit 41 ) && ` +
62 `find "$outDir" -name "classes*.dex" | sort > $out`,
63 CommandDeps: []string{"${config.DxCmd}"},
Colin Cross2fe66872015-03-30 17:20:39 -070064 },
65 "outDir", "dxFlags")
Colin Crosse1d62a82015-04-03 16:53:05 -070066
Colin Cross9d45bb72016-08-29 16:14:13 -070067 jarjar = pctx.AndroidStaticRule("jarjar",
Colin Cross65bf4f22015-04-03 16:54:17 -070068 blueprint.RuleParams{
Colin Cross64162712017-08-08 13:17:59 -070069 Command: "${config.JavaCmd} -jar ${config.JarjarCmd} process $rulesFile $in $out",
70 CommandDeps: []string{"${config.JavaCmd}", "${config.JarjarCmd}", "$rulesFile"},
Colin Cross65bf4f22015-04-03 16:54:17 -070071 },
72 "rulesFile")
73
Colin Cross9d45bb72016-08-29 16:14:13 -070074 extractPrebuilt = pctx.AndroidStaticRule("extractPrebuilt",
Colin Crosse1d62a82015-04-03 16:53:05 -070075 blueprint.RuleParams{
76 Command: `rm -rf $outDir && unzip -qo $in -d $outDir && ` +
77 `find $outDir -name "*.class" > $classFile && ` +
78 `find $outDir -type f -a \! -name "*.class" -a \! -name "MANIFEST.MF" > $resourceFile || ` +
79 `(rm -rf $outDir; exit 42)`,
Colin Crosse1d62a82015-04-03 16:53:05 -070080 },
81 "outDir", "classFile", "resourceFile")
Colin Cross2fe66872015-03-30 17:20:39 -070082)
83
84func init() {
Colin Cross64162712017-08-08 13:17:59 -070085 pctx.Import("android/soong/java/config")
Colin Cross2fe66872015-03-30 17:20:39 -070086}
87
88type javaBuilderFlags struct {
89 javacFlags string
90 dxFlags string
91 bootClasspath string
92 classpath string
Colin Crossc0b06f12015-04-08 13:03:43 -070093 aidlFlags string
Colin Cross64162712017-08-08 13:17:59 -070094 javaVersion string
Colin Cross2fe66872015-03-30 17:20:39 -070095}
96
97type jarSpec struct {
Colin Cross635c3b02016-05-18 15:37:25 -070098 fileList, dir android.Path
Colin Cross2fe66872015-03-30 17:20:39 -070099}
100
101func (j jarSpec) soongJarArgs() string {
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700102 return "-C " + j.dir.String() + " -l " + j.fileList.String()
Colin Cross2fe66872015-03-30 17:20:39 -0700103}
104
Colin Cross635c3b02016-05-18 15:37:25 -0700105func TransformJavaToClasses(ctx android.ModuleContext, srcFiles android.Paths, srcFileLists android.Paths,
106 flags javaBuilderFlags, deps android.Paths) jarSpec {
Colin Cross2fe66872015-03-30 17:20:39 -0700107
Colin Cross635c3b02016-05-18 15:37:25 -0700108 classDir := android.PathForModuleOut(ctx, "classes")
Colin Cross64162712017-08-08 13:17:59 -0700109 annoDir := android.PathForModuleOut(ctx, "anno")
Colin Cross635c3b02016-05-18 15:37:25 -0700110 classFileList := android.PathForModuleOut(ctx, "classes.list")
Colin Cross2fe66872015-03-30 17:20:39 -0700111
Colin Cross635c3b02016-05-18 15:37:25 -0700112 javacFlags := flags.javacFlags + android.JoinWithPrefix(srcFileLists.Strings(), "@")
Colin Crosse7a9f3f2015-04-13 14:02:52 -0700113
114 deps = append(deps, srcFileLists...)
115
Colin Cross635c3b02016-05-18 15:37:25 -0700116 ctx.ModuleBuild(pctx, android.ModuleBuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700117 Rule: javac,
118 Description: "javac",
119 Output: classFileList,
120 Inputs: srcFiles,
121 Implicits: deps,
Colin Cross2fe66872015-03-30 17:20:39 -0700122 Args: map[string]string{
Colin Crosse7a9f3f2015-04-13 14:02:52 -0700123 "javacFlags": javacFlags,
Colin Cross2fe66872015-03-30 17:20:39 -0700124 "bootClasspath": flags.bootClasspath,
125 "classpath": flags.classpath,
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700126 "outDir": classDir.String(),
Colin Cross64162712017-08-08 13:17:59 -0700127 "annoDir": annoDir.String(),
128 "javaVersion": flags.javaVersion,
Colin Cross2fe66872015-03-30 17:20:39 -0700129 },
130 })
131
132 return jarSpec{classFileList, classDir}
133}
134
Colin Cross635c3b02016-05-18 15:37:25 -0700135func TransformClassesToJar(ctx android.ModuleContext, classes []jarSpec,
136 manifest android.OptionalPath) android.Path {
Colin Cross2fe66872015-03-30 17:20:39 -0700137
Colin Cross635c3b02016-05-18 15:37:25 -0700138 outputFile := android.PathForModuleOut(ctx, "classes-full-debug.jar")
Colin Cross2fe66872015-03-30 17:20:39 -0700139
Colin Cross635c3b02016-05-18 15:37:25 -0700140 deps := android.Paths{}
Colin Cross2fe66872015-03-30 17:20:39 -0700141 jarArgs := []string{}
142
143 for _, j := range classes {
144 deps = append(deps, j.fileList)
145 jarArgs = append(jarArgs, j.soongJarArgs())
146 }
147
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700148 if manifest.Valid() {
149 deps = append(deps, manifest.Path())
150 jarArgs = append(jarArgs, "-m "+manifest.String())
Colin Cross2fe66872015-03-30 17:20:39 -0700151 }
152
Colin Cross635c3b02016-05-18 15:37:25 -0700153 ctx.ModuleBuild(pctx, android.ModuleBuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700154 Rule: jar,
155 Description: "jar",
156 Output: outputFile,
157 Implicits: deps,
Colin Cross2fe66872015-03-30 17:20:39 -0700158 Args: map[string]string{
159 "jarArgs": strings.Join(jarArgs, " "),
160 },
161 })
162
163 return outputFile
164}
165
Colin Cross635c3b02016-05-18 15:37:25 -0700166func TransformClassesJarToDex(ctx android.ModuleContext, classesJar android.Path,
Colin Cross6d1e72d2015-04-10 17:44:24 -0700167 flags javaBuilderFlags) jarSpec {
Colin Cross2fe66872015-03-30 17:20:39 -0700168
Colin Cross635c3b02016-05-18 15:37:25 -0700169 outDir := android.PathForModuleOut(ctx, "dex")
170 outputFile := android.PathForModuleOut(ctx, "dex.filelist")
Colin Cross2fe66872015-03-30 17:20:39 -0700171
Colin Cross635c3b02016-05-18 15:37:25 -0700172 ctx.ModuleBuild(pctx, android.ModuleBuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700173 Rule: dx,
174 Description: "dx",
175 Output: outputFile,
176 Input: classesJar,
Colin Cross2fe66872015-03-30 17:20:39 -0700177 Args: map[string]string{
178 "dxFlags": flags.dxFlags,
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700179 "outDir": outDir.String(),
Colin Cross2fe66872015-03-30 17:20:39 -0700180 },
181 })
182
Colin Cross6d1e72d2015-04-10 17:44:24 -0700183 return jarSpec{outputFile, outDir}
Colin Cross2fe66872015-03-30 17:20:39 -0700184}
185
Colin Cross635c3b02016-05-18 15:37:25 -0700186func TransformDexToJavaLib(ctx android.ModuleContext, resources []jarSpec,
187 dexJarSpec jarSpec) android.Path {
Colin Cross2fe66872015-03-30 17:20:39 -0700188
Colin Cross635c3b02016-05-18 15:37:25 -0700189 outputFile := android.PathForModuleOut(ctx, "javalib.jar")
190 var deps android.Paths
Colin Cross2fe66872015-03-30 17:20:39 -0700191 var jarArgs []string
192
193 for _, j := range resources {
194 deps = append(deps, j.fileList)
195 jarArgs = append(jarArgs, j.soongJarArgs())
196 }
197
Colin Cross6d1e72d2015-04-10 17:44:24 -0700198 deps = append(deps, dexJarSpec.fileList)
199 jarArgs = append(jarArgs, dexJarSpec.soongJarArgs())
Colin Cross2fe66872015-03-30 17:20:39 -0700200
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{
207 "jarArgs": strings.Join(jarArgs, " "),
208 },
209 })
210
211 return outputFile
212}
Colin Crosse1d62a82015-04-03 16:53:05 -0700213
Colin Cross635c3b02016-05-18 15:37:25 -0700214func TransformJarJar(ctx android.ModuleContext, classesJar android.Path, rulesFile android.Path) android.Path {
215 outputFile := android.PathForModuleOut(ctx, "classes-jarjar.jar")
216 ctx.ModuleBuild(pctx, android.ModuleBuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700217 Rule: jarjar,
218 Description: "jarjar",
219 Output: outputFile,
220 Input: classesJar,
221 Implicit: rulesFile,
Colin Cross65bf4f22015-04-03 16:54:17 -0700222 Args: map[string]string{
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700223 "rulesFile": rulesFile.String(),
Colin Cross65bf4f22015-04-03 16:54:17 -0700224 },
225 })
226
227 return outputFile
228}
229
Colin Cross635c3b02016-05-18 15:37:25 -0700230func TransformPrebuiltJarToClasses(ctx android.ModuleContext,
Colin Cross74d73e22017-08-02 11:05:49 -0700231 subdir string, prebuilt android.Path) (classJarSpec, resourceJarSpec jarSpec) {
Colin Crosse1d62a82015-04-03 16:53:05 -0700232
Colin Cross74d73e22017-08-02 11:05:49 -0700233 classDir := android.PathForModuleOut(ctx, subdir, "classes")
234 classFileList := android.PathForModuleOut(ctx, subdir, "classes.list")
235 resourceFileList := android.PathForModuleOut(ctx, subdir, "resources.list")
Colin Crosse1d62a82015-04-03 16:53:05 -0700236
Colin Cross635c3b02016-05-18 15:37:25 -0700237 ctx.ModuleBuild(pctx, android.ModuleBuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700238 Rule: extractPrebuilt,
239 Description: "extract classes",
240 Outputs: android.WritablePaths{classFileList, resourceFileList},
241 Input: prebuilt,
Colin Crosse1d62a82015-04-03 16:53:05 -0700242 Args: map[string]string{
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700243 "outDir": classDir.String(),
244 "classFile": classFileList.String(),
245 "resourceFile": resourceFileList.String(),
Colin Crosse1d62a82015-04-03 16:53:05 -0700246 },
247 })
248
249 return jarSpec{classFileList, classDir}, jarSpec{resourceFileList, classDir}
250}