blob: 908619d5f6bcd0572dd3e2c00928a4602adf2e52 [file] [log] [blame]
Makoto Onuki4a9869d2023-10-20 10:42:47 -07001// Copyright 2023 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.
14package java
15
16import (
17 "android/soong/android"
18 "android/soong/tradefed"
19
Makoto Onuki2ca84272024-02-10 00:15:21 +000020 "github.com/google/blueprint"
Makoto Onuki4a9869d2023-10-20 10:42:47 -070021 "github.com/google/blueprint/proptools"
22)
23
24func init() {
25 RegisterRavenwoodBuildComponents(android.InitRegistrationContext)
26}
27
28func RegisterRavenwoodBuildComponents(ctx android.RegistrationContext) {
29 ctx.RegisterModuleType("android_ravenwood_test", ravenwoodTestFactory)
30 ctx.RegisterModuleType("android_ravenwood_libgroup", ravenwoodLibgroupFactory)
31}
32
Makoto Onuki2ca84272024-02-10 00:15:21 +000033var ravenwoodLibContentTag = dependencyTag{name: "ravenwoodlibcontent"}
34var ravenwoodUtilsTag = dependencyTag{name: "ravenwoodutils"}
35var ravenwoodRuntimeTag = dependencyTag{name: "ravenwoodruntime"}
Makoto Onuki4a9869d2023-10-20 10:42:47 -070036
37const ravenwoodUtilsName = "ravenwood-utils"
38const ravenwoodRuntimeName = "ravenwood-runtime"
39
Makoto Onuki2ca84272024-02-10 00:15:21 +000040type ravenwoodLibgroupJniDepProviderInfo struct {
41 // All the jni_libs module names with transient dependencies.
42 names map[string]bool
43}
44
45var ravenwoodLibgroupJniDepProvider = blueprint.NewProvider[ravenwoodLibgroupJniDepProviderInfo]()
46
Makoto Onuki68676572024-02-02 13:29:01 -080047func getLibPath(archType android.ArchType) string {
48 if archType.Multilib == "lib64" {
49 return "lib64"
50 }
51 return "lib"
52}
53
54type ravenwoodTestProperties struct {
55 Jni_libs []string
56}
57
Makoto Onuki4a9869d2023-10-20 10:42:47 -070058type ravenwoodTest struct {
59 Library
60
Makoto Onuki68676572024-02-02 13:29:01 -080061 ravenwoodTestProperties ravenwoodTestProperties
62
Makoto Onuki4a9869d2023-10-20 10:42:47 -070063 testProperties testProperties
64 testConfig android.Path
65
66 forceOSType android.OsType
67 forceArchType android.ArchType
68}
69
70func ravenwoodTestFactory() android.Module {
71 module := &ravenwoodTest{}
72
73 module.addHostAndDeviceProperties()
Makoto Onuki68676572024-02-02 13:29:01 -080074 module.AddProperties(&module.testProperties, &module.ravenwoodTestProperties)
Makoto Onuki4a9869d2023-10-20 10:42:47 -070075
76 module.Module.dexpreopter.isTest = true
77 module.Module.linter.properties.Lint.Test = proptools.BoolPtr(true)
78
Jeff Sharkey4bbf86f2023-11-30 09:29:50 -070079 module.testProperties.Test_suites = []string{
80 "general-tests",
81 "ravenwood-tests",
82 }
Makoto Onuki4a9869d2023-10-20 10:42:47 -070083 module.testProperties.Test_options.Unit_test = proptools.BoolPtr(false)
84
85 InitJavaModule(module, android.DeviceSupported)
86 android.InitDefaultableModule(module)
87
88 return module
89}
90
91func (r *ravenwoodTest) InstallInTestcases() bool { return true }
92func (r *ravenwoodTest) InstallForceOS() (*android.OsType, *android.ArchType) {
93 return &r.forceOSType, &r.forceArchType
94}
95func (r *ravenwoodTest) TestSuites() []string {
96 return r.testProperties.Test_suites
97}
98
99func (r *ravenwoodTest) DepsMutator(ctx android.BottomUpMutatorContext) {
100 r.Library.DepsMutator(ctx)
101
102 // Generically depend on the runtime so that it's installed together with us
Makoto Onuki2ca84272024-02-10 00:15:21 +0000103 ctx.AddVariationDependencies(nil, ravenwoodRuntimeTag, ravenwoodRuntimeName)
Makoto Onuki4a9869d2023-10-20 10:42:47 -0700104
105 // Directly depend on any utils so that we link against them
Makoto Onuki2ca84272024-02-10 00:15:21 +0000106 utils := ctx.AddVariationDependencies(nil, ravenwoodUtilsTag, ravenwoodUtilsName)[0]
Makoto Onuki4a9869d2023-10-20 10:42:47 -0700107 if utils != nil {
108 for _, lib := range utils.(*ravenwoodLibgroup).ravenwoodLibgroupProperties.Libs {
109 ctx.AddVariationDependencies(nil, libTag, lib)
110 }
111 }
Makoto Onuki68676572024-02-02 13:29:01 -0800112
113 // Add jni libs
114 for _, lib := range r.ravenwoodTestProperties.Jni_libs {
Makoto Onuki2ca84272024-02-10 00:15:21 +0000115 ctx.AddVariationDependencies(ctx.Config().BuildOSTarget.Variations(), jniLibTag, lib)
Makoto Onuki68676572024-02-02 13:29:01 -0800116 }
Makoto Onuki4a9869d2023-10-20 10:42:47 -0700117}
118
119func (r *ravenwoodTest) GenerateAndroidBuildActions(ctx android.ModuleContext) {
120 r.forceOSType = ctx.Config().BuildOS
121 r.forceArchType = ctx.Config().BuildArch
122
123 r.testConfig = tradefed.AutoGenTestConfig(ctx, tradefed.AutoGenTestConfigOptions{
124 TestConfigProp: r.testProperties.Test_config,
125 TestConfigTemplateProp: r.testProperties.Test_config_template,
126 TestSuites: r.testProperties.Test_suites,
127 AutoGenConfig: r.testProperties.Auto_gen_config,
128 DeviceTemplate: "${RavenwoodTestConfigTemplate}",
129 HostTemplate: "${RavenwoodTestConfigTemplate}",
130 })
131
132 r.Library.GenerateAndroidBuildActions(ctx)
133
Makoto Onuki2ca84272024-02-10 00:15:21 +0000134 // Start by depending on all files installed by dependencies
Makoto Onuki4a9869d2023-10-20 10:42:47 -0700135 var installDeps android.InstallPaths
Makoto Onuki2ca84272024-02-10 00:15:21 +0000136
137 // All JNI libraries included in the runtime
138 var runtimeJniModuleNames map[string]bool
139
140 if utils := ctx.GetDirectDepsWithTag(ravenwoodUtilsTag)[0]; utils != nil {
141 for _, installFile := range utils.FilesToInstall() {
Makoto Onuki4a9869d2023-10-20 10:42:47 -0700142 installDeps = append(installDeps, installFile)
143 }
Makoto Onuki2ca84272024-02-10 00:15:21 +0000144 jniDeps, ok := android.OtherModuleProvider(ctx, utils, ravenwoodLibgroupJniDepProvider)
145 if ok {
146 runtimeJniModuleNames = jniDeps.names
147 }
Makoto Onuki4a9869d2023-10-20 10:42:47 -0700148 }
149
Makoto Onuki2ca84272024-02-10 00:15:21 +0000150 if runtime := ctx.GetDirectDepsWithTag(ravenwoodRuntimeTag)[0]; runtime != nil {
151 for _, installFile := range runtime.FilesToInstall() {
152 installDeps = append(installDeps, installFile)
153 }
154 jniDeps, ok := android.OtherModuleProvider(ctx, runtime, ravenwoodLibgroupJniDepProvider)
155 if ok {
156 runtimeJniModuleNames = jniDeps.names
157 }
158 }
159
160 // Also remember what JNI libs are in the runtime.
161
Makoto Onuki4a9869d2023-10-20 10:42:47 -0700162 // Also depend on our config
163 installPath := android.PathForModuleInstall(ctx, r.BaseModuleName())
164 installConfig := ctx.InstallFile(installPath, ctx.ModuleName()+".config", r.testConfig)
165 installDeps = append(installDeps, installConfig)
166
Makoto Onuki2ca84272024-02-10 00:15:21 +0000167 // Depend on the JNI libraries, but don't install the ones that the runtime already
168 // contains.
Makoto Onuki68676572024-02-02 13:29:01 -0800169 soInstallPath := installPath.Join(ctx, getLibPath(r.forceArchType))
Makoto Onuki2ca84272024-02-10 00:15:21 +0000170 for _, jniLib := range collectTransitiveJniDeps(ctx) {
171 if _, ok := runtimeJniModuleNames[jniLib.name]; ok {
172 continue // Runtime already includes it.
173 }
174 installJni := ctx.InstallFile(soInstallPath, jniLib.path.Base(), jniLib.path)
Makoto Onuki68676572024-02-02 13:29:01 -0800175 installDeps = append(installDeps, installJni)
176 }
177
178 // Install our JAR with all dependencies
Makoto Onuki4a9869d2023-10-20 10:42:47 -0700179 ctx.InstallFile(installPath, ctx.ModuleName()+".jar", r.outputFile, installDeps...)
180}
181
182func (r *ravenwoodTest) AndroidMkEntries() []android.AndroidMkEntries {
183 entriesList := r.Library.AndroidMkEntries()
184 entries := &entriesList[0]
185 entries.ExtraEntries = append(entries.ExtraEntries,
186 func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) {
187 entries.SetBool("LOCAL_UNINSTALLABLE_MODULE", true)
Jeff Sharkey4bbf86f2023-11-30 09:29:50 -0700188 entries.AddStrings("LOCAL_COMPATIBILITY_SUITE",
189 "general-tests", "ravenwood-tests")
Makoto Onuki4a9869d2023-10-20 10:42:47 -0700190 if r.testConfig != nil {
191 entries.SetPath("LOCAL_FULL_TEST_CONFIG", r.testConfig)
192 }
193 })
194 return entriesList
195}
196
197type ravenwoodLibgroupProperties struct {
198 Libs []string
Makoto Onuki68676572024-02-02 13:29:01 -0800199
200 Jni_libs []string
Makoto Onuki4a9869d2023-10-20 10:42:47 -0700201}
202
203type ravenwoodLibgroup struct {
204 android.ModuleBase
205
206 ravenwoodLibgroupProperties ravenwoodLibgroupProperties
207
208 forceOSType android.OsType
209 forceArchType android.ArchType
210}
211
212func ravenwoodLibgroupFactory() android.Module {
213 module := &ravenwoodLibgroup{}
214 module.AddProperties(&module.ravenwoodLibgroupProperties)
215
216 android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibCommon)
217 return module
218}
219
220func (r *ravenwoodLibgroup) InstallInTestcases() bool { return true }
221func (r *ravenwoodLibgroup) InstallForceOS() (*android.OsType, *android.ArchType) {
222 return &r.forceOSType, &r.forceArchType
223}
224func (r *ravenwoodLibgroup) TestSuites() []string {
Jeff Sharkey4bbf86f2023-11-30 09:29:50 -0700225 return []string{
226 "general-tests",
227 "ravenwood-tests",
228 }
Makoto Onuki4a9869d2023-10-20 10:42:47 -0700229}
230
231func (r *ravenwoodLibgroup) DepsMutator(ctx android.BottomUpMutatorContext) {
232 // Always depends on our underlying libs
233 for _, lib := range r.ravenwoodLibgroupProperties.Libs {
Makoto Onuki2ca84272024-02-10 00:15:21 +0000234 ctx.AddVariationDependencies(nil, ravenwoodLibContentTag, lib)
Makoto Onuki4a9869d2023-10-20 10:42:47 -0700235 }
Makoto Onuki68676572024-02-02 13:29:01 -0800236 for _, lib := range r.ravenwoodLibgroupProperties.Jni_libs {
Makoto Onuki2ca84272024-02-10 00:15:21 +0000237 ctx.AddVariationDependencies(ctx.Config().BuildOSTarget.Variations(), jniLibTag, lib)
Makoto Onuki68676572024-02-02 13:29:01 -0800238 }
Makoto Onuki4a9869d2023-10-20 10:42:47 -0700239}
240
241func (r *ravenwoodLibgroup) GenerateAndroidBuildActions(ctx android.ModuleContext) {
242 r.forceOSType = ctx.Config().BuildOS
243 r.forceArchType = ctx.Config().BuildArch
244
Makoto Onuki2ca84272024-02-10 00:15:21 +0000245 // Collect the JNI dependencies, including the transitive deps.
246 jniDepNames := make(map[string]bool)
247 jniLibs := collectTransitiveJniDeps(ctx)
248
249 for _, jni := range jniLibs {
250 jniDepNames[jni.name] = true
251 }
252 android.SetProvider(ctx, ravenwoodLibgroupJniDepProvider, ravenwoodLibgroupJniDepProviderInfo{
253 names: jniDepNames,
254 })
255
Makoto Onuki4a9869d2023-10-20 10:42:47 -0700256 // Install our runtime into expected location for packaging
257 installPath := android.PathForModuleInstall(ctx, r.BaseModuleName())
258 for _, lib := range r.ravenwoodLibgroupProperties.Libs {
Makoto Onuki2ca84272024-02-10 00:15:21 +0000259 libModule := ctx.GetDirectDepWithTag(lib, ravenwoodLibContentTag)
Makoto Onuki4a9869d2023-10-20 10:42:47 -0700260 libJar := android.OutputFileForModule(ctx, libModule, "")
261 ctx.InstallFile(installPath, lib+".jar", libJar)
262 }
Makoto Onuki68676572024-02-02 13:29:01 -0800263 soInstallPath := android.PathForModuleInstall(ctx, r.BaseModuleName()).Join(ctx, getLibPath(r.forceArchType))
Makoto Onuki2ca84272024-02-10 00:15:21 +0000264
265 for _, jniLib := range jniLibs {
266 ctx.InstallFile(soInstallPath, jniLib.path.Base(), jniLib.path)
Makoto Onuki68676572024-02-02 13:29:01 -0800267 }
Makoto Onuki4a9869d2023-10-20 10:42:47 -0700268
269 // Normal build should perform install steps
270 ctx.Phony(r.BaseModuleName(), android.PathForPhony(ctx, r.BaseModuleName()+"-install"))
271}
Makoto Onuki2ca84272024-02-10 00:15:21 +0000272
273// collectTransitiveJniDeps returns all JNI dependencies, including transitive
274// ones, including NDK / stub libs. (Because Ravenwood has no "preinstalled" libraries)
275func collectTransitiveJniDeps(ctx android.ModuleContext) []jniLib {
276 libs, _ := collectJniDeps(ctx, true, false, nil)
277 return libs
278}