• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Copyright (C) 2022 The Android Open Source Project
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//	http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package filesystem
16
17import (
18	"fmt"
19
20	"github.com/google/blueprint/proptools"
21
22	"android/soong/android"
23)
24
25type avbGenVbmetaImage struct {
26	android.ModuleBase
27
28	properties avbGenVbmetaImageProperties
29
30	output     android.OutputPath
31	installDir android.InstallPath
32}
33
34type avbGenVbmetaImageProperties struct {
35	// Source file of this image. Can reference a genrule type module with the ":module" syntax.
36	Src *string `android:"path,arch_variant"`
37
38	// Name of the image partition. Defaults to the name of this module.
39	Partition_name *string
40
41	// The salt in hex. Required for reproducible builds.
42	Salt *string
43}
44
45// The avbGenVbmetaImage generates an unsigned VBMeta image output for the given image.
46func avbGenVbmetaImageFactory() android.Module {
47	module := &avbGenVbmetaImage{}
48	module.AddProperties(&module.properties)
49	android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibFirst)
50	return module
51}
52
53func (a *avbGenVbmetaImage) installFileName() string {
54	return a.Name() + ".img"
55}
56
57func (a *avbGenVbmetaImage) GenerateAndroidBuildActions(ctx android.ModuleContext) {
58	builder := android.NewRuleBuilder(pctx, ctx)
59	cmd := builder.Command().BuiltTool("avbtool").Text("add_hash_footer")
60	cmd.Flag("--dynamic_partition_size")
61	cmd.Flag("--do_not_append_vbmeta_image")
62
63	partition_name := proptools.StringDefault(a.properties.Partition_name, a.Name())
64	cmd.FlagWithArg("--partition_name ", partition_name)
65
66	if a.properties.Src == nil {
67		ctx.PropertyErrorf("src", "missing source file")
68		return
69	}
70	input := android.PathForModuleSrc(ctx, proptools.String(a.properties.Src))
71	cmd.FlagWithInput("--image ", input)
72
73	if a.properties.Salt == nil {
74		ctx.PropertyErrorf("salt", "missing salt value")
75		return
76	}
77	cmd.FlagWithArg("--salt ", proptools.String(a.properties.Salt))
78
79	a.output = android.PathForModuleOut(ctx, a.installFileName()).OutputPath
80	cmd.FlagWithOutput("--output_vbmeta_image ", a.output)
81	builder.Build("avbGenVbmetaImage", fmt.Sprintf("avbGenVbmetaImage %s", ctx.ModuleName()))
82}
83
84var _ android.AndroidMkEntriesProvider = (*avbGenVbmetaImage)(nil)
85
86// Implements android.AndroidMkEntriesProvider
87func (a *avbGenVbmetaImage) AndroidMkEntries() []android.AndroidMkEntries {
88	return []android.AndroidMkEntries{android.AndroidMkEntries{
89		Class:      "ETC",
90		OutputFile: android.OptionalPathForPath(a.output),
91		ExtraEntries: []android.AndroidMkExtraEntriesFunc{
92			func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) {
93				entries.SetString("LOCAL_MODULE_PATH", a.installDir.String())
94				entries.SetString("LOCAL_INSTALLED_MODULE_STEM", a.installFileName())
95			},
96		},
97	}}
98}
99
100var _ android.OutputFileProducer = (*avbGenVbmetaImage)(nil)
101
102// Implements android.OutputFileProducer
103func (a *avbGenVbmetaImage) OutputFiles(tag string) (android.Paths, error) {
104	if tag == "" {
105		return []android.Path{a.output}, nil
106	}
107	return nil, fmt.Errorf("unsupported module reference tag %q", tag)
108}
109