1*333d2b36SAndroid Build Coastguard Worker// Copyright 2023 Google Inc. All rights reserved. 2*333d2b36SAndroid Build Coastguard Worker// 3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*333d2b36SAndroid Build Coastguard Worker// 7*333d2b36SAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 8*333d2b36SAndroid Build Coastguard Worker// 9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*333d2b36SAndroid Build Coastguard Worker// limitations under the License. 14*333d2b36SAndroid Build Coastguard Workerpackage java 15*333d2b36SAndroid Build Coastguard Worker 16*333d2b36SAndroid Build Coastguard Workerimport ( 17*333d2b36SAndroid Build Coastguard Worker "strconv" 18*333d2b36SAndroid Build Coastguard Worker 19*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 20*333d2b36SAndroid Build Coastguard Worker "android/soong/tradefed" 21*333d2b36SAndroid Build Coastguard Worker 22*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint" 23*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint/proptools" 24*333d2b36SAndroid Build Coastguard Worker) 25*333d2b36SAndroid Build Coastguard Worker 26*333d2b36SAndroid Build Coastguard Workerfunc init() { 27*333d2b36SAndroid Build Coastguard Worker RegisterRavenwoodBuildComponents(android.InitRegistrationContext) 28*333d2b36SAndroid Build Coastguard Worker} 29*333d2b36SAndroid Build Coastguard Worker 30*333d2b36SAndroid Build Coastguard Workerfunc RegisterRavenwoodBuildComponents(ctx android.RegistrationContext) { 31*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("android_ravenwood_test", ravenwoodTestFactory) 32*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("android_ravenwood_libgroup", ravenwoodLibgroupFactory) 33*333d2b36SAndroid Build Coastguard Worker} 34*333d2b36SAndroid Build Coastguard Worker 35*333d2b36SAndroid Build Coastguard Workervar ravenwoodLibContentTag = dependencyTag{name: "ravenwoodlibcontent"} 36*333d2b36SAndroid Build Coastguard Workervar ravenwoodUtilsTag = dependencyTag{name: "ravenwoodutils"} 37*333d2b36SAndroid Build Coastguard Workervar ravenwoodRuntimeTag = dependencyTag{name: "ravenwoodruntime"} 38*333d2b36SAndroid Build Coastguard Workervar ravenwoodTestResourceApkTag = dependencyTag{name: "ravenwoodtestresapk"} 39*333d2b36SAndroid Build Coastguard Workervar ravenwoodTestInstResourceApkTag = dependencyTag{name: "ravenwoodtest-inst-res-apk"} 40*333d2b36SAndroid Build Coastguard Worker 41*333d2b36SAndroid Build Coastguard Workervar genManifestProperties = pctx.AndroidStaticRule("genManifestProperties", 42*333d2b36SAndroid Build Coastguard Worker blueprint.RuleParams{ 43*333d2b36SAndroid Build Coastguard Worker Command: "echo targetSdkVersionInt=$targetSdkVersionInt > $out && " + 44*333d2b36SAndroid Build Coastguard Worker "echo targetSdkVersionRaw=$targetSdkVersionRaw >> $out && " + 45*333d2b36SAndroid Build Coastguard Worker "echo packageName=$packageName >> $out && " + 46*333d2b36SAndroid Build Coastguard Worker "echo instPackageName=$instPackageName >> $out", 47*333d2b36SAndroid Build Coastguard Worker }, "targetSdkVersionInt", "targetSdkVersionRaw", "packageName", "instPackageName") 48*333d2b36SAndroid Build Coastguard Worker 49*333d2b36SAndroid Build Coastguard Workerconst ravenwoodUtilsName = "ravenwood-utils" 50*333d2b36SAndroid Build Coastguard Workerconst ravenwoodRuntimeName = "ravenwood-runtime" 51*333d2b36SAndroid Build Coastguard Worker 52*333d2b36SAndroid Build Coastguard Workertype ravenwoodLibgroupJniDepProviderInfo struct { 53*333d2b36SAndroid Build Coastguard Worker // All the jni_libs module names with transient dependencies. 54*333d2b36SAndroid Build Coastguard Worker names map[string]bool 55*333d2b36SAndroid Build Coastguard Worker} 56*333d2b36SAndroid Build Coastguard Worker 57*333d2b36SAndroid Build Coastguard Workervar ravenwoodLibgroupJniDepProvider = blueprint.NewProvider[ravenwoodLibgroupJniDepProviderInfo]() 58*333d2b36SAndroid Build Coastguard Worker 59*333d2b36SAndroid Build Coastguard Workerfunc getLibPath(archType android.ArchType) string { 60*333d2b36SAndroid Build Coastguard Worker if archType.Multilib == "lib64" { 61*333d2b36SAndroid Build Coastguard Worker return "lib64" 62*333d2b36SAndroid Build Coastguard Worker } 63*333d2b36SAndroid Build Coastguard Worker return "lib" 64*333d2b36SAndroid Build Coastguard Worker} 65*333d2b36SAndroid Build Coastguard Worker 66*333d2b36SAndroid Build Coastguard Workertype ravenwoodTestProperties struct { 67*333d2b36SAndroid Build Coastguard Worker Jni_libs proptools.Configurable[[]string] 68*333d2b36SAndroid Build Coastguard Worker 69*333d2b36SAndroid Build Coastguard Worker // Specify another android_app module here to copy it to the test directory, so that 70*333d2b36SAndroid Build Coastguard Worker // the ravenwood test can access it. This APK will be loaded as resources of the test 71*333d2b36SAndroid Build Coastguard Worker // target app. 72*333d2b36SAndroid Build Coastguard Worker // TODO: For now, we simply refer to another android_app module and copy it to the 73*333d2b36SAndroid Build Coastguard Worker // test directory. Eventually, android_ravenwood_test should support all the resource 74*333d2b36SAndroid Build Coastguard Worker // related properties and build resources from the `res/` directory. 75*333d2b36SAndroid Build Coastguard Worker Resource_apk *string 76*333d2b36SAndroid Build Coastguard Worker 77*333d2b36SAndroid Build Coastguard Worker // Specify another android_app module here to copy it to the test directory, so that 78*333d2b36SAndroid Build Coastguard Worker // the ravenwood test can access it. This APK will be loaded as resources of the test 79*333d2b36SAndroid Build Coastguard Worker // instrumentation app itself. 80*333d2b36SAndroid Build Coastguard Worker Inst_resource_apk *string 81*333d2b36SAndroid Build Coastguard Worker 82*333d2b36SAndroid Build Coastguard Worker // Specify the package name of the test target apk. 83*333d2b36SAndroid Build Coastguard Worker // This will be set to the target Context's package name. 84*333d2b36SAndroid Build Coastguard Worker // (i.e. Instrumentation.getTargetContext().getPackageName()) 85*333d2b36SAndroid Build Coastguard Worker // If this is omitted, Package_name will be used. 86*333d2b36SAndroid Build Coastguard Worker Package_name *string 87*333d2b36SAndroid Build Coastguard Worker 88*333d2b36SAndroid Build Coastguard Worker // Specify the package name of this test module. 89*333d2b36SAndroid Build Coastguard Worker // This will be set to the test Context's package name. 90*333d2b36SAndroid Build Coastguard Worker //(i.e. Instrumentation.getContext().getPackageName()) 91*333d2b36SAndroid Build Coastguard Worker Inst_package_name *string 92*333d2b36SAndroid Build Coastguard Worker} 93*333d2b36SAndroid Build Coastguard Worker 94*333d2b36SAndroid Build Coastguard Workertype ravenwoodTest struct { 95*333d2b36SAndroid Build Coastguard Worker Library 96*333d2b36SAndroid Build Coastguard Worker 97*333d2b36SAndroid Build Coastguard Worker ravenwoodTestProperties ravenwoodTestProperties 98*333d2b36SAndroid Build Coastguard Worker 99*333d2b36SAndroid Build Coastguard Worker testProperties testProperties 100*333d2b36SAndroid Build Coastguard Worker testConfig android.Path 101*333d2b36SAndroid Build Coastguard Worker 102*333d2b36SAndroid Build Coastguard Worker forceOSType android.OsType 103*333d2b36SAndroid Build Coastguard Worker forceArchType android.ArchType 104*333d2b36SAndroid Build Coastguard Worker} 105*333d2b36SAndroid Build Coastguard Worker 106*333d2b36SAndroid Build Coastguard Workerfunc ravenwoodTestFactory() android.Module { 107*333d2b36SAndroid Build Coastguard Worker module := &ravenwoodTest{} 108*333d2b36SAndroid Build Coastguard Worker 109*333d2b36SAndroid Build Coastguard Worker module.addHostAndDeviceProperties() 110*333d2b36SAndroid Build Coastguard Worker module.AddProperties(&module.testProperties, &module.ravenwoodTestProperties) 111*333d2b36SAndroid Build Coastguard Worker 112*333d2b36SAndroid Build Coastguard Worker module.Module.dexpreopter.isTest = true 113*333d2b36SAndroid Build Coastguard Worker module.Module.linter.properties.Lint.Test = proptools.BoolPtr(true) 114*333d2b36SAndroid Build Coastguard Worker 115*333d2b36SAndroid Build Coastguard Worker module.testProperties.Test_suites = []string{ 116*333d2b36SAndroid Build Coastguard Worker "general-tests", 117*333d2b36SAndroid Build Coastguard Worker "ravenwood-tests", 118*333d2b36SAndroid Build Coastguard Worker } 119*333d2b36SAndroid Build Coastguard Worker module.testProperties.Test_options.Unit_test = proptools.BoolPtr(false) 120*333d2b36SAndroid Build Coastguard Worker 121*333d2b36SAndroid Build Coastguard Worker InitJavaModule(module, android.DeviceSupported) 122*333d2b36SAndroid Build Coastguard Worker android.InitDefaultableModule(module) 123*333d2b36SAndroid Build Coastguard Worker 124*333d2b36SAndroid Build Coastguard Worker return module 125*333d2b36SAndroid Build Coastguard Worker} 126*333d2b36SAndroid Build Coastguard Worker 127*333d2b36SAndroid Build Coastguard Workerfunc (r *ravenwoodTest) InstallInTestcases() bool { return true } 128*333d2b36SAndroid Build Coastguard Workerfunc (r *ravenwoodTest) InstallForceOS() (*android.OsType, *android.ArchType) { 129*333d2b36SAndroid Build Coastguard Worker return &r.forceOSType, &r.forceArchType 130*333d2b36SAndroid Build Coastguard Worker} 131*333d2b36SAndroid Build Coastguard Workerfunc (r *ravenwoodTest) TestSuites() []string { 132*333d2b36SAndroid Build Coastguard Worker return r.testProperties.Test_suites 133*333d2b36SAndroid Build Coastguard Worker} 134*333d2b36SAndroid Build Coastguard Worker 135*333d2b36SAndroid Build Coastguard Workerfunc (r *ravenwoodTest) DepsMutator(ctx android.BottomUpMutatorContext) { 136*333d2b36SAndroid Build Coastguard Worker r.Library.DepsMutator(ctx) 137*333d2b36SAndroid Build Coastguard Worker 138*333d2b36SAndroid Build Coastguard Worker // Generically depend on the runtime so that it's installed together with us 139*333d2b36SAndroid Build Coastguard Worker ctx.AddVariationDependencies(nil, ravenwoodRuntimeTag, ravenwoodRuntimeName) 140*333d2b36SAndroid Build Coastguard Worker 141*333d2b36SAndroid Build Coastguard Worker // Directly depend on any utils so that we link against them 142*333d2b36SAndroid Build Coastguard Worker utils := ctx.AddVariationDependencies(nil, ravenwoodUtilsTag, ravenwoodUtilsName)[0] 143*333d2b36SAndroid Build Coastguard Worker if utils != nil { 144*333d2b36SAndroid Build Coastguard Worker for _, lib := range utils.(*ravenwoodLibgroup).ravenwoodLibgroupProperties.Libs { 145*333d2b36SAndroid Build Coastguard Worker ctx.AddVariationDependencies(nil, libTag, lib) 146*333d2b36SAndroid Build Coastguard Worker } 147*333d2b36SAndroid Build Coastguard Worker } 148*333d2b36SAndroid Build Coastguard Worker 149*333d2b36SAndroid Build Coastguard Worker // Add jni libs 150*333d2b36SAndroid Build Coastguard Worker for _, lib := range r.ravenwoodTestProperties.Jni_libs.GetOrDefault(ctx, nil) { 151*333d2b36SAndroid Build Coastguard Worker ctx.AddVariationDependencies(ctx.Config().BuildOSTarget.Variations(), jniLibTag, lib) 152*333d2b36SAndroid Build Coastguard Worker } 153*333d2b36SAndroid Build Coastguard Worker 154*333d2b36SAndroid Build Coastguard Worker // Resources APK 155*333d2b36SAndroid Build Coastguard Worker if resourceApk := proptools.String(r.ravenwoodTestProperties.Resource_apk); resourceApk != "" { 156*333d2b36SAndroid Build Coastguard Worker ctx.AddVariationDependencies(nil, ravenwoodTestResourceApkTag, resourceApk) 157*333d2b36SAndroid Build Coastguard Worker } 158*333d2b36SAndroid Build Coastguard Worker 159*333d2b36SAndroid Build Coastguard Worker if resourceApk := proptools.String(r.ravenwoodTestProperties.Inst_resource_apk); resourceApk != "" { 160*333d2b36SAndroid Build Coastguard Worker ctx.AddVariationDependencies(nil, ravenwoodTestInstResourceApkTag, resourceApk) 161*333d2b36SAndroid Build Coastguard Worker } 162*333d2b36SAndroid Build Coastguard Worker} 163*333d2b36SAndroid Build Coastguard Worker 164*333d2b36SAndroid Build Coastguard Workerfunc (r *ravenwoodTest) GenerateAndroidBuildActions(ctx android.ModuleContext) { 165*333d2b36SAndroid Build Coastguard Worker r.forceOSType = ctx.Config().BuildOS 166*333d2b36SAndroid Build Coastguard Worker r.forceArchType = ctx.Config().BuildArch 167*333d2b36SAndroid Build Coastguard Worker 168*333d2b36SAndroid Build Coastguard Worker r.testConfig = tradefed.AutoGenTestConfig(ctx, tradefed.AutoGenTestConfigOptions{ 169*333d2b36SAndroid Build Coastguard Worker TestConfigProp: r.testProperties.Test_config, 170*333d2b36SAndroid Build Coastguard Worker TestConfigTemplateProp: r.testProperties.Test_config_template, 171*333d2b36SAndroid Build Coastguard Worker TestSuites: r.testProperties.Test_suites, 172*333d2b36SAndroid Build Coastguard Worker AutoGenConfig: r.testProperties.Auto_gen_config, 173*333d2b36SAndroid Build Coastguard Worker DeviceTemplate: "${RavenwoodTestConfigTemplate}", 174*333d2b36SAndroid Build Coastguard Worker HostTemplate: "${RavenwoodTestConfigTemplate}", 175*333d2b36SAndroid Build Coastguard Worker }) 176*333d2b36SAndroid Build Coastguard Worker 177*333d2b36SAndroid Build Coastguard Worker // Always enable Ravenizer for ravenwood tests. 178*333d2b36SAndroid Build Coastguard Worker r.Library.ravenizer.enabled = true 179*333d2b36SAndroid Build Coastguard Worker 180*333d2b36SAndroid Build Coastguard Worker r.Library.GenerateAndroidBuildActions(ctx) 181*333d2b36SAndroid Build Coastguard Worker 182*333d2b36SAndroid Build Coastguard Worker // Start by depending on all files installed by dependencies 183*333d2b36SAndroid Build Coastguard Worker var installDeps android.InstallPaths 184*333d2b36SAndroid Build Coastguard Worker 185*333d2b36SAndroid Build Coastguard Worker // All JNI libraries included in the runtime 186*333d2b36SAndroid Build Coastguard Worker var runtimeJniModuleNames map[string]bool 187*333d2b36SAndroid Build Coastguard Worker 188*333d2b36SAndroid Build Coastguard Worker if utils := ctx.GetDirectDepsWithTag(ravenwoodUtilsTag)[0]; utils != nil { 189*333d2b36SAndroid Build Coastguard Worker for _, installFile := range android.OtherModuleProviderOrDefault( 190*333d2b36SAndroid Build Coastguard Worker ctx, utils, android.InstallFilesProvider).InstallFiles { 191*333d2b36SAndroid Build Coastguard Worker installDeps = append(installDeps, installFile) 192*333d2b36SAndroid Build Coastguard Worker } 193*333d2b36SAndroid Build Coastguard Worker jniDeps, ok := android.OtherModuleProvider(ctx, utils, ravenwoodLibgroupJniDepProvider) 194*333d2b36SAndroid Build Coastguard Worker if ok { 195*333d2b36SAndroid Build Coastguard Worker runtimeJniModuleNames = jniDeps.names 196*333d2b36SAndroid Build Coastguard Worker } 197*333d2b36SAndroid Build Coastguard Worker } 198*333d2b36SAndroid Build Coastguard Worker 199*333d2b36SAndroid Build Coastguard Worker if runtime := ctx.GetDirectDepsWithTag(ravenwoodRuntimeTag)[0]; runtime != nil { 200*333d2b36SAndroid Build Coastguard Worker for _, installFile := range android.OtherModuleProviderOrDefault( 201*333d2b36SAndroid Build Coastguard Worker ctx, runtime, android.InstallFilesProvider).InstallFiles { 202*333d2b36SAndroid Build Coastguard Worker installDeps = append(installDeps, installFile) 203*333d2b36SAndroid Build Coastguard Worker } 204*333d2b36SAndroid Build Coastguard Worker jniDeps, ok := android.OtherModuleProvider(ctx, runtime, ravenwoodLibgroupJniDepProvider) 205*333d2b36SAndroid Build Coastguard Worker if ok { 206*333d2b36SAndroid Build Coastguard Worker runtimeJniModuleNames = jniDeps.names 207*333d2b36SAndroid Build Coastguard Worker } 208*333d2b36SAndroid Build Coastguard Worker } 209*333d2b36SAndroid Build Coastguard Worker 210*333d2b36SAndroid Build Coastguard Worker // Also remember what JNI libs are in the runtime. 211*333d2b36SAndroid Build Coastguard Worker 212*333d2b36SAndroid Build Coastguard Worker // Also depend on our config 213*333d2b36SAndroid Build Coastguard Worker installPath := android.PathForModuleInstall(ctx, r.BaseModuleName()) 214*333d2b36SAndroid Build Coastguard Worker installConfig := ctx.InstallFile(installPath, ctx.ModuleName()+".config", r.testConfig) 215*333d2b36SAndroid Build Coastguard Worker installDeps = append(installDeps, installConfig) 216*333d2b36SAndroid Build Coastguard Worker 217*333d2b36SAndroid Build Coastguard Worker // Depend on the JNI libraries, but don't install the ones that the runtime already 218*333d2b36SAndroid Build Coastguard Worker // contains. 219*333d2b36SAndroid Build Coastguard Worker soInstallPath := installPath.Join(ctx, getLibPath(r.forceArchType)) 220*333d2b36SAndroid Build Coastguard Worker for _, jniLib := range collectTransitiveJniDeps(ctx) { 221*333d2b36SAndroid Build Coastguard Worker if _, ok := runtimeJniModuleNames[jniLib.name]; ok { 222*333d2b36SAndroid Build Coastguard Worker continue // Runtime already includes it. 223*333d2b36SAndroid Build Coastguard Worker } 224*333d2b36SAndroid Build Coastguard Worker installJni := ctx.InstallFile(soInstallPath, jniLib.path.Base(), jniLib.path) 225*333d2b36SAndroid Build Coastguard Worker installDeps = append(installDeps, installJni) 226*333d2b36SAndroid Build Coastguard Worker } 227*333d2b36SAndroid Build Coastguard Worker 228*333d2b36SAndroid Build Coastguard Worker resApkInstallPath := installPath.Join(ctx, "ravenwood-res-apks") 229*333d2b36SAndroid Build Coastguard Worker 230*333d2b36SAndroid Build Coastguard Worker copyResApk := func(tag blueprint.DependencyTag, toFileName string) { 231*333d2b36SAndroid Build Coastguard Worker if resApk := ctx.GetDirectDepsWithTag(tag); len(resApk) > 0 { 232*333d2b36SAndroid Build Coastguard Worker installFile := android.OutputFileForModule(ctx, resApk[0], "") 233*333d2b36SAndroid Build Coastguard Worker installResApk := ctx.InstallFile(resApkInstallPath, toFileName, installFile) 234*333d2b36SAndroid Build Coastguard Worker installDeps = append(installDeps, installResApk) 235*333d2b36SAndroid Build Coastguard Worker } 236*333d2b36SAndroid Build Coastguard Worker } 237*333d2b36SAndroid Build Coastguard Worker copyResApk(ravenwoodTestResourceApkTag, "ravenwood-res.apk") 238*333d2b36SAndroid Build Coastguard Worker copyResApk(ravenwoodTestInstResourceApkTag, "ravenwood-inst-res.apk") 239*333d2b36SAndroid Build Coastguard Worker 240*333d2b36SAndroid Build Coastguard Worker // Generate manifest properties 241*333d2b36SAndroid Build Coastguard Worker propertiesOutputPath := android.PathForModuleGen(ctx, "ravenwood.properties") 242*333d2b36SAndroid Build Coastguard Worker 243*333d2b36SAndroid Build Coastguard Worker targetSdkVersion := proptools.StringDefault(r.deviceProperties.Target_sdk_version, "") 244*333d2b36SAndroid Build Coastguard Worker targetSdkVersionInt := r.TargetSdkVersion(ctx).FinalOrFutureInt() // FinalOrFutureInt may be 10000. 245*333d2b36SAndroid Build Coastguard Worker packageName := proptools.StringDefault(r.ravenwoodTestProperties.Package_name, "") 246*333d2b36SAndroid Build Coastguard Worker instPackageName := proptools.StringDefault(r.ravenwoodTestProperties.Inst_package_name, "") 247*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 248*333d2b36SAndroid Build Coastguard Worker Rule: genManifestProperties, 249*333d2b36SAndroid Build Coastguard Worker Description: "genManifestProperties", 250*333d2b36SAndroid Build Coastguard Worker Output: propertiesOutputPath, 251*333d2b36SAndroid Build Coastguard Worker Args: map[string]string{ 252*333d2b36SAndroid Build Coastguard Worker "targetSdkVersionInt": strconv.Itoa(targetSdkVersionInt), 253*333d2b36SAndroid Build Coastguard Worker "targetSdkVersionRaw": targetSdkVersion, 254*333d2b36SAndroid Build Coastguard Worker "packageName": packageName, 255*333d2b36SAndroid Build Coastguard Worker "instPackageName": instPackageName, 256*333d2b36SAndroid Build Coastguard Worker }, 257*333d2b36SAndroid Build Coastguard Worker }) 258*333d2b36SAndroid Build Coastguard Worker installProps := ctx.InstallFile(installPath, "ravenwood.properties", propertiesOutputPath) 259*333d2b36SAndroid Build Coastguard Worker installDeps = append(installDeps, installProps) 260*333d2b36SAndroid Build Coastguard Worker 261*333d2b36SAndroid Build Coastguard Worker // Install our JAR with all dependencies 262*333d2b36SAndroid Build Coastguard Worker ctx.InstallFile(installPath, ctx.ModuleName()+".jar", r.outputFile, installDeps...) 263*333d2b36SAndroid Build Coastguard Worker} 264*333d2b36SAndroid Build Coastguard Worker 265*333d2b36SAndroid Build Coastguard Workerfunc (r *ravenwoodTest) AndroidMkEntries() []android.AndroidMkEntries { 266*333d2b36SAndroid Build Coastguard Worker entriesList := r.Library.AndroidMkEntries() 267*333d2b36SAndroid Build Coastguard Worker entries := &entriesList[0] 268*333d2b36SAndroid Build Coastguard Worker entries.ExtraEntries = append(entries.ExtraEntries, 269*333d2b36SAndroid Build Coastguard Worker func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) { 270*333d2b36SAndroid Build Coastguard Worker entries.SetBool("LOCAL_UNINSTALLABLE_MODULE", true) 271*333d2b36SAndroid Build Coastguard Worker entries.AddStrings("LOCAL_COMPATIBILITY_SUITE", 272*333d2b36SAndroid Build Coastguard Worker "general-tests", "ravenwood-tests") 273*333d2b36SAndroid Build Coastguard Worker if r.testConfig != nil { 274*333d2b36SAndroid Build Coastguard Worker entries.SetPath("LOCAL_FULL_TEST_CONFIG", r.testConfig) 275*333d2b36SAndroid Build Coastguard Worker } 276*333d2b36SAndroid Build Coastguard Worker }) 277*333d2b36SAndroid Build Coastguard Worker return entriesList 278*333d2b36SAndroid Build Coastguard Worker} 279*333d2b36SAndroid Build Coastguard Worker 280*333d2b36SAndroid Build Coastguard Workertype ravenwoodLibgroupProperties struct { 281*333d2b36SAndroid Build Coastguard Worker Libs []string 282*333d2b36SAndroid Build Coastguard Worker 283*333d2b36SAndroid Build Coastguard Worker Jni_libs proptools.Configurable[[]string] 284*333d2b36SAndroid Build Coastguard Worker 285*333d2b36SAndroid Build Coastguard Worker // We use this to copy framework-res.apk to the ravenwood runtime directory. 286*333d2b36SAndroid Build Coastguard Worker Data []string `android:"path,arch_variant"` 287*333d2b36SAndroid Build Coastguard Worker 288*333d2b36SAndroid Build Coastguard Worker // We use this to copy font files to the ravenwood runtime directory. 289*333d2b36SAndroid Build Coastguard Worker Fonts []string `android:"path,arch_variant"` 290*333d2b36SAndroid Build Coastguard Worker} 291*333d2b36SAndroid Build Coastguard Worker 292*333d2b36SAndroid Build Coastguard Workertype ravenwoodLibgroup struct { 293*333d2b36SAndroid Build Coastguard Worker android.ModuleBase 294*333d2b36SAndroid Build Coastguard Worker 295*333d2b36SAndroid Build Coastguard Worker ravenwoodLibgroupProperties ravenwoodLibgroupProperties 296*333d2b36SAndroid Build Coastguard Worker 297*333d2b36SAndroid Build Coastguard Worker forceOSType android.OsType 298*333d2b36SAndroid Build Coastguard Worker forceArchType android.ArchType 299*333d2b36SAndroid Build Coastguard Worker} 300*333d2b36SAndroid Build Coastguard Worker 301*333d2b36SAndroid Build Coastguard Workerfunc ravenwoodLibgroupFactory() android.Module { 302*333d2b36SAndroid Build Coastguard Worker module := &ravenwoodLibgroup{} 303*333d2b36SAndroid Build Coastguard Worker module.AddProperties(&module.ravenwoodLibgroupProperties) 304*333d2b36SAndroid Build Coastguard Worker 305*333d2b36SAndroid Build Coastguard Worker android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibCommon) 306*333d2b36SAndroid Build Coastguard Worker return module 307*333d2b36SAndroid Build Coastguard Worker} 308*333d2b36SAndroid Build Coastguard Worker 309*333d2b36SAndroid Build Coastguard Workerfunc (r *ravenwoodLibgroup) InstallInTestcases() bool { return true } 310*333d2b36SAndroid Build Coastguard Workerfunc (r *ravenwoodLibgroup) InstallForceOS() (*android.OsType, *android.ArchType) { 311*333d2b36SAndroid Build Coastguard Worker return &r.forceOSType, &r.forceArchType 312*333d2b36SAndroid Build Coastguard Worker} 313*333d2b36SAndroid Build Coastguard Workerfunc (r *ravenwoodLibgroup) TestSuites() []string { 314*333d2b36SAndroid Build Coastguard Worker return []string{ 315*333d2b36SAndroid Build Coastguard Worker "general-tests", 316*333d2b36SAndroid Build Coastguard Worker "ravenwood-tests", 317*333d2b36SAndroid Build Coastguard Worker } 318*333d2b36SAndroid Build Coastguard Worker} 319*333d2b36SAndroid Build Coastguard Worker 320*333d2b36SAndroid Build Coastguard Workerfunc (r *ravenwoodLibgroup) DepsMutator(ctx android.BottomUpMutatorContext) { 321*333d2b36SAndroid Build Coastguard Worker // Always depends on our underlying libs 322*333d2b36SAndroid Build Coastguard Worker for _, lib := range r.ravenwoodLibgroupProperties.Libs { 323*333d2b36SAndroid Build Coastguard Worker ctx.AddVariationDependencies(nil, ravenwoodLibContentTag, lib) 324*333d2b36SAndroid Build Coastguard Worker } 325*333d2b36SAndroid Build Coastguard Worker for _, lib := range r.ravenwoodLibgroupProperties.Jni_libs.GetOrDefault(ctx, nil) { 326*333d2b36SAndroid Build Coastguard Worker ctx.AddVariationDependencies(ctx.Config().BuildOSTarget.Variations(), jniLibTag, lib) 327*333d2b36SAndroid Build Coastguard Worker } 328*333d2b36SAndroid Build Coastguard Worker} 329*333d2b36SAndroid Build Coastguard Worker 330*333d2b36SAndroid Build Coastguard Workerfunc (r *ravenwoodLibgroup) GenerateAndroidBuildActions(ctx android.ModuleContext) { 331*333d2b36SAndroid Build Coastguard Worker r.forceOSType = ctx.Config().BuildOS 332*333d2b36SAndroid Build Coastguard Worker r.forceArchType = ctx.Config().BuildArch 333*333d2b36SAndroid Build Coastguard Worker 334*333d2b36SAndroid Build Coastguard Worker // Collect the JNI dependencies, including the transitive deps. 335*333d2b36SAndroid Build Coastguard Worker jniDepNames := make(map[string]bool) 336*333d2b36SAndroid Build Coastguard Worker jniLibs := collectTransitiveJniDeps(ctx) 337*333d2b36SAndroid Build Coastguard Worker 338*333d2b36SAndroid Build Coastguard Worker for _, jni := range jniLibs { 339*333d2b36SAndroid Build Coastguard Worker jniDepNames[jni.name] = true 340*333d2b36SAndroid Build Coastguard Worker } 341*333d2b36SAndroid Build Coastguard Worker android.SetProvider(ctx, ravenwoodLibgroupJniDepProvider, ravenwoodLibgroupJniDepProviderInfo{ 342*333d2b36SAndroid Build Coastguard Worker names: jniDepNames, 343*333d2b36SAndroid Build Coastguard Worker }) 344*333d2b36SAndroid Build Coastguard Worker 345*333d2b36SAndroid Build Coastguard Worker // Install our runtime into expected location for packaging 346*333d2b36SAndroid Build Coastguard Worker installPath := android.PathForModuleInstall(ctx, r.BaseModuleName()) 347*333d2b36SAndroid Build Coastguard Worker for _, lib := range r.ravenwoodLibgroupProperties.Libs { 348*333d2b36SAndroid Build Coastguard Worker libModule := ctx.GetDirectDepWithTag(lib, ravenwoodLibContentTag) 349*333d2b36SAndroid Build Coastguard Worker if libModule == nil { 350*333d2b36SAndroid Build Coastguard Worker if ctx.Config().AllowMissingDependencies() { 351*333d2b36SAndroid Build Coastguard Worker ctx.AddMissingDependencies([]string{lib}) 352*333d2b36SAndroid Build Coastguard Worker } else { 353*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("lib", "missing dependency %q", lib) 354*333d2b36SAndroid Build Coastguard Worker } 355*333d2b36SAndroid Build Coastguard Worker continue 356*333d2b36SAndroid Build Coastguard Worker } 357*333d2b36SAndroid Build Coastguard Worker libJar := android.OutputFileForModule(ctx, libModule, "") 358*333d2b36SAndroid Build Coastguard Worker ctx.InstallFile(installPath, lib+".jar", libJar) 359*333d2b36SAndroid Build Coastguard Worker } 360*333d2b36SAndroid Build Coastguard Worker soInstallPath := android.PathForModuleInstall(ctx, r.BaseModuleName()).Join(ctx, getLibPath(r.forceArchType)) 361*333d2b36SAndroid Build Coastguard Worker 362*333d2b36SAndroid Build Coastguard Worker for _, jniLib := range jniLibs { 363*333d2b36SAndroid Build Coastguard Worker ctx.InstallFile(soInstallPath, jniLib.path.Base(), jniLib.path) 364*333d2b36SAndroid Build Coastguard Worker } 365*333d2b36SAndroid Build Coastguard Worker 366*333d2b36SAndroid Build Coastguard Worker dataInstallPath := installPath.Join(ctx, "ravenwood-data") 367*333d2b36SAndroid Build Coastguard Worker data := android.PathsForModuleSrc(ctx, r.ravenwoodLibgroupProperties.Data) 368*333d2b36SAndroid Build Coastguard Worker for _, file := range data { 369*333d2b36SAndroid Build Coastguard Worker ctx.InstallFile(dataInstallPath, file.Base(), file) 370*333d2b36SAndroid Build Coastguard Worker } 371*333d2b36SAndroid Build Coastguard Worker 372*333d2b36SAndroid Build Coastguard Worker fontsInstallPath := installPath.Join(ctx, "fonts") 373*333d2b36SAndroid Build Coastguard Worker fonts := android.PathsForModuleSrc(ctx, r.ravenwoodLibgroupProperties.Fonts) 374*333d2b36SAndroid Build Coastguard Worker for _, file := range fonts { 375*333d2b36SAndroid Build Coastguard Worker ctx.InstallFile(fontsInstallPath, file.Base(), file) 376*333d2b36SAndroid Build Coastguard Worker } 377*333d2b36SAndroid Build Coastguard Worker 378*333d2b36SAndroid Build Coastguard Worker // Normal build should perform install steps 379*333d2b36SAndroid Build Coastguard Worker ctx.Phony(r.BaseModuleName(), android.PathForPhony(ctx, r.BaseModuleName()+"-install")) 380*333d2b36SAndroid Build Coastguard Worker} 381*333d2b36SAndroid Build Coastguard Worker 382*333d2b36SAndroid Build Coastguard Worker// collectTransitiveJniDeps returns all JNI dependencies, including transitive 383*333d2b36SAndroid Build Coastguard Worker// ones, including NDK / stub libs. (Because Ravenwood has no "preinstalled" libraries) 384*333d2b36SAndroid Build Coastguard Workerfunc collectTransitiveJniDeps(ctx android.ModuleContext) []jniLib { 385*333d2b36SAndroid Build Coastguard Worker libs, _ := collectJniDeps(ctx, true, false, nil) 386*333d2b36SAndroid Build Coastguard Worker return libs 387*333d2b36SAndroid Build Coastguard Worker} 388