blob: 834651f54d99bd140bdf11c297837990c3543dcd [file] [log] [blame]
Colin Cross3d7c9822019-03-01 13:46:24 -08001// Copyright 2019 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
17import (
Colin Cross28c3eb62019-04-23 22:04:46 -070018 "fmt"
19 "io"
Colin Cross3d7c9822019-03-01 13:46:24 -080020
Colin Cross28c3eb62019-04-23 22:04:46 -070021 "android/soong/android"
Ulya Trafimovich31e444e2020-08-14 17:32:16 +010022 "android/soong/dexpreopt"
Colin Cross3d7c9822019-03-01 13:46:24 -080023)
24
25type DeviceHostConverter struct {
26 android.ModuleBase
27 android.DefaultableModuleBase
28
29 properties DeviceHostConverterProperties
30
31 headerJars android.Paths
32 implementationJars android.Paths
33 implementationAndResourceJars android.Paths
34 resourceJars android.Paths
Colin Cross28c3eb62019-04-23 22:04:46 -070035
Colin Cross0c4ce212019-05-03 15:28:19 -070036 srcJarArgs []string
37 srcJarDeps android.Paths
38
Colin Cross28c3eb62019-04-23 22:04:46 -070039 combinedHeaderJar android.Path
40 combinedImplementationJar android.Path
Colin Cross3d7c9822019-03-01 13:46:24 -080041}
42
43type DeviceHostConverterProperties struct {
44 // List of modules whose contents will be visible to modules that depend on this module.
45 Libs []string
46}
47
48type DeviceForHost struct {
49 DeviceHostConverter
50}
51
52// java_device_for_host makes the classes.jar output of a device java_library module available to host
53// java_library modules.
54//
Colin Cross440e0d02020-06-11 11:32:11 -070055// It is rarely necessary, and its usage is restricted to a few allowed projects.
Colin Cross3d7c9822019-03-01 13:46:24 -080056func DeviceForHostFactory() android.Module {
57 module := &DeviceForHost{}
58
59 module.AddProperties(&module.properties)
60
61 InitJavaModule(module, android.HostSupported)
62 return module
63}
64
65type HostForDevice struct {
66 DeviceHostConverter
67}
68
69// java_host_for_device makes the classes.jar output of a host java_library module available to device
70// java_library modules.
71//
Colin Cross440e0d02020-06-11 11:32:11 -070072// It is rarely necessary, and its usage is restricted to a few allowed projects.
Colin Cross3d7c9822019-03-01 13:46:24 -080073func HostForDeviceFactory() android.Module {
74 module := &HostForDevice{}
75
76 module.AddProperties(&module.properties)
77
78 InitJavaModule(module, android.DeviceSupported)
79 return module
80}
81
82var deviceHostConverterDepTag = dependencyTag{name: "device_host_converter"}
83
84func (d *DeviceForHost) DepsMutator(ctx android.BottomUpMutatorContext) {
Colin Cross0f7d2ef2019-10-16 11:03:10 -070085 ctx.AddFarVariationDependencies(ctx.Config().AndroidCommonTarget.Variations(),
86 deviceHostConverterDepTag, d.properties.Libs...)
Colin Cross3d7c9822019-03-01 13:46:24 -080087}
88
89func (d *HostForDevice) DepsMutator(ctx android.BottomUpMutatorContext) {
Colin Cross0f7d2ef2019-10-16 11:03:10 -070090 ctx.AddFarVariationDependencies(ctx.Config().BuildOSCommonTarget.Variations(),
91 deviceHostConverterDepTag, d.properties.Libs...)
Colin Cross3d7c9822019-03-01 13:46:24 -080092}
93
94func (d *DeviceHostConverter) GenerateAndroidBuildActions(ctx android.ModuleContext) {
95 if len(d.properties.Libs) < 1 {
96 ctx.PropertyErrorf("libs", "at least one dependency is required")
97 }
98
99 ctx.VisitDirectDepsWithTag(deviceHostConverterDepTag, func(m android.Module) {
Colin Cross313aa542023-12-13 13:47:44 -0800100 if dep, ok := android.OtherModuleProvider(ctx, m, JavaInfoProvider); ok {
Colin Crossdcf71b22021-02-01 13:59:03 -0800101 d.headerJars = append(d.headerJars, dep.HeaderJars...)
102 d.implementationJars = append(d.implementationJars, dep.ImplementationJars...)
103 d.implementationAndResourceJars = append(d.implementationAndResourceJars, dep.ImplementationAndResourcesJars...)
104 d.resourceJars = append(d.resourceJars, dep.ResourceJars...)
Colin Cross0c4ce212019-05-03 15:28:19 -0700105
Colin Crossdcf71b22021-02-01 13:59:03 -0800106 d.srcJarArgs = append(d.srcJarArgs, dep.SrcJarArgs...)
107 d.srcJarDeps = append(d.srcJarDeps, dep.SrcJarDeps...)
Colin Cross3d7c9822019-03-01 13:46:24 -0800108 } else {
109 ctx.PropertyErrorf("libs", "module %q cannot be used as a dependency", ctx.OtherModuleName(m))
110 }
111 })
Colin Cross28c3eb62019-04-23 22:04:46 -0700112
113 jarName := ctx.ModuleName() + ".jar"
114
115 if len(d.implementationAndResourceJars) > 1 {
116 outputFile := android.PathForModuleOut(ctx, "combined", jarName)
117 TransformJarsToJar(ctx, outputFile, "combine", d.implementationAndResourceJars,
118 android.OptionalPath{}, false, nil, nil)
119 d.combinedImplementationJar = outputFile
Dan Willemsen9fe14102021-07-13 21:52:04 -0700120 } else if len(d.implementationAndResourceJars) == 1 {
Colin Cross28c3eb62019-04-23 22:04:46 -0700121 d.combinedImplementationJar = d.implementationAndResourceJars[0]
122 }
123
124 if len(d.headerJars) > 1 {
125 outputFile := android.PathForModuleOut(ctx, "turbine-combined", jarName)
126 TransformJarsToJar(ctx, outputFile, "turbine combine", d.headerJars,
Colin Cross6c6e6cd2019-05-08 14:30:12 -0700127 android.OptionalPath{}, false, nil, []string{"META-INF/TRANSITIVE"})
Colin Cross28c3eb62019-04-23 22:04:46 -0700128 d.combinedHeaderJar = outputFile
Dan Willemsen9fe14102021-07-13 21:52:04 -0700129 } else if len(d.headerJars) == 1 {
Colin Cross28c3eb62019-04-23 22:04:46 -0700130 d.combinedHeaderJar = d.headerJars[0]
131 }
132
Colin Cross40213022023-12-13 15:19:49 -0800133 android.SetProvider(ctx, JavaInfoProvider, JavaInfo{
Colin Crossdcf71b22021-02-01 13:59:03 -0800134 HeaderJars: d.headerJars,
135 ImplementationAndResourcesJars: d.implementationAndResourceJars,
136 ImplementationJars: d.implementationJars,
137 ResourceJars: d.resourceJars,
138 SrcJarArgs: d.srcJarArgs,
139 SrcJarDeps: d.srcJarDeps,
Joe Onorato6fe59eb2023-07-16 13:20:33 -0700140 // TODO: Not sure if aconfig flags that have been moved between device and host variants
141 // make sense.
Colin Crossdcf71b22021-02-01 13:59:03 -0800142 })
Colin Cross3d7c9822019-03-01 13:46:24 -0800143
Colin Crossdcf71b22021-02-01 13:59:03 -0800144}
Colin Cross3d7c9822019-03-01 13:46:24 -0800145
146func (d *DeviceHostConverter) HeaderJars() android.Paths {
147 return d.headerJars
148}
149
Colin Cross3d7c9822019-03-01 13:46:24 -0800150func (d *DeviceHostConverter) ImplementationAndResourcesJars() android.Paths {
151 return d.implementationAndResourceJars
152}
153
Ulyana Trafimovich5539e7b2020-06-04 14:08:17 +0000154func (d *DeviceHostConverter) DexJarBuildPath() android.Path {
Colin Cross3d7c9822019-03-01 13:46:24 -0800155 return nil
156}
157
Ulya Trafimovich9f3052c2020-06-09 14:31:19 +0100158func (d *DeviceHostConverter) DexJarInstallPath() android.Path {
159 return nil
160}
161
Colin Cross3d7c9822019-03-01 13:46:24 -0800162func (d *DeviceHostConverter) AidlIncludeDirs() android.Paths {
163 return nil
164}
165
Ulya Trafimovichb23d28c2020-10-08 12:53:58 +0100166func (d *DeviceHostConverter) ClassLoaderContexts() dexpreopt.ClassLoaderContextMap {
Colin Cross3d7c9822019-03-01 13:46:24 -0800167 return nil
168}
Colin Cross28c3eb62019-04-23 22:04:46 -0700169
Jiyong Park618922e2020-01-08 13:35:43 +0900170func (d *DeviceHostConverter) JacocoReportClassesFile() android.Path {
171 return nil
172}
173
Colin Cross28c3eb62019-04-23 22:04:46 -0700174func (d *DeviceHostConverter) AndroidMk() android.AndroidMkData {
175 return android.AndroidMkData{
176 Class: "JAVA_LIBRARIES",
177 OutputFile: android.OptionalPathForPath(d.combinedImplementationJar),
Dan Willemsen9fe14102021-07-13 21:52:04 -0700178 // Make does not support Windows Java modules
179 Disabled: d.Os() == android.Windows,
180 Include: "$(BUILD_SYSTEM)/soong_java_prebuilt.mk",
Colin Cross28c3eb62019-04-23 22:04:46 -0700181 Extra: []android.AndroidMkExtraFunc{
182 func(w io.Writer, outputFile android.Path) {
183 fmt.Fprintln(w, "LOCAL_UNINSTALLABLE_MODULE := true")
184 fmt.Fprintln(w, "LOCAL_SOONG_HEADER_JAR :=", d.combinedHeaderJar.String())
185 fmt.Fprintln(w, "LOCAL_SOONG_CLASSES_JAR :=", d.combinedImplementationJar.String())
186 },
187 },
188 }
189}