blob: 041c3039852ff86032fd38be56219be2d370f099 [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 (
22 "path/filepath"
23 "strings"
24
Colin Cross635c3b02016-05-18 15:37:25 -070025 "android/soong/android"
Colin Cross2fe66872015-03-30 17:20:39 -070026
27 "github.com/google/blueprint"
Dan Willemsen24f2f8d2015-07-15 14:34:02 -070028 _ "github.com/google/blueprint/bootstrap"
Colin Cross2fe66872015-03-30 17:20:39 -070029)
30
31var (
Colin Cross635c3b02016-05-18 15:37:25 -070032 pctx = android.NewPackageContext("android/soong/java")
Colin Cross2fe66872015-03-30 17:20:39 -070033
34 // Compiling java is not conducive to proper dependency tracking. The path-matches-class-name
35 // requirement leads to unpredictable generated source file names, and a single .java file
36 // will get compiled into multiple .class files if it contains inner classes. To work around
37 // this, all java rules write into separate directories and then a post-processing step lists
38 // the files in the the directory into a list file that later rules depend on (and sometimes
39 // read from directly using @<listfile>)
Yoshisato Yanagisawa572324a2017-06-05 17:41:50 +090040 javac = pctx.AndroidGomaStaticRule("javac",
Colin Cross2fe66872015-03-30 17:20:39 -070041 blueprint.RuleParams{
Colin Cross8cf13342015-04-10 15:41:49 -070042 Command: `rm -rf "$outDir" && mkdir -p "$outDir" && ` +
Yoshisato Yanagisawa572324a2017-06-05 17:41:50 +090043 `${config.JavacWrapper}$javacCmd ` +
44 `-encoding UTF-8 $javacFlags $bootClasspath $classpath ` +
Colin Cross8cf13342015-04-10 15:41:49 -070045 `-extdirs "" -d $outDir @$out.rsp || ( rm -rf "$outDir"; exit 41 ) && ` +
Colin Cross2fe66872015-03-30 17:20:39 -070046 `find $outDir -name "*.class" > $out`,
47 Rspfile: "$out.rsp",
48 RspfileContent: "$in",
Colin Cross2fe66872015-03-30 17:20:39 -070049 },
50 "javacCmd", "javacFlags", "bootClasspath", "classpath", "outDir")
51
Colin Cross9d45bb72016-08-29 16:14:13 -070052 jar = pctx.AndroidStaticRule("jar",
Colin Cross2fe66872015-03-30 17:20:39 -070053 blueprint.RuleParams{
54 Command: `$jarCmd -o $out $jarArgs`,
Dan Willemsenc94a7682015-11-17 15:27:28 -080055 CommandDeps: []string{"$jarCmd"},
Colin Cross2fe66872015-03-30 17:20:39 -070056 },
57 "jarCmd", "jarArgs")
58
Colin Cross9d45bb72016-08-29 16:14:13 -070059 dx = pctx.AndroidStaticRule("dx",
Colin Cross2fe66872015-03-30 17:20:39 -070060 blueprint.RuleParams{
Colin Cross6d1e72d2015-04-10 17:44:24 -070061 Command: `rm -rf "$outDir" && mkdir -p "$outDir" && ` +
62 `$dxCmd --dex --output=$outDir $dxFlags $in || ( rm -rf "$outDir"; exit 41 ) && ` +
63 `find "$outDir" -name "classes*.dex" > $out`,
Dan Willemsenc94a7682015-11-17 15:27:28 -080064 CommandDeps: []string{"$dxCmd"},
Colin Cross2fe66872015-03-30 17:20:39 -070065 },
66 "outDir", "dxFlags")
Colin Crosse1d62a82015-04-03 16:53:05 -070067
Colin Cross9d45bb72016-08-29 16:14:13 -070068 jarjar = pctx.AndroidStaticRule("jarjar",
Colin Cross65bf4f22015-04-03 16:54:17 -070069 blueprint.RuleParams{
70 Command: "java -jar $jarjarCmd process $rulesFile $in $out",
Dan Willemsenc94a7682015-11-17 15:27:28 -080071 CommandDeps: []string{"$jarjarCmd", "$rulesFile"},
Colin Cross65bf4f22015-04-03 16:54:17 -070072 },
73 "rulesFile")
74
Colin Cross9d45bb72016-08-29 16:14:13 -070075 extractPrebuilt = pctx.AndroidStaticRule("extractPrebuilt",
Colin Crosse1d62a82015-04-03 16:53:05 -070076 blueprint.RuleParams{
77 Command: `rm -rf $outDir && unzip -qo $in -d $outDir && ` +
78 `find $outDir -name "*.class" > $classFile && ` +
79 `find $outDir -type f -a \! -name "*.class" -a \! -name "MANIFEST.MF" > $resourceFile || ` +
80 `(rm -rf $outDir; exit 42)`,
Colin Crosse1d62a82015-04-03 16:53:05 -070081 },
82 "outDir", "classFile", "resourceFile")
Colin Cross2fe66872015-03-30 17:20:39 -070083)
84
85func init() {
Dan Willemsen24f2f8d2015-07-15 14:34:02 -070086 pctx.Import("github.com/google/blueprint/bootstrap")
Colin Cross2fe66872015-03-30 17:20:39 -070087 pctx.StaticVariable("commonJdkFlags", "-source 1.7 -target 1.7 -Xmaxerrs 9999999")
88 pctx.StaticVariable("javacCmd", "javac -J-Xmx1024M $commonJdkFlags")
Dan Willemsen47ec28f2016-08-10 16:12:30 -070089 pctx.StaticVariable("jarCmd", filepath.Join("${bootstrap.ToolDir}", "soong_zip"))
Dan Willemsen34cc69e2015-09-23 15:26:20 -070090 pctx.HostBinToolVariable("dxCmd", "dx")
91 pctx.HostJavaToolVariable("jarjarCmd", "jarjar.jar")
Yoshisato Yanagisawa572324a2017-06-05 17:41:50 +090092
93 pctx.VariableFunc("JavacWrapper", func(config interface{}) (string, error) {
94 if override := config.(android.Config).Getenv("JAVAC_WRAPPER"); override != "" {
95 return override + " ", nil
96 }
97 return "", nil
98 })
Colin Cross2fe66872015-03-30 17:20:39 -070099}
100
101type javaBuilderFlags struct {
102 javacFlags string
103 dxFlags string
104 bootClasspath string
105 classpath string
Colin Crossc0b06f12015-04-08 13:03:43 -0700106 aidlFlags string
Colin Cross2fe66872015-03-30 17:20:39 -0700107}
108
109type jarSpec struct {
Colin Cross635c3b02016-05-18 15:37:25 -0700110 fileList, dir android.Path
Colin Cross2fe66872015-03-30 17:20:39 -0700111}
112
113func (j jarSpec) soongJarArgs() string {
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700114 return "-C " + j.dir.String() + " -l " + j.fileList.String()
Colin Cross2fe66872015-03-30 17:20:39 -0700115}
116
Colin Cross635c3b02016-05-18 15:37:25 -0700117func TransformJavaToClasses(ctx android.ModuleContext, srcFiles android.Paths, srcFileLists android.Paths,
118 flags javaBuilderFlags, deps android.Paths) jarSpec {
Colin Cross2fe66872015-03-30 17:20:39 -0700119
Colin Cross635c3b02016-05-18 15:37:25 -0700120 classDir := android.PathForModuleOut(ctx, "classes")
121 classFileList := android.PathForModuleOut(ctx, "classes.list")
Colin Cross2fe66872015-03-30 17:20:39 -0700122
Colin Cross635c3b02016-05-18 15:37:25 -0700123 javacFlags := flags.javacFlags + android.JoinWithPrefix(srcFileLists.Strings(), "@")
Colin Crosse7a9f3f2015-04-13 14:02:52 -0700124
125 deps = append(deps, srcFileLists...)
126
Colin Cross635c3b02016-05-18 15:37:25 -0700127 ctx.ModuleBuild(pctx, android.ModuleBuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700128 Rule: javac,
129 Description: "javac",
130 Output: classFileList,
131 Inputs: srcFiles,
132 Implicits: deps,
Colin Cross2fe66872015-03-30 17:20:39 -0700133 Args: map[string]string{
Colin Crosse7a9f3f2015-04-13 14:02:52 -0700134 "javacFlags": javacFlags,
Colin Cross2fe66872015-03-30 17:20:39 -0700135 "bootClasspath": flags.bootClasspath,
136 "classpath": flags.classpath,
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700137 "outDir": classDir.String(),
Colin Cross2fe66872015-03-30 17:20:39 -0700138 },
139 })
140
141 return jarSpec{classFileList, classDir}
142}
143
Colin Cross635c3b02016-05-18 15:37:25 -0700144func TransformClassesToJar(ctx android.ModuleContext, classes []jarSpec,
145 manifest android.OptionalPath) android.Path {
Colin Cross2fe66872015-03-30 17:20:39 -0700146
Colin Cross635c3b02016-05-18 15:37:25 -0700147 outputFile := android.PathForModuleOut(ctx, "classes-full-debug.jar")
Colin Cross2fe66872015-03-30 17:20:39 -0700148
Colin Cross635c3b02016-05-18 15:37:25 -0700149 deps := android.Paths{}
Colin Cross2fe66872015-03-30 17:20:39 -0700150 jarArgs := []string{}
151
152 for _, j := range classes {
153 deps = append(deps, j.fileList)
154 jarArgs = append(jarArgs, j.soongJarArgs())
155 }
156
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700157 if manifest.Valid() {
158 deps = append(deps, manifest.Path())
159 jarArgs = append(jarArgs, "-m "+manifest.String())
Colin Cross2fe66872015-03-30 17:20:39 -0700160 }
161
Colin Cross635c3b02016-05-18 15:37:25 -0700162 ctx.ModuleBuild(pctx, android.ModuleBuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700163 Rule: jar,
164 Description: "jar",
165 Output: outputFile,
166 Implicits: deps,
Colin Cross2fe66872015-03-30 17:20:39 -0700167 Args: map[string]string{
168 "jarArgs": strings.Join(jarArgs, " "),
169 },
170 })
171
172 return outputFile
173}
174
Colin Cross635c3b02016-05-18 15:37:25 -0700175func TransformClassesJarToDex(ctx android.ModuleContext, classesJar android.Path,
Colin Cross6d1e72d2015-04-10 17:44:24 -0700176 flags javaBuilderFlags) jarSpec {
Colin Cross2fe66872015-03-30 17:20:39 -0700177
Colin Cross635c3b02016-05-18 15:37:25 -0700178 outDir := android.PathForModuleOut(ctx, "dex")
179 outputFile := android.PathForModuleOut(ctx, "dex.filelist")
Colin Cross2fe66872015-03-30 17:20:39 -0700180
Colin Cross635c3b02016-05-18 15:37:25 -0700181 ctx.ModuleBuild(pctx, android.ModuleBuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700182 Rule: dx,
183 Description: "dx",
184 Output: outputFile,
185 Input: classesJar,
Colin Cross2fe66872015-03-30 17:20:39 -0700186 Args: map[string]string{
187 "dxFlags": flags.dxFlags,
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700188 "outDir": outDir.String(),
Colin Cross2fe66872015-03-30 17:20:39 -0700189 },
190 })
191
Colin Cross6d1e72d2015-04-10 17:44:24 -0700192 return jarSpec{outputFile, outDir}
Colin Cross2fe66872015-03-30 17:20:39 -0700193}
194
Colin Cross635c3b02016-05-18 15:37:25 -0700195func TransformDexToJavaLib(ctx android.ModuleContext, resources []jarSpec,
196 dexJarSpec jarSpec) android.Path {
Colin Cross2fe66872015-03-30 17:20:39 -0700197
Colin Cross635c3b02016-05-18 15:37:25 -0700198 outputFile := android.PathForModuleOut(ctx, "javalib.jar")
199 var deps android.Paths
Colin Cross2fe66872015-03-30 17:20:39 -0700200 var jarArgs []string
201
202 for _, j := range resources {
203 deps = append(deps, j.fileList)
204 jarArgs = append(jarArgs, j.soongJarArgs())
205 }
206
Colin Cross6d1e72d2015-04-10 17:44:24 -0700207 deps = append(deps, dexJarSpec.fileList)
208 jarArgs = append(jarArgs, dexJarSpec.soongJarArgs())
Colin Cross2fe66872015-03-30 17:20:39 -0700209
Colin Cross635c3b02016-05-18 15:37:25 -0700210 ctx.ModuleBuild(pctx, android.ModuleBuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700211 Rule: jar,
212 Description: "jar",
213 Output: outputFile,
214 Implicits: deps,
Colin Cross2fe66872015-03-30 17:20:39 -0700215 Args: map[string]string{
216 "jarArgs": strings.Join(jarArgs, " "),
217 },
218 })
219
220 return outputFile
221}
Colin Crosse1d62a82015-04-03 16:53:05 -0700222
Colin Cross635c3b02016-05-18 15:37:25 -0700223func TransformJarJar(ctx android.ModuleContext, classesJar android.Path, rulesFile android.Path) android.Path {
224 outputFile := android.PathForModuleOut(ctx, "classes-jarjar.jar")
225 ctx.ModuleBuild(pctx, android.ModuleBuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700226 Rule: jarjar,
227 Description: "jarjar",
228 Output: outputFile,
229 Input: classesJar,
230 Implicit: rulesFile,
Colin Cross65bf4f22015-04-03 16:54:17 -0700231 Args: map[string]string{
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700232 "rulesFile": rulesFile.String(),
Colin Cross65bf4f22015-04-03 16:54:17 -0700233 },
234 })
235
236 return outputFile
237}
238
Colin Cross635c3b02016-05-18 15:37:25 -0700239func TransformPrebuiltJarToClasses(ctx android.ModuleContext,
240 prebuilt android.Path) (classJarSpec, resourceJarSpec jarSpec) {
Colin Crosse1d62a82015-04-03 16:53:05 -0700241
Colin Cross635c3b02016-05-18 15:37:25 -0700242 classDir := android.PathForModuleOut(ctx, "extracted/classes")
243 classFileList := android.PathForModuleOut(ctx, "extracted/classes.list")
244 resourceFileList := android.PathForModuleOut(ctx, "extracted/resources.list")
Colin Crosse1d62a82015-04-03 16:53:05 -0700245
Colin Cross635c3b02016-05-18 15:37:25 -0700246 ctx.ModuleBuild(pctx, android.ModuleBuildParams{
Colin Cross67a5c132017-05-09 13:45:28 -0700247 Rule: extractPrebuilt,
248 Description: "extract classes",
249 Outputs: android.WritablePaths{classFileList, resourceFileList},
250 Input: prebuilt,
Colin Crosse1d62a82015-04-03 16:53:05 -0700251 Args: map[string]string{
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700252 "outDir": classDir.String(),
253 "classFile": classFileList.String(),
254 "resourceFile": resourceFileList.String(),
Colin Crosse1d62a82015-04-03 16:53:05 -0700255 },
256 })
257
258 return jarSpec{classFileList, classDir}, jarSpec{resourceFileList, classDir}
259}