xref: /aosp_15_r20/build/soong/java/ravenwood.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
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