diff options
| -rw-r--r-- | filesystem/avb_add_hash_footer.go | 48 | ||||
| -rw-r--r-- | filesystem/filesystem.go | 1 | ||||
| -rw-r--r-- | filesystem/filesystem_test.go | 34 |
3 files changed, 79 insertions, 4 deletions
diff --git a/filesystem/avb_add_hash_footer.go b/filesystem/avb_add_hash_footer.go index af3bdbe1a..1ee0edc96 100644 --- a/filesystem/avb_add_hash_footer.go +++ b/filesystem/avb_add_hash_footer.go @@ -23,10 +23,6 @@ import ( "android/soong/android" ) -func init() { - android.RegisterModuleType("avb_add_hash_footer", avbAddHashFooterFactory) -} - type avbAddHashFooter struct { android.ModuleBase @@ -36,6 +32,17 @@ type avbAddHashFooter struct { installDir android.InstallPath } +type avbProp struct { + // Name of a property + Name *string + + // Value of a property. Can't be used together with `file`. + Value *string + + // File from which the value of the prop is read from. Can't be used together with `value`. + File *string `android:"path,arch_variant"` +} + type avbAddHashFooterProperties struct { // Source file of this image. Can reference a genrule type module with the ":module" syntax. Src *string `android:"path,arch_variant"` @@ -57,6 +64,9 @@ type avbAddHashFooterProperties struct { // The salt in hex. Required for reproducible builds. Salt *string + + // List of properties to add to the footer + Props []avbProp } // The AVB footer adds verification information to the image. @@ -106,6 +116,10 @@ func (a *avbAddHashFooter) GenerateAndroidBuildActions(ctx android.ModuleContext } cmd.FlagWithArg("--salt ", proptools.String(a.properties.Salt)) + for _, prop := range a.properties.Props { + addAvbProp(ctx, cmd, prop) + } + cmd.FlagWithOutput("--image ", a.output) builder.Build("avbAddHashFooter", fmt.Sprintf("avbAddHashFooter %s", ctx.ModuleName())) @@ -114,6 +128,32 @@ func (a *avbAddHashFooter) GenerateAndroidBuildActions(ctx android.ModuleContext ctx.InstallFile(a.installDir, a.installFileName(), a.output) } +func addAvbProp(ctx android.ModuleContext, cmd *android.RuleBuilderCommand, prop avbProp) { + name := proptools.String(prop.Name) + value := proptools.String(prop.Value) + file := proptools.String(prop.File) + if name == "" { + ctx.PropertyErrorf("name", "can't be empty") + return + } + if value == "" && file == "" { + ctx.PropertyErrorf("value", "either value or file should be set") + return + } + if value != "" && file != "" { + ctx.PropertyErrorf("value", "value and file can't be set at the same time") + return + } + + if value != "" { + cmd.FlagWithArg("--prop ", proptools.ShellEscape(fmt.Sprintf("%s:%s", name, value))) + } else { + p := android.PathForModuleSrc(ctx, file) + cmd.Input(p) + cmd.FlagWithArg("--prop_from_file ", proptools.ShellEscape(fmt.Sprintf("%s:%s", name, cmd.PathForInput(p)))) + } +} + var _ android.AndroidMkEntriesProvider = (*avbAddHashFooter)(nil) // Implements android.AndroidMkEntriesProvider diff --git a/filesystem/filesystem.go b/filesystem/filesystem.go index 6e1e78a69..1365d4a58 100644 --- a/filesystem/filesystem.go +++ b/filesystem/filesystem.go @@ -34,6 +34,7 @@ func init() { func registerBuildComponents(ctx android.RegistrationContext) { ctx.RegisterModuleType("android_filesystem", filesystemFactory) ctx.RegisterModuleType("android_system_image", systemImageFactory) + ctx.RegisterModuleType("avb_add_hash_footer", avbAddHashFooterFactory) } type filesystem struct { diff --git a/filesystem/filesystem_test.go b/filesystem/filesystem_test.go index cda06d907..9bfcc3d6a 100644 --- a/filesystem/filesystem_test.go +++ b/filesystem/filesystem_test.go @@ -125,3 +125,37 @@ func TestFileSystemGathersItemsOnlyInSystemPartition(t *testing.T) { module := result.ModuleForTests("myfilesystem", "android_common").Module().(*systemImage) android.AssertDeepEquals(t, "entries should have foo only", []string{"components/foo"}, module.entries) } + +func TestAvbAddHashFooter(t *testing.T) { + result := fixture.RunTestWithBp(t, ` + avb_add_hash_footer { + name: "myfooter", + src: "input.img", + filename: "output.img", + partition_name: "mypartition", + private_key: "mykey", + salt: "1111", + props: [ + { + name: "prop1", + value: "value1", + }, + { + name: "prop2", + file: "value_file", + }, + ], + } + `) + cmd := result.ModuleForTests("myfooter", "android_arm64_armv8-a").Rule("avbAddHashFooter").RuleParams.Command + android.AssertStringDoesContain(t, "Can't find correct --partition_name argument", + cmd, "--partition_name mypartition") + android.AssertStringDoesContain(t, "Can't find correct --key argument", + cmd, "--key mykey") + android.AssertStringDoesContain(t, "Can't find --salt argument", + cmd, "--salt 1111") + android.AssertStringDoesContain(t, "Can't find --prop argument", + cmd, "--prop 'prop1:value1'") + android.AssertStringDoesContain(t, "Can't find --prop_from_file argument", + cmd, "--prop_from_file 'prop2:value_file'") +} |