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