1*333d2b36SAndroid Build Coastguard Worker// Copyright 2024 Google Inc. All rights reserved. 2*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 3*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 4*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at 5*333d2b36SAndroid Build Coastguard Worker// 6*333d2b36SAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 7*333d2b36SAndroid Build Coastguard Worker// 8*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 9*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 10*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 12*333d2b36SAndroid Build Coastguard Worker// limitations under the License. 13*333d2b36SAndroid Build Coastguard Worker 14*333d2b36SAndroid Build Coastguard Workerpackage systemfeatures 15*333d2b36SAndroid Build Coastguard Worker 16*333d2b36SAndroid Build Coastguard Workerimport ( 17*333d2b36SAndroid Build Coastguard Worker "fmt" 18*333d2b36SAndroid Build Coastguard Worker "sort" 19*333d2b36SAndroid Build Coastguard Worker "strings" 20*333d2b36SAndroid Build Coastguard Worker 21*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 22*333d2b36SAndroid Build Coastguard Worker "android/soong/genrule" 23*333d2b36SAndroid Build Coastguard Worker) 24*333d2b36SAndroid Build Coastguard Worker 25*333d2b36SAndroid Build Coastguard Workervar ( 26*333d2b36SAndroid Build Coastguard Worker pctx = android.NewPackageContext("android/soong/systemfeatures") 27*333d2b36SAndroid Build Coastguard Worker) 28*333d2b36SAndroid Build Coastguard Worker 29*333d2b36SAndroid Build Coastguard Workerfunc init() { 30*333d2b36SAndroid Build Coastguard Worker registerSystemFeaturesComponents(android.InitRegistrationContext) 31*333d2b36SAndroid Build Coastguard Worker} 32*333d2b36SAndroid Build Coastguard Worker 33*333d2b36SAndroid Build Coastguard Workerfunc registerSystemFeaturesComponents(ctx android.RegistrationContext) { 34*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("java_system_features_srcs", JavaSystemFeaturesSrcsFactory) 35*333d2b36SAndroid Build Coastguard Worker} 36*333d2b36SAndroid Build Coastguard Worker 37*333d2b36SAndroid Build Coastguard Workertype javaSystemFeaturesSrcs struct { 38*333d2b36SAndroid Build Coastguard Worker android.ModuleBase 39*333d2b36SAndroid Build Coastguard Worker properties struct { 40*333d2b36SAndroid Build Coastguard Worker // The fully qualified class name for the generated code, e.g., com.android.Foo 41*333d2b36SAndroid Build Coastguard Worker Full_class_name string 42*333d2b36SAndroid Build Coastguard Worker } 43*333d2b36SAndroid Build Coastguard Worker outputFiles android.WritablePaths 44*333d2b36SAndroid Build Coastguard Worker} 45*333d2b36SAndroid Build Coastguard Worker 46*333d2b36SAndroid Build Coastguard Workervar _ genrule.SourceFileGenerator = (*javaSystemFeaturesSrcs)(nil) 47*333d2b36SAndroid Build Coastguard Workervar _ android.SourceFileProducer = (*javaSystemFeaturesSrcs)(nil) 48*333d2b36SAndroid Build Coastguard Worker 49*333d2b36SAndroid Build Coastguard Workerfunc (m *javaSystemFeaturesSrcs) GenerateAndroidBuildActions(ctx android.ModuleContext) { 50*333d2b36SAndroid Build Coastguard Worker // Create a file name appropriate for the given fully qualified (w/ package) class name. 51*333d2b36SAndroid Build Coastguard Worker classNameParts := strings.Split(m.properties.Full_class_name, ".") 52*333d2b36SAndroid Build Coastguard Worker outputDir := android.PathForModuleGen(ctx) 53*333d2b36SAndroid Build Coastguard Worker outputFileName := classNameParts[len(classNameParts)-1] + ".java" 54*333d2b36SAndroid Build Coastguard Worker outputFile := android.PathForModuleGen(ctx, outputFileName).OutputPath 55*333d2b36SAndroid Build Coastguard Worker 56*333d2b36SAndroid Build Coastguard Worker // Collect all RELEASE_SYSTEM_FEATURE_$K:$V build flags into a list of "$K:$V" pairs. 57*333d2b36SAndroid Build Coastguard Worker var features []string 58*333d2b36SAndroid Build Coastguard Worker for k, v := range ctx.Config().ProductVariables().BuildFlags { 59*333d2b36SAndroid Build Coastguard Worker if strings.HasPrefix(k, "RELEASE_SYSTEM_FEATURE_") { 60*333d2b36SAndroid Build Coastguard Worker shortFeatureName := strings.TrimPrefix(k, "RELEASE_SYSTEM_FEATURE_") 61*333d2b36SAndroid Build Coastguard Worker features = append(features, fmt.Sprintf("%s:%s", shortFeatureName, v)) 62*333d2b36SAndroid Build Coastguard Worker } 63*333d2b36SAndroid Build Coastguard Worker } 64*333d2b36SAndroid Build Coastguard Worker // Ensure sorted outputs for consistency of flag ordering in ninja outputs. 65*333d2b36SAndroid Build Coastguard Worker sort.Strings(features) 66*333d2b36SAndroid Build Coastguard Worker 67*333d2b36SAndroid Build Coastguard Worker rule := android.NewRuleBuilder(pctx, ctx) 68*333d2b36SAndroid Build Coastguard Worker rule.Command().Text("rm -rf").Text(outputDir.String()) 69*333d2b36SAndroid Build Coastguard Worker rule.Command().Text("mkdir -p").Text(outputDir.String()) 70*333d2b36SAndroid Build Coastguard Worker rule.Command(). 71*333d2b36SAndroid Build Coastguard Worker BuiltTool("systemfeatures-gen-tool"). 72*333d2b36SAndroid Build Coastguard Worker Flag(m.properties.Full_class_name). 73*333d2b36SAndroid Build Coastguard Worker FlagForEachArg("--feature=", features). 74*333d2b36SAndroid Build Coastguard Worker FlagWithArg("--readonly=", fmt.Sprint(ctx.Config().ReleaseUseSystemFeatureBuildFlags())). 75*333d2b36SAndroid Build Coastguard Worker FlagWithOutput(" > ", outputFile) 76*333d2b36SAndroid Build Coastguard Worker rule.Build(ctx.ModuleName(), "Generating systemfeatures srcs filegroup") 77*333d2b36SAndroid Build Coastguard Worker 78*333d2b36SAndroid Build Coastguard Worker m.outputFiles = append(m.outputFiles, outputFile) 79*333d2b36SAndroid Build Coastguard Worker} 80*333d2b36SAndroid Build Coastguard Worker 81*333d2b36SAndroid Build Coastguard Workerfunc (m *javaSystemFeaturesSrcs) Srcs() android.Paths { 82*333d2b36SAndroid Build Coastguard Worker return m.outputFiles.Paths() 83*333d2b36SAndroid Build Coastguard Worker} 84*333d2b36SAndroid Build Coastguard Worker 85*333d2b36SAndroid Build Coastguard Workerfunc (m *javaSystemFeaturesSrcs) GeneratedSourceFiles() android.Paths { 86*333d2b36SAndroid Build Coastguard Worker return m.outputFiles.Paths() 87*333d2b36SAndroid Build Coastguard Worker} 88*333d2b36SAndroid Build Coastguard Worker 89*333d2b36SAndroid Build Coastguard Workerfunc (m *javaSystemFeaturesSrcs) GeneratedDeps() android.Paths { 90*333d2b36SAndroid Build Coastguard Worker return m.outputFiles.Paths() 91*333d2b36SAndroid Build Coastguard Worker} 92*333d2b36SAndroid Build Coastguard Worker 93*333d2b36SAndroid Build Coastguard Workerfunc (m *javaSystemFeaturesSrcs) GeneratedHeaderDirs() android.Paths { 94*333d2b36SAndroid Build Coastguard Worker return nil 95*333d2b36SAndroid Build Coastguard Worker} 96*333d2b36SAndroid Build Coastguard Worker 97*333d2b36SAndroid Build Coastguard Workerfunc JavaSystemFeaturesSrcsFactory() android.Module { 98*333d2b36SAndroid Build Coastguard Worker module := &javaSystemFeaturesSrcs{} 99*333d2b36SAndroid Build Coastguard Worker module.AddProperties(&module.properties) 100*333d2b36SAndroid Build Coastguard Worker android.InitAndroidModule(module) 101*333d2b36SAndroid Build Coastguard Worker return module 102*333d2b36SAndroid Build Coastguard Worker} 103