blob: e594d3275a84d5ab82a3c3857b17a80d97a813d4 [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 contains the module types for compiling Java for Android, and converts the properties
18// into the flags and filenames necessary to pass to the compiler. The final creation of the rules
19// is handled in builder.go
20
21import (
22 "fmt"
Colin Cross2fe66872015-03-30 17:20:39 -070023 "strings"
24
25 "github.com/google/blueprint"
Colin Cross2fe66872015-03-30 17:20:39 -070026
Colin Cross463a90e2015-06-17 14:20:06 -070027 "android/soong"
Colin Cross2fe66872015-03-30 17:20:39 -070028 "android/soong/common"
Colin Cross0607cf72015-04-28 13:28:51 -070029 "android/soong/genrule"
Colin Cross2fe66872015-03-30 17:20:39 -070030)
31
Colin Cross463a90e2015-06-17 14:20:06 -070032func init() {
33 soong.RegisterModuleType("java_library", JavaLibraryFactory)
34 soong.RegisterModuleType("java_library_static", JavaLibraryFactory)
35 soong.RegisterModuleType("java_library_host", JavaLibraryHostFactory)
36 soong.RegisterModuleType("java_binary", JavaBinaryFactory)
37 soong.RegisterModuleType("java_binary_host", JavaBinaryHostFactory)
38 soong.RegisterModuleType("prebuilt_java_library", JavaPrebuiltFactory)
39 soong.RegisterModuleType("prebuilt_sdk", SdkPrebuiltFactory)
40 soong.RegisterModuleType("android_app", AndroidAppFactory)
41
42 soong.RegisterSingletonType("logtags", LogtagsSingleton)
43}
44
Colin Cross2fe66872015-03-30 17:20:39 -070045// TODO:
46// Autogenerated files:
Colin Cross2fe66872015-03-30 17:20:39 -070047// Proto
48// Renderscript
49// Post-jar passes:
50// Proguard
51// Emma
52// Jarjar
53// Dex
54// Rmtypedefs
55// Jack
56// DroidDoc
57// Findbugs
58
Colin Cross7d5136f2015-05-11 13:39:40 -070059type javaBaseProperties struct {
60 // list of source files used to compile the Java module. May be .java, .logtags, .proto,
61 // or .aidl files.
Dan Willemsen2ef08f42015-06-30 18:15:24 -070062 Srcs []string `android:"arch_variant"`
63
64 // list of source files that should not be used to build the Java module.
65 // This is most useful in the arch/multilib variants to remove non-common files
66 Exclude_srcs []string `android:"arch_variant"`
Colin Cross7d5136f2015-05-11 13:39:40 -070067
68 // list of directories containing Java resources
69 Java_resource_dirs []string `android:"arch_variant"`
70
Dan Willemsen2ef08f42015-06-30 18:15:24 -070071 // list of directories that should be excluded from java_resource_dirs
72 Exclude_java_resource_dirs []string `android:"arch_variant"`
73
Colin Cross7d5136f2015-05-11 13:39:40 -070074 // don't build against the default libraries (core-libart, core-junit,
75 // ext, and framework for device targets)
76 No_standard_libraries bool
77
78 // list of module-specific flags that will be used for javac compiles
79 Javacflags []string `android:"arch_variant"`
80
81 // list of module-specific flags that will be used for jack compiles
82 Jack_flags []string `android:"arch_variant"`
83
84 // list of module-specific flags that will be used for dex compiles
85 Dxflags []string `android:"arch_variant"`
86
87 // list of of java libraries that will be in the classpath
88 Java_libs []string `android:"arch_variant"`
89
90 // list of java libraries that will be compiled into the resulting jar
91 Java_static_libs []string `android:"arch_variant"`
92
93 // manifest file to be included in resulting jar
Dan Willemsen34cc69e2015-09-23 15:26:20 -070094 Manifest *string
Colin Cross7d5136f2015-05-11 13:39:40 -070095
96 // if not blank, set to the version of the sdk to compile against
97 Sdk_version string
98
99 // Set for device java libraries, and for host versions of device java libraries
100 // built for testing
101 Dex bool `blueprint:"mutated"`
102
103 // if not blank, run jarjar using the specified rules file
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700104 Jarjar_rules *string
Colin Cross7d5136f2015-05-11 13:39:40 -0700105
106 // directories to pass to aidl tool
107 Aidl_includes []string
108
109 // directories that should be added as include directories
110 // for any aidl sources of modules that depend on this module
111 Export_aidl_include_dirs []string
112}
113
Colin Cross2fe66872015-03-30 17:20:39 -0700114// javaBase contains the properties and members used by all java module types, and implements
115// the blueprint.Module interface.
116type javaBase struct {
117 common.AndroidModuleBase
118 module JavaModuleType
119
Colin Cross7d5136f2015-05-11 13:39:40 -0700120 properties javaBaseProperties
Colin Cross2fe66872015-03-30 17:20:39 -0700121
122 // output file suitable for inserting into the classpath of another compile
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700123 classpathFile common.Path
Colin Cross2fe66872015-03-30 17:20:39 -0700124
Colin Crossb7a63242015-04-16 14:09:14 -0700125 // output file suitable for installing or running
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700126 outputFile common.Path
Colin Crossb7a63242015-04-16 14:09:14 -0700127
Colin Cross2fe66872015-03-30 17:20:39 -0700128 // jarSpecs suitable for inserting classes from a static library into another jar
129 classJarSpecs []jarSpec
130
131 // jarSpecs suitable for inserting resources from a static library into another jar
132 resourceJarSpecs []jarSpec
133
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700134 exportAidlIncludeDirs common.Paths
Colin Crossc0b06f12015-04-08 13:03:43 -0700135
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700136 logtagsSrcs common.Paths
Colin Crossf05fe972015-04-10 17:45:20 -0700137
Colin Crossb7a63242015-04-16 14:09:14 -0700138 // filelists of extra source files that should be included in the javac command line,
139 // for example R.java generated by aapt for android apps
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700140 ExtraSrcLists common.Paths
Colin Crossb7a63242015-04-16 14:09:14 -0700141
Colin Cross2fe66872015-03-30 17:20:39 -0700142 // installed file for binary dependency
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700143 installFile common.Path
Colin Cross2fe66872015-03-30 17:20:39 -0700144}
145
Colin Cross6362e272015-10-29 15:25:03 -0700146type AndroidJavaModuleContext common.AndroidBaseContext
147
Colin Cross2fe66872015-03-30 17:20:39 -0700148type JavaModuleType interface {
149 GenerateJavaBuildActions(ctx common.AndroidModuleContext)
Colin Cross6362e272015-10-29 15:25:03 -0700150 JavaDependencies(ctx AndroidJavaModuleContext) []string
Colin Cross2fe66872015-03-30 17:20:39 -0700151}
152
153type JavaDependency interface {
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700154 ClasspathFile() common.Path
Colin Cross2fe66872015-03-30 17:20:39 -0700155 ClassJarSpecs() []jarSpec
156 ResourceJarSpecs() []jarSpec
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700157 AidlIncludeDirs() common.Paths
Colin Cross2fe66872015-03-30 17:20:39 -0700158}
159
160func NewJavaBase(base *javaBase, module JavaModuleType, hod common.HostOrDeviceSupported,
161 props ...interface{}) (blueprint.Module, []interface{}) {
162
163 base.module = module
164
165 props = append(props, &base.properties)
166
167 return common.InitAndroidArchModule(base, hod, common.MultilibCommon, props...)
168}
169
170func (j *javaBase) BootClasspath(ctx common.AndroidBaseContext) string {
171 if ctx.Device() {
172 if j.properties.Sdk_version == "" {
173 return "core-libart"
174 } else if j.properties.Sdk_version == "current" {
175 // TODO: !TARGET_BUILD_APPS
Colin Crossc0b06f12015-04-08 13:03:43 -0700176 // TODO: export preprocessed framework.aidl from android_stubs_current
Colin Cross2fe66872015-03-30 17:20:39 -0700177 return "android_stubs_current"
178 } else if j.properties.Sdk_version == "system_current" {
179 return "android_system_stubs_current"
180 } else {
181 return "sdk_v" + j.properties.Sdk_version
182 }
183 } else {
184 if j.properties.Dex {
185 return "core-libart"
186 } else {
187 return ""
188 }
189 }
190}
191
Colin Crossefb9ebe2015-04-16 14:08:06 -0700192var defaultJavaLibraries = []string{"core-libart", "core-junit", "ext", "framework"}
193
Colin Cross6362e272015-10-29 15:25:03 -0700194func javaDepsMutator(ctx common.AndroidBottomUpMutatorContext) {
195 if j, ok := ctx.Module().(JavaModuleType); ok {
Colin Crossc99deeb2016-04-11 15:06:20 -0700196 ctx.AddDependency(ctx.Module(), nil, j.JavaDependencies(ctx)...)
Colin Cross6362e272015-10-29 15:25:03 -0700197 }
Colin Crossb7a63242015-04-16 14:09:14 -0700198}
199
Colin Cross6362e272015-10-29 15:25:03 -0700200func (j *javaBase) JavaDependencies(ctx AndroidJavaModuleContext) []string {
Colin Cross2fe66872015-03-30 17:20:39 -0700201 var deps []string
202
203 if !j.properties.No_standard_libraries {
204 bootClasspath := j.BootClasspath(ctx)
205 if bootClasspath != "" {
206 deps = append(deps, bootClasspath)
207 }
Colin Crossefb9ebe2015-04-16 14:08:06 -0700208 if ctx.Device() && j.properties.Sdk_version == "" {
209 deps = append(deps, defaultJavaLibraries...)
210 }
Colin Cross2fe66872015-03-30 17:20:39 -0700211 }
212 deps = append(deps, j.properties.Java_libs...)
213 deps = append(deps, j.properties.Java_static_libs...)
214
215 return deps
216}
217
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700218func (j *javaBase) aidlFlags(ctx common.AndroidModuleContext, aidlPreprocess common.OptionalPath,
219 aidlIncludeDirs common.Paths) []string {
Colin Crossc0b06f12015-04-08 13:03:43 -0700220
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700221 localAidlIncludes := common.PathsForModuleSrc(ctx, j.properties.Aidl_includes)
Colin Crossc0b06f12015-04-08 13:03:43 -0700222
223 var flags []string
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700224 if aidlPreprocess.Valid() {
225 flags = append(flags, "-p"+aidlPreprocess.String())
Colin Crossc0b06f12015-04-08 13:03:43 -0700226 } else {
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700227 flags = append(flags, common.JoinWithPrefix(aidlIncludeDirs.Strings(), "-I"))
Colin Crossc0b06f12015-04-08 13:03:43 -0700228 }
229
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700230 flags = append(flags, common.JoinWithPrefix(j.exportAidlIncludeDirs.Strings(), "-I"))
231 flags = append(flags, common.JoinWithPrefix(localAidlIncludes.Strings(), "-I"))
232 flags = append(flags, "-I"+common.PathForModuleSrc(ctx).String())
233 flags = append(flags, "-I"+common.PathForModuleSrc(ctx, "src").String())
Colin Crossc0b06f12015-04-08 13:03:43 -0700234
Colin Crossf03c82b2015-04-13 13:53:40 -0700235 return flags
Colin Crossc0b06f12015-04-08 13:03:43 -0700236}
237
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700238func (j *javaBase) collectDeps(ctx common.AndroidModuleContext) (classpath common.Paths,
239 bootClasspath common.OptionalPath, classJarSpecs, resourceJarSpecs []jarSpec, aidlPreprocess common.OptionalPath,
240 aidlIncludeDirs common.Paths, srcFileLists common.Paths) {
Colin Cross2fe66872015-03-30 17:20:39 -0700241
242 ctx.VisitDirectDeps(func(module blueprint.Module) {
243 otherName := ctx.OtherModuleName(module)
244 if javaDep, ok := module.(JavaDependency); ok {
Colin Cross6cbb1272015-04-08 11:23:01 -0700245 if otherName == j.BootClasspath(ctx) {
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700246 bootClasspath = common.OptionalPathForPath(javaDep.ClasspathFile())
Colin Crossb7a63242015-04-16 14:09:14 -0700247 } else if inList(otherName, defaultJavaLibraries) {
248 classpath = append(classpath, javaDep.ClasspathFile())
Colin Cross6cbb1272015-04-08 11:23:01 -0700249 } else if inList(otherName, j.properties.Java_libs) {
Colin Cross2fe66872015-03-30 17:20:39 -0700250 classpath = append(classpath, javaDep.ClasspathFile())
251 } else if inList(otherName, j.properties.Java_static_libs) {
252 classpath = append(classpath, javaDep.ClasspathFile())
253 classJarSpecs = append(classJarSpecs, javaDep.ClassJarSpecs()...)
254 resourceJarSpecs = append(resourceJarSpecs, javaDep.ResourceJarSpecs()...)
Colin Crossb7a63242015-04-16 14:09:14 -0700255 } else if otherName == "framework-res" {
256 if ctx.ModuleName() == "framework" {
257 // framework.jar has a one-off dependency on the R.java and Manifest.java files
258 // generated by framework-res.apk
259 srcFileLists = append(srcFileLists, module.(*javaBase).module.(*AndroidApp).aaptJavaFileList)
260 }
Colin Cross2fe66872015-03-30 17:20:39 -0700261 } else {
262 panic(fmt.Errorf("unknown dependency %q for %q", otherName, ctx.ModuleName()))
263 }
Colin Crossaa8630b2015-04-13 13:52:22 -0700264 aidlIncludeDirs = append(aidlIncludeDirs, javaDep.AidlIncludeDirs()...)
265 if sdkDep, ok := module.(sdkDependency); ok {
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700266 if sdkDep.AidlPreprocessed().Valid() {
267 if aidlPreprocess.Valid() {
Colin Crossaa8630b2015-04-13 13:52:22 -0700268 ctx.ModuleErrorf("multiple dependencies with preprocessed aidls:\n %q\n %q",
269 aidlPreprocess, sdkDep.AidlPreprocessed())
270 } else {
271 aidlPreprocess = sdkDep.AidlPreprocessed()
272 }
Colin Crossc0b06f12015-04-08 13:03:43 -0700273 }
274 }
Colin Cross2fe66872015-03-30 17:20:39 -0700275 }
276 })
277
Colin Crosse7a9f3f2015-04-13 14:02:52 -0700278 return classpath, bootClasspath, classJarSpecs, resourceJarSpecs, aidlPreprocess,
279 aidlIncludeDirs, srcFileLists
Colin Cross2fe66872015-03-30 17:20:39 -0700280}
281
282func (j *javaBase) GenerateAndroidBuildActions(ctx common.AndroidModuleContext) {
283 j.module.GenerateJavaBuildActions(ctx)
284}
285
286func (j *javaBase) GenerateJavaBuildActions(ctx common.AndroidModuleContext) {
Colin Crossc0b06f12015-04-08 13:03:43 -0700287
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700288 j.exportAidlIncludeDirs = common.PathsForModuleSrc(ctx, j.properties.Export_aidl_include_dirs)
Colin Crossc0b06f12015-04-08 13:03:43 -0700289
290 classpath, bootClasspath, classJarSpecs, resourceJarSpecs, aidlPreprocess,
Colin Crosse7a9f3f2015-04-13 14:02:52 -0700291 aidlIncludeDirs, srcFileLists := j.collectDeps(ctx)
Colin Crossc0b06f12015-04-08 13:03:43 -0700292
Colin Crossf03c82b2015-04-13 13:53:40 -0700293 var flags javaBuilderFlags
294
295 javacFlags := j.properties.Javacflags
296 if len(javacFlags) > 0 {
297 ctx.Variable(pctx, "javacFlags", strings.Join(javacFlags, " "))
298 flags.javacFlags = "$javacFlags"
299 }
300
301 aidlFlags := j.aidlFlags(ctx, aidlPreprocess, aidlIncludeDirs)
302 if len(aidlFlags) > 0 {
303 ctx.Variable(pctx, "aidlFlags", strings.Join(aidlFlags, " "))
304 flags.aidlFlags = "$aidlFlags"
Colin Cross2fe66872015-03-30 17:20:39 -0700305 }
306
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700307 var javacDeps common.Paths
Colin Cross2fe66872015-03-30 17:20:39 -0700308
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700309 if bootClasspath.Valid() {
310 flags.bootClasspath = "-bootclasspath " + bootClasspath.String()
311 javacDeps = append(javacDeps, bootClasspath.Path())
Colin Cross2fe66872015-03-30 17:20:39 -0700312 }
313
314 if len(classpath) > 0 {
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700315 flags.classpath = "-classpath " + strings.Join(classpath.Strings(), ":")
Colin Cross2fe66872015-03-30 17:20:39 -0700316 javacDeps = append(javacDeps, classpath...)
317 }
318
Dan Willemsen2ef08f42015-06-30 18:15:24 -0700319 srcFiles := ctx.ExpandSources(j.properties.Srcs, j.properties.Exclude_srcs)
Colin Crossc0b06f12015-04-08 13:03:43 -0700320
Colin Crossf05fe972015-04-10 17:45:20 -0700321 srcFiles = j.genSources(ctx, srcFiles, flags)
Colin Crossc0b06f12015-04-08 13:03:43 -0700322
Colin Cross0607cf72015-04-28 13:28:51 -0700323 ctx.VisitDirectDeps(func(module blueprint.Module) {
324 if gen, ok := module.(genrule.SourceFileGenerator); ok {
325 srcFiles = append(srcFiles, gen.GeneratedSourceFiles()...)
326 }
327 })
328
Colin Crossb7a63242015-04-16 14:09:14 -0700329 srcFileLists = append(srcFileLists, j.ExtraSrcLists...)
330
Colin Cross8cf13342015-04-10 15:41:49 -0700331 if len(srcFiles) > 0 {
332 // Compile java sources into .class files
Colin Crosse7a9f3f2015-04-13 14:02:52 -0700333 classes := TransformJavaToClasses(ctx, srcFiles, srcFileLists, flags, javacDeps)
Colin Cross8cf13342015-04-10 15:41:49 -0700334 if ctx.Failed() {
335 return
336 }
337
338 classJarSpecs = append([]jarSpec{classes}, classJarSpecs...)
Colin Cross2fe66872015-03-30 17:20:39 -0700339 }
340
Dan Willemsen2ef08f42015-06-30 18:15:24 -0700341 resourceJarSpecs = append(ResourceDirsToJarSpecs(ctx, j.properties.Java_resource_dirs, j.properties.Exclude_java_resource_dirs),
Colin Cross276284f2015-04-20 13:51:48 -0700342 resourceJarSpecs...)
Colin Cross2fe66872015-03-30 17:20:39 -0700343
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700344 manifest := common.OptionalPathForModuleSrc(ctx, j.properties.Manifest)
Colin Cross2fe66872015-03-30 17:20:39 -0700345
346 allJarSpecs := append([]jarSpec(nil), classJarSpecs...)
347 allJarSpecs = append(allJarSpecs, resourceJarSpecs...)
348
349 // Combine classes + resources into classes-full-debug.jar
350 outputFile := TransformClassesToJar(ctx, allJarSpecs, manifest)
351 if ctx.Failed() {
352 return
353 }
Colin Cross65bf4f22015-04-03 16:54:17 -0700354
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700355 if j.properties.Jarjar_rules != nil {
356 jarjar_rules := common.PathForModuleSrc(ctx, *j.properties.Jarjar_rules)
Colin Cross65bf4f22015-04-03 16:54:17 -0700357 // Transform classes-full-debug.jar into classes-jarjar.jar
358 outputFile = TransformJarJar(ctx, outputFile, jarjar_rules)
359 if ctx.Failed() {
360 return
361 }
Colin Cross20978302015-04-10 17:05:07 -0700362
363 classes, _ := TransformPrebuiltJarToClasses(ctx, outputFile)
364 classJarSpecs = []jarSpec{classes}
Colin Cross65bf4f22015-04-03 16:54:17 -0700365 }
366
Colin Cross20978302015-04-10 17:05:07 -0700367 j.resourceJarSpecs = resourceJarSpecs
368 j.classJarSpecs = classJarSpecs
Colin Cross2fe66872015-03-30 17:20:39 -0700369 j.classpathFile = outputFile
370
Colin Cross8cf13342015-04-10 15:41:49 -0700371 if j.properties.Dex && len(srcFiles) > 0 {
Colin Cross2fe66872015-03-30 17:20:39 -0700372 dxFlags := j.properties.Dxflags
373 if false /* emma enabled */ {
374 // If you instrument class files that have local variable debug information in
375 // them emma does not correctly maintain the local variable table.
376 // This will cause an error when you try to convert the class files for Android.
377 // The workaround here is to build different dex file here based on emma switch
378 // then later copy into classes.dex. When emma is on, dx is run with --no-locals
379 // option to remove local variable information
380 dxFlags = append(dxFlags, "--no-locals")
381 }
382
Colin Cross1332b002015-04-07 17:11:30 -0700383 if ctx.AConfig().Getenv("NO_OPTIMIZE_DX") != "" {
Colin Cross2fe66872015-03-30 17:20:39 -0700384 dxFlags = append(dxFlags, "--no-optimize")
385 }
386
Colin Cross1332b002015-04-07 17:11:30 -0700387 if ctx.AConfig().Getenv("GENERATE_DEX_DEBUG") != "" {
Colin Cross2fe66872015-03-30 17:20:39 -0700388 dxFlags = append(dxFlags,
389 "--debug",
390 "--verbose",
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700391 "--dump-to="+common.PathForModuleOut(ctx, "classes.lst").String(),
Colin Cross2fe66872015-03-30 17:20:39 -0700392 "--dump-width=1000")
393 }
394
395 flags.dxFlags = strings.Join(dxFlags, " ")
396
397 // Compile classes.jar into classes.dex
Colin Cross6d1e72d2015-04-10 17:44:24 -0700398 dexJarSpec := TransformClassesJarToDex(ctx, outputFile, flags)
Colin Cross2fe66872015-03-30 17:20:39 -0700399 if ctx.Failed() {
400 return
401 }
402
403 // Combine classes.dex + resources into javalib.jar
Colin Cross6d1e72d2015-04-10 17:44:24 -0700404 outputFile = TransformDexToJavaLib(ctx, resourceJarSpecs, dexJarSpec)
Colin Cross2fe66872015-03-30 17:20:39 -0700405 }
Colin Crossb7a63242015-04-16 14:09:14 -0700406 ctx.CheckbuildFile(outputFile)
407 j.outputFile = outputFile
Colin Cross2fe66872015-03-30 17:20:39 -0700408}
409
410var _ JavaDependency = (*JavaLibrary)(nil)
411
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700412func (j *javaBase) ClasspathFile() common.Path {
Colin Cross2fe66872015-03-30 17:20:39 -0700413 return j.classpathFile
414}
415
416func (j *javaBase) ClassJarSpecs() []jarSpec {
417 return j.classJarSpecs
418}
419
420func (j *javaBase) ResourceJarSpecs() []jarSpec {
421 return j.resourceJarSpecs
422}
423
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700424func (j *javaBase) AidlIncludeDirs() common.Paths {
Colin Crossc0b06f12015-04-08 13:03:43 -0700425 return j.exportAidlIncludeDirs
426}
427
Colin Crossf05fe972015-04-10 17:45:20 -0700428var _ logtagsProducer = (*javaBase)(nil)
429
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700430func (j *javaBase) logtags() common.Paths {
Colin Crossf05fe972015-04-10 17:45:20 -0700431 return j.logtagsSrcs
432}
433
Colin Cross2fe66872015-03-30 17:20:39 -0700434//
435// Java libraries (.jar file)
436//
437
438type JavaLibrary struct {
439 javaBase
440}
441
Colin Crossb7a63242015-04-16 14:09:14 -0700442func (j *JavaLibrary) GenerateJavaBuildActions(ctx common.AndroidModuleContext) {
443 j.javaBase.GenerateJavaBuildActions(ctx)
444
Dan Willemsen782a2d12015-12-21 14:55:28 -0800445 j.installFile = ctx.InstallFileName(common.PathForModuleInstall(ctx, "framework"), ctx.ModuleName()+".jar", j.outputFile)
Colin Crossb7a63242015-04-16 14:09:14 -0700446}
447
Colin Cross2fe66872015-03-30 17:20:39 -0700448func JavaLibraryFactory() (blueprint.Module, []interface{}) {
449 module := &JavaLibrary{}
450
451 module.properties.Dex = true
452
453 return NewJavaBase(&module.javaBase, module, common.HostAndDeviceSupported)
454}
455
456func JavaLibraryHostFactory() (blueprint.Module, []interface{}) {
457 module := &JavaLibrary{}
458
459 return NewJavaBase(&module.javaBase, module, common.HostSupported)
460}
461
462//
463// Java Binaries (.jar file plus wrapper script)
464//
465
Colin Cross7d5136f2015-05-11 13:39:40 -0700466type javaBinaryProperties struct {
467 // installable script to execute the resulting jar
468 Wrapper string
469}
470
Colin Cross2fe66872015-03-30 17:20:39 -0700471type JavaBinary struct {
472 JavaLibrary
473
Colin Cross7d5136f2015-05-11 13:39:40 -0700474 binaryProperties javaBinaryProperties
Colin Cross2fe66872015-03-30 17:20:39 -0700475}
476
477func (j *JavaBinary) GenerateJavaBuildActions(ctx common.AndroidModuleContext) {
478 j.JavaLibrary.GenerateJavaBuildActions(ctx)
479
480 // Depend on the installed jar (j.installFile) so that the wrapper doesn't get executed by
481 // another build rule before the jar has been installed.
Dan Willemsen782a2d12015-12-21 14:55:28 -0800482 ctx.InstallFile(common.PathForModuleInstall(ctx, "bin"), common.PathForModuleSrc(ctx, j.binaryProperties.Wrapper),
Colin Cross2fe66872015-03-30 17:20:39 -0700483 j.installFile)
484}
485
486func JavaBinaryFactory() (blueprint.Module, []interface{}) {
487 module := &JavaBinary{}
488
489 module.properties.Dex = true
490
491 return NewJavaBase(&module.javaBase, module, common.HostAndDeviceSupported, &module.binaryProperties)
492}
493
494func JavaBinaryHostFactory() (blueprint.Module, []interface{}) {
495 module := &JavaBinary{}
496
497 return NewJavaBase(&module.javaBase, module, common.HostSupported, &module.binaryProperties)
498}
499
500//
501// Java prebuilts
502//
503
Colin Cross7d5136f2015-05-11 13:39:40 -0700504type javaPrebuiltProperties struct {
505 Srcs []string
506}
507
Colin Cross2fe66872015-03-30 17:20:39 -0700508type JavaPrebuilt struct {
509 common.AndroidModuleBase
510
Colin Cross7d5136f2015-05-11 13:39:40 -0700511 properties javaPrebuiltProperties
Colin Cross2fe66872015-03-30 17:20:39 -0700512
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700513 classpathFile common.Path
Colin Crosse1d62a82015-04-03 16:53:05 -0700514 classJarSpecs, resourceJarSpecs []jarSpec
Colin Cross2fe66872015-03-30 17:20:39 -0700515}
516
517func (j *JavaPrebuilt) GenerateAndroidBuildActions(ctx common.AndroidModuleContext) {
518 if len(j.properties.Srcs) != 1 {
519 ctx.ModuleErrorf("expected exactly one jar in srcs")
520 return
521 }
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700522 prebuilt := common.PathForModuleSrc(ctx, j.properties.Srcs[0])
Colin Crosse1d62a82015-04-03 16:53:05 -0700523
524 classJarSpec, resourceJarSpec := TransformPrebuiltJarToClasses(ctx, prebuilt)
525
526 j.classpathFile = prebuilt
527 j.classJarSpecs = []jarSpec{classJarSpec}
528 j.resourceJarSpecs = []jarSpec{resourceJarSpec}
Dan Willemsen782a2d12015-12-21 14:55:28 -0800529 ctx.InstallFileName(common.PathForModuleInstall(ctx, "framework"), ctx.ModuleName()+".jar", j.classpathFile)
Colin Cross2fe66872015-03-30 17:20:39 -0700530}
531
532var _ JavaDependency = (*JavaPrebuilt)(nil)
533
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700534func (j *JavaPrebuilt) ClasspathFile() common.Path {
Colin Cross2fe66872015-03-30 17:20:39 -0700535 return j.classpathFile
536}
537
538func (j *JavaPrebuilt) ClassJarSpecs() []jarSpec {
Colin Crosse1d62a82015-04-03 16:53:05 -0700539 return j.classJarSpecs
Colin Cross2fe66872015-03-30 17:20:39 -0700540}
541
542func (j *JavaPrebuilt) ResourceJarSpecs() []jarSpec {
Colin Crosse1d62a82015-04-03 16:53:05 -0700543 return j.resourceJarSpecs
Colin Cross2fe66872015-03-30 17:20:39 -0700544}
545
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700546func (j *JavaPrebuilt) AidlIncludeDirs() common.Paths {
Colin Crossc0b06f12015-04-08 13:03:43 -0700547 return nil
548}
549
Colin Cross2fe66872015-03-30 17:20:39 -0700550func JavaPrebuiltFactory() (blueprint.Module, []interface{}) {
551 module := &JavaPrebuilt{}
552
553 return common.InitAndroidArchModule(module, common.HostAndDeviceSupported,
554 common.MultilibCommon, &module.properties)
555}
556
Colin Crossaa8630b2015-04-13 13:52:22 -0700557//
558// SDK java prebuilts (.jar containing resources plus framework.aidl)
559//
560
561type sdkDependency interface {
562 JavaDependency
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700563 AidlPreprocessed() common.OptionalPath
Colin Crossaa8630b2015-04-13 13:52:22 -0700564}
565
566var _ sdkDependency = (*sdkPrebuilt)(nil)
567
Colin Cross7d5136f2015-05-11 13:39:40 -0700568type sdkPrebuiltProperties struct {
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700569 Aidl_preprocessed *string
Colin Cross7d5136f2015-05-11 13:39:40 -0700570}
571
Colin Crossaa8630b2015-04-13 13:52:22 -0700572type sdkPrebuilt struct {
573 JavaPrebuilt
574
Colin Cross7d5136f2015-05-11 13:39:40 -0700575 sdkProperties sdkPrebuiltProperties
Colin Crossaa8630b2015-04-13 13:52:22 -0700576
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700577 aidlPreprocessed common.OptionalPath
Colin Crossaa8630b2015-04-13 13:52:22 -0700578}
579
580func (j *sdkPrebuilt) GenerateAndroidBuildActions(ctx common.AndroidModuleContext) {
581 j.JavaPrebuilt.GenerateAndroidBuildActions(ctx)
582
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700583 j.aidlPreprocessed = common.OptionalPathForModuleSrc(ctx, j.sdkProperties.Aidl_preprocessed)
Colin Crossaa8630b2015-04-13 13:52:22 -0700584}
585
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700586func (j *sdkPrebuilt) AidlPreprocessed() common.OptionalPath {
Colin Crossaa8630b2015-04-13 13:52:22 -0700587 return j.aidlPreprocessed
588}
589
590func SdkPrebuiltFactory() (blueprint.Module, []interface{}) {
591 module := &sdkPrebuilt{}
592
593 return common.InitAndroidArchModule(module, common.HostAndDeviceSupported,
594 common.MultilibCommon, &module.properties, &module.sdkProperties)
595}
596
Colin Cross2fe66872015-03-30 17:20:39 -0700597func inList(s string, l []string) bool {
598 for _, e := range l {
599 if e == s {
600 return true
601 }
602 }
603 return false
604}