// Copyright 2024 The Android Open Source Project // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package android import ( "github.com/google/blueprint" "github.com/google/blueprint/proptools" ) var ( mergeAndRemoveComments = pctx.AndroidStaticRule("merge_and_remove_comments", blueprint.RuleParams{ Command: "cat $in | grep -v '#' > $out", }, ) androidInfoTxtToProp = pctx.AndroidStaticRule("android_info_txt_to_prop", blueprint.RuleParams{ Command: "grep 'require version-' $in | sed -e 's/require version-/ro.build.expect./g' > $out", }, ) ) type androidInfoProperties struct { // Name of output file. Defaults to module name Stem *string // Paths of board-info.txt files. Board_info_files []string `android:"path"` // Name of bootloader board. If board_info_files is empty, `board={bootloader_board_name}` will // be printed to output. Ignored if board_info_files is not empty. Bootloader_board_name *string } type androidInfoModule struct { ModuleBase properties androidInfoProperties } func (p *androidInfoModule) GenerateAndroidBuildActions(ctx ModuleContext) { if len(p.properties.Board_info_files) > 0 && p.properties.Bootloader_board_name != nil { ctx.ModuleErrorf("Either Board_info_files or Bootloader_board_name should be set. Please remove one of them\n") return } androidInfoTxtName := proptools.StringDefault(p.properties.Stem, ctx.ModuleName()+".txt") androidInfoTxt := PathForModuleOut(ctx, androidInfoTxtName) androidInfoProp := androidInfoTxt.ReplaceExtension(ctx, "prop") if boardInfoFiles := PathsForModuleSrc(ctx, p.properties.Board_info_files); len(boardInfoFiles) > 0 { ctx.Build(pctx, BuildParams{ Rule: mergeAndRemoveComments, Inputs: boardInfoFiles, Output: androidInfoTxt, }) } else if bootloaderBoardName := proptools.String(p.properties.Bootloader_board_name); bootloaderBoardName != "" { WriteFileRule(ctx, androidInfoTxt, "board="+bootloaderBoardName) } else { WriteFileRule(ctx, androidInfoTxt, "") } // Create android_info.prop ctx.Build(pctx, BuildParams{ Rule: androidInfoTxtToProp, Input: androidInfoTxt, Output: androidInfoProp, }) ctx.SetOutputFiles(Paths{androidInfoProp}, "") } // android_info module generate a file named android-info.txt that contains various information // about the device we're building for. This file is typically packaged up with everything else. func AndroidInfoFactory() Module { module := &androidInfoModule{} module.AddProperties(&module.properties) InitAndroidModule(module) return module }