| // 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 |
| } |