xref: /aosp_15_r20/build/soong/tradefed/suite_harness/tradefed_binary.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2018 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 Worker
15*333d2b36SAndroid Build Coastguard Workerpackage suite_harness
16*333d2b36SAndroid Build Coastguard Worker
17*333d2b36SAndroid Build Coastguard Workerimport (
18*333d2b36SAndroid Build Coastguard Worker	"strings"
19*333d2b36SAndroid Build Coastguard Worker
20*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint"
21*333d2b36SAndroid Build Coastguard Worker
22*333d2b36SAndroid Build Coastguard Worker	"android/soong/android"
23*333d2b36SAndroid Build Coastguard Worker	"android/soong/java"
24*333d2b36SAndroid Build Coastguard Worker)
25*333d2b36SAndroid Build Coastguard Worker
26*333d2b36SAndroid Build Coastguard Workervar pctx = android.NewPackageContext("android/soong/tradefed/suite_harness")
27*333d2b36SAndroid Build Coastguard Worker
28*333d2b36SAndroid Build Coastguard Workerfunc init() {
29*333d2b36SAndroid Build Coastguard Worker	android.RegisterModuleType("tradefed_binary_host", tradefedBinaryFactory)
30*333d2b36SAndroid Build Coastguard Worker
31*333d2b36SAndroid Build Coastguard Worker	pctx.Import("android/soong/android")
32*333d2b36SAndroid Build Coastguard Worker}
33*333d2b36SAndroid Build Coastguard Worker
34*333d2b36SAndroid Build Coastguard Workertype TradefedBinaryProperties struct {
35*333d2b36SAndroid Build Coastguard Worker	Short_name                    string
36*333d2b36SAndroid Build Coastguard Worker	Full_name                     string
37*333d2b36SAndroid Build Coastguard Worker	Version                       string
38*333d2b36SAndroid Build Coastguard Worker	Suite_arch                    string
39*333d2b36SAndroid Build Coastguard Worker	Prepend_platform_version_name bool
40*333d2b36SAndroid Build Coastguard Worker}
41*333d2b36SAndroid Build Coastguard Worker
42*333d2b36SAndroid Build Coastguard Worker// tradefedBinaryFactory creates an empty module for the tradefed_binary module type,
43*333d2b36SAndroid Build Coastguard Worker// which is a java_binary with some additional processing in tradefedBinaryLoadHook.
44*333d2b36SAndroid Build Coastguard Workerfunc tradefedBinaryFactory() android.Module {
45*333d2b36SAndroid Build Coastguard Worker	props := &TradefedBinaryProperties{}
46*333d2b36SAndroid Build Coastguard Worker	module := java.BinaryHostFactory()
47*333d2b36SAndroid Build Coastguard Worker	module.AddProperties(props)
48*333d2b36SAndroid Build Coastguard Worker	android.AddLoadHook(module, tradefedBinaryLoadHook(props))
49*333d2b36SAndroid Build Coastguard Worker
50*333d2b36SAndroid Build Coastguard Worker	return module
51*333d2b36SAndroid Build Coastguard Worker}
52*333d2b36SAndroid Build Coastguard Worker
53*333d2b36SAndroid Build Coastguard Workerconst genSuffix = "-gen"
54*333d2b36SAndroid Build Coastguard Worker
55*333d2b36SAndroid Build Coastguard Worker// tradefedBinaryLoadHook adds extra resources and libraries to tradefed_binary modules.
56*333d2b36SAndroid Build Coastguard Workerfunc tradefedBinaryLoadHook(tfb *TradefedBinaryProperties) func(ctx android.LoadHookContext) {
57*333d2b36SAndroid Build Coastguard Worker	return func(ctx android.LoadHookContext) {
58*333d2b36SAndroid Build Coastguard Worker		genName := ctx.ModuleName() + genSuffix
59*333d2b36SAndroid Build Coastguard Worker		version := tfb.Version
60*333d2b36SAndroid Build Coastguard Worker		if tfb.Prepend_platform_version_name {
61*333d2b36SAndroid Build Coastguard Worker			version = ctx.Config().PlatformVersionName() + tfb.Version
62*333d2b36SAndroid Build Coastguard Worker		}
63*333d2b36SAndroid Build Coastguard Worker
64*333d2b36SAndroid Build Coastguard Worker		// Create a submodule that generates the test-suite-info.properties file
65*333d2b36SAndroid Build Coastguard Worker		// and copies DynamicConfig.xml if it is present.
66*333d2b36SAndroid Build Coastguard Worker		ctx.CreateModule(tradefedBinaryGenFactory,
67*333d2b36SAndroid Build Coastguard Worker			&TradefedBinaryGenProperties{
68*333d2b36SAndroid Build Coastguard Worker				Name:       &genName,
69*333d2b36SAndroid Build Coastguard Worker				Short_name: tfb.Short_name,
70*333d2b36SAndroid Build Coastguard Worker				Full_name:  tfb.Full_name,
71*333d2b36SAndroid Build Coastguard Worker				Suite_arch: tfb.Suite_arch,
72*333d2b36SAndroid Build Coastguard Worker				Version:    version,
73*333d2b36SAndroid Build Coastguard Worker			})
74*333d2b36SAndroid Build Coastguard Worker
75*333d2b36SAndroid Build Coastguard Worker		props := struct {
76*333d2b36SAndroid Build Coastguard Worker			Java_resources []string
77*333d2b36SAndroid Build Coastguard Worker			Libs           []string
78*333d2b36SAndroid Build Coastguard Worker		}{}
79*333d2b36SAndroid Build Coastguard Worker
80*333d2b36SAndroid Build Coastguard Worker		// Add dependencies required by all tradefed_binary modules.
81*333d2b36SAndroid Build Coastguard Worker		props.Libs = []string{
82*333d2b36SAndroid Build Coastguard Worker			"tradefed",
83*333d2b36SAndroid Build Coastguard Worker			"loganalysis",
84*333d2b36SAndroid Build Coastguard Worker			"compatibility-host-util",
85*333d2b36SAndroid Build Coastguard Worker		}
86*333d2b36SAndroid Build Coastguard Worker
87*333d2b36SAndroid Build Coastguard Worker		// Add the files generated by the submodule created above to the resources.
88*333d2b36SAndroid Build Coastguard Worker		props.Java_resources = []string{":" + genName}
89*333d2b36SAndroid Build Coastguard Worker
90*333d2b36SAndroid Build Coastguard Worker		ctx.AppendProperties(&props)
91*333d2b36SAndroid Build Coastguard Worker
92*333d2b36SAndroid Build Coastguard Worker	}
93*333d2b36SAndroid Build Coastguard Worker}
94*333d2b36SAndroid Build Coastguard Worker
95*333d2b36SAndroid Build Coastguard Workertype TradefedBinaryGenProperties struct {
96*333d2b36SAndroid Build Coastguard Worker	Name       *string
97*333d2b36SAndroid Build Coastguard Worker	Short_name string
98*333d2b36SAndroid Build Coastguard Worker	Full_name  string
99*333d2b36SAndroid Build Coastguard Worker	Version    string
100*333d2b36SAndroid Build Coastguard Worker	Suite_arch string
101*333d2b36SAndroid Build Coastguard Worker}
102*333d2b36SAndroid Build Coastguard Worker
103*333d2b36SAndroid Build Coastguard Workertype tradefedBinaryGen struct {
104*333d2b36SAndroid Build Coastguard Worker	android.ModuleBase
105*333d2b36SAndroid Build Coastguard Worker
106*333d2b36SAndroid Build Coastguard Worker	properties TradefedBinaryGenProperties
107*333d2b36SAndroid Build Coastguard Worker
108*333d2b36SAndroid Build Coastguard Worker	gen android.Paths
109*333d2b36SAndroid Build Coastguard Worker}
110*333d2b36SAndroid Build Coastguard Worker
111*333d2b36SAndroid Build Coastguard Workerfunc tradefedBinaryGenFactory() android.Module {
112*333d2b36SAndroid Build Coastguard Worker	tfg := &tradefedBinaryGen{}
113*333d2b36SAndroid Build Coastguard Worker	tfg.AddProperties(&tfg.properties)
114*333d2b36SAndroid Build Coastguard Worker	android.InitAndroidModule(tfg)
115*333d2b36SAndroid Build Coastguard Worker	return tfg
116*333d2b36SAndroid Build Coastguard Worker}
117*333d2b36SAndroid Build Coastguard Worker
118*333d2b36SAndroid Build Coastguard Workerfunc (tfg *tradefedBinaryGen) DepsMutator(android.BottomUpMutatorContext) {}
119*333d2b36SAndroid Build Coastguard Worker
120*333d2b36SAndroid Build Coastguard Workervar tradefedBinaryGenRule = pctx.StaticRule("tradefedBinaryGenRule", blueprint.RuleParams{
121*333d2b36SAndroid Build Coastguard Worker	Command: `rm -f $out && touch $out && ` +
122*333d2b36SAndroid Build Coastguard Worker		`echo "# This file is auto generated by Android.mk. Do not modify." >> $out && ` +
123*333d2b36SAndroid Build Coastguard Worker		`echo "build_number = $$(cat ${buildNumberFile})" >> $out && ` +
124*333d2b36SAndroid Build Coastguard Worker		`echo "target_arch = ${arch}" >> $out && ` +
125*333d2b36SAndroid Build Coastguard Worker		`echo "name = ${name}" >> $out && ` +
126*333d2b36SAndroid Build Coastguard Worker		`echo "fullname = ${fullname}" >> $out && ` +
127*333d2b36SAndroid Build Coastguard Worker		`echo "version = ${version}" >> $out`,
128*333d2b36SAndroid Build Coastguard Worker}, "buildNumberFile", "arch", "name", "fullname", "version")
129*333d2b36SAndroid Build Coastguard Worker
130*333d2b36SAndroid Build Coastguard Workerfunc (tfg *tradefedBinaryGen) GenerateAndroidBuildActions(ctx android.ModuleContext) {
131*333d2b36SAndroid Build Coastguard Worker	buildNumberFile := ctx.Config().BuildNumberFile(ctx)
132*333d2b36SAndroid Build Coastguard Worker	outputFile := android.PathForModuleOut(ctx, "test-suite-info.properties")
133*333d2b36SAndroid Build Coastguard Worker
134*333d2b36SAndroid Build Coastguard Worker	arch := strings.ReplaceAll(tfg.properties.Suite_arch, " ", "")
135*333d2b36SAndroid Build Coastguard Worker	if arch == "" {
136*333d2b36SAndroid Build Coastguard Worker		arch = ctx.Config().DevicePrimaryArchType().String()
137*333d2b36SAndroid Build Coastguard Worker	}
138*333d2b36SAndroid Build Coastguard Worker
139*333d2b36SAndroid Build Coastguard Worker	ctx.Build(pctx, android.BuildParams{
140*333d2b36SAndroid Build Coastguard Worker		Rule:      tradefedBinaryGenRule,
141*333d2b36SAndroid Build Coastguard Worker		Output:    outputFile,
142*333d2b36SAndroid Build Coastguard Worker		OrderOnly: android.Paths{buildNumberFile},
143*333d2b36SAndroid Build Coastguard Worker		Args: map[string]string{
144*333d2b36SAndroid Build Coastguard Worker			"buildNumberFile": buildNumberFile.String(),
145*333d2b36SAndroid Build Coastguard Worker			"arch":            arch,
146*333d2b36SAndroid Build Coastguard Worker			"name":            tfg.properties.Short_name,
147*333d2b36SAndroid Build Coastguard Worker			"fullname":        tfg.properties.Full_name,
148*333d2b36SAndroid Build Coastguard Worker			"version":         tfg.properties.Version,
149*333d2b36SAndroid Build Coastguard Worker		},
150*333d2b36SAndroid Build Coastguard Worker	})
151*333d2b36SAndroid Build Coastguard Worker
152*333d2b36SAndroid Build Coastguard Worker	tfg.gen = append(tfg.gen, outputFile)
153*333d2b36SAndroid Build Coastguard Worker
154*333d2b36SAndroid Build Coastguard Worker	dynamicConfig := android.ExistentPathForSource(ctx, ctx.ModuleDir(), "DynamicConfig.xml")
155*333d2b36SAndroid Build Coastguard Worker	if dynamicConfig.Valid() {
156*333d2b36SAndroid Build Coastguard Worker		outputFile := android.PathForModuleOut(ctx, strings.TrimSuffix(ctx.ModuleName(), genSuffix)+".dynamic")
157*333d2b36SAndroid Build Coastguard Worker		ctx.Build(pctx, android.BuildParams{
158*333d2b36SAndroid Build Coastguard Worker			Rule:   android.Cp,
159*333d2b36SAndroid Build Coastguard Worker			Input:  dynamicConfig.Path(),
160*333d2b36SAndroid Build Coastguard Worker			Output: outputFile,
161*333d2b36SAndroid Build Coastguard Worker		})
162*333d2b36SAndroid Build Coastguard Worker
163*333d2b36SAndroid Build Coastguard Worker		tfg.gen = append(tfg.gen, outputFile)
164*333d2b36SAndroid Build Coastguard Worker	}
165*333d2b36SAndroid Build Coastguard Worker}
166*333d2b36SAndroid Build Coastguard Worker
167*333d2b36SAndroid Build Coastguard Workerfunc (tfg *tradefedBinaryGen) Srcs() android.Paths {
168*333d2b36SAndroid Build Coastguard Worker	return append(android.Paths(nil), tfg.gen...)
169*333d2b36SAndroid Build Coastguard Worker}
170*333d2b36SAndroid Build Coastguard Worker
171*333d2b36SAndroid Build Coastguard Workervar _ android.SourceFileProducer = (*tradefedBinaryGen)(nil)
172