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