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