xref: /aosp_15_r20/build/soong/aconfig/build_flags/declarations.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 Worker
15*333d2b36SAndroid Build Coastguard Workerpackage build_flags
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	"android/soong/android"
21*333d2b36SAndroid Build Coastguard Worker
22*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint"
23*333d2b36SAndroid Build Coastguard Worker)
24*333d2b36SAndroid Build Coastguard Worker
25*333d2b36SAndroid Build Coastguard Workertype BuildFlagDeclarationsProviderData struct {
26*333d2b36SAndroid Build Coastguard Worker	IntermediateCacheOutputPath android.WritablePath
27*333d2b36SAndroid Build Coastguard Worker	IntermediateDumpOutputPath  android.WritablePath
28*333d2b36SAndroid Build Coastguard Worker}
29*333d2b36SAndroid Build Coastguard Worker
30*333d2b36SAndroid Build Coastguard Workervar BuildFlagDeclarationsProviderKey = blueprint.NewProvider[BuildFlagDeclarationsProviderData]()
31*333d2b36SAndroid Build Coastguard Worker
32*333d2b36SAndroid Build Coastguard Workertype DeclarationsModule struct {
33*333d2b36SAndroid Build Coastguard Worker	android.ModuleBase
34*333d2b36SAndroid Build Coastguard Worker	android.DefaultableModuleBase
35*333d2b36SAndroid Build Coastguard Worker
36*333d2b36SAndroid Build Coastguard Worker	// Properties for "aconfig_declarations"
37*333d2b36SAndroid Build Coastguard Worker	properties struct {
38*333d2b36SAndroid Build Coastguard Worker		// build flag declaration files, relative to this Android.bp file
39*333d2b36SAndroid Build Coastguard Worker		Srcs []string `android:"path"`
40*333d2b36SAndroid Build Coastguard Worker	}
41*333d2b36SAndroid Build Coastguard Worker}
42*333d2b36SAndroid Build Coastguard Worker
43*333d2b36SAndroid Build Coastguard Workerfunc DeclarationsFactory() android.Module {
44*333d2b36SAndroid Build Coastguard Worker	module := &DeclarationsModule{}
45*333d2b36SAndroid Build Coastguard Worker
46*333d2b36SAndroid Build Coastguard Worker	android.InitAndroidModule(module)
47*333d2b36SAndroid Build Coastguard Worker	android.InitDefaultableModule(module)
48*333d2b36SAndroid Build Coastguard Worker	module.AddProperties(&module.properties)
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 Workerfunc joinAndPrefix(prefix string, values []string) string {
54*333d2b36SAndroid Build Coastguard Worker	var sb strings.Builder
55*333d2b36SAndroid Build Coastguard Worker	for _, v := range values {
56*333d2b36SAndroid Build Coastguard Worker		sb.WriteString(prefix)
57*333d2b36SAndroid Build Coastguard Worker		sb.WriteString(v)
58*333d2b36SAndroid Build Coastguard Worker	}
59*333d2b36SAndroid Build Coastguard Worker	return sb.String()
60*333d2b36SAndroid Build Coastguard Worker}
61*333d2b36SAndroid Build Coastguard Worker
62*333d2b36SAndroid Build Coastguard Workerfunc optionalVariable(prefix string, value string) string {
63*333d2b36SAndroid Build Coastguard Worker	var sb strings.Builder
64*333d2b36SAndroid Build Coastguard Worker	if value != "" {
65*333d2b36SAndroid Build Coastguard Worker		sb.WriteString(prefix)
66*333d2b36SAndroid Build Coastguard Worker		sb.WriteString(value)
67*333d2b36SAndroid Build Coastguard Worker	}
68*333d2b36SAndroid Build Coastguard Worker	return sb.String()
69*333d2b36SAndroid Build Coastguard Worker}
70*333d2b36SAndroid Build Coastguard Worker
71*333d2b36SAndroid Build Coastguard Workerfunc (module *DeclarationsModule) GenerateAndroidBuildActions(ctx android.ModuleContext) {
72*333d2b36SAndroid Build Coastguard Worker	// Intermediate format
73*333d2b36SAndroid Build Coastguard Worker	declarationFiles := android.PathsForModuleSrc(ctx, module.properties.Srcs)
74*333d2b36SAndroid Build Coastguard Worker	intermediateCacheFilePath := android.PathForModuleOut(ctx, "build_flag_intermediate.pb")
75*333d2b36SAndroid Build Coastguard Worker	inputFiles := make([]android.Path, len(declarationFiles))
76*333d2b36SAndroid Build Coastguard Worker	copy(inputFiles, declarationFiles)
77*333d2b36SAndroid Build Coastguard Worker
78*333d2b36SAndroid Build Coastguard Worker	// TODO(lamont): generate the rc_proto.FlagArtifacts message for the sources.
79*333d2b36SAndroid Build Coastguard Worker	args := map[string]string{
80*333d2b36SAndroid Build Coastguard Worker		"release_version": ctx.Config().ReleaseVersion(),
81*333d2b36SAndroid Build Coastguard Worker		"declarations":    android.JoinPathsWithPrefix(declarationFiles, "--decl "),
82*333d2b36SAndroid Build Coastguard Worker	}
83*333d2b36SAndroid Build Coastguard Worker	ctx.Build(pctx, android.BuildParams{
84*333d2b36SAndroid Build Coastguard Worker		Rule:        buildFlagRule,
85*333d2b36SAndroid Build Coastguard Worker		Output:      intermediateCacheFilePath,
86*333d2b36SAndroid Build Coastguard Worker		Inputs:      inputFiles,
87*333d2b36SAndroid Build Coastguard Worker		Description: "build_flag_declarations",
88*333d2b36SAndroid Build Coastguard Worker		Args:        args,
89*333d2b36SAndroid Build Coastguard Worker	})
90*333d2b36SAndroid Build Coastguard Worker
91*333d2b36SAndroid Build Coastguard Worker	intermediateDumpFilePath := android.PathForModuleOut(ctx, "build_flag_intermediate.textproto")
92*333d2b36SAndroid Build Coastguard Worker	ctx.Build(pctx, android.BuildParams{
93*333d2b36SAndroid Build Coastguard Worker		Rule:        buildFlagTextRule,
94*333d2b36SAndroid Build Coastguard Worker		Output:      intermediateDumpFilePath,
95*333d2b36SAndroid Build Coastguard Worker		Input:       intermediateCacheFilePath,
96*333d2b36SAndroid Build Coastguard Worker		Description: "build_flag_declarations_text",
97*333d2b36SAndroid Build Coastguard Worker	})
98*333d2b36SAndroid Build Coastguard Worker
99*333d2b36SAndroid Build Coastguard Worker	android.SetProvider(ctx, BuildFlagDeclarationsProviderKey, BuildFlagDeclarationsProviderData{
100*333d2b36SAndroid Build Coastguard Worker		IntermediateCacheOutputPath: intermediateCacheFilePath,
101*333d2b36SAndroid Build Coastguard Worker		IntermediateDumpOutputPath:  intermediateDumpFilePath,
102*333d2b36SAndroid Build Coastguard Worker	})
103*333d2b36SAndroid Build Coastguard Worker}
104