diff --git a/etc/prebuilt_etc.go b/etc/prebuilt_etc.go index 5a4818f4f..d04b2d1f1 100644 --- a/etc/prebuilt_etc.go +++ b/etc/prebuilt_etc.go @@ -50,6 +50,7 @@ func RegisterPrebuiltEtcBuildComponents(ctx android.RegistrationContext) { ctx.RegisterModuleType("prebuilt_etc", PrebuiltEtcFactory) ctx.RegisterModuleType("prebuilt_etc_host", PrebuiltEtcHostFactory) ctx.RegisterModuleType("prebuilt_etc_cacerts", PrebuiltEtcCaCertsFactory) + ctx.RegisterModuleType("prebuilt_avb", PrebuiltAvbFactory) ctx.RegisterModuleType("prebuilt_root", PrebuiltRootFactory) ctx.RegisterModuleType("prebuilt_root_host", PrebuiltRootHostFactory) ctx.RegisterModuleType("prebuilt_usr_share", PrebuiltUserShareFactory) @@ -155,6 +156,9 @@ type PrebuiltEtc struct { additionalDependencies *android.Paths usedSrcsProperty bool + // installInRoot is used to return the value of the InstallInRoot() method. The default value is false. + // Currently, only prebuilt_avb can be set to true. + installInRoot bool makeClass string } @@ -241,6 +245,10 @@ func (p *PrebuiltEtc) DebugRamdiskVariantNeeded(ctx android.BaseModuleContext) b return proptools.Bool(p.properties.Debug_ramdisk_available) || p.ModuleBase.InstallInDebugRamdisk() } +func (p *PrebuiltEtc) InstallInRoot() bool { + return p.installInRoot +} + func (p *PrebuiltEtc) RecoveryVariantNeeded(ctx android.BaseModuleContext) bool { return proptools.Bool(p.properties.Recovery_available) || p.ModuleBase.InstallInRecovery() } @@ -494,12 +502,20 @@ func (p *PrebuiltEtc) AndroidModuleBase() *android.ModuleBase { func InitPrebuiltEtcModule(p *PrebuiltEtc, dirBase string) { p.installDirBase = dirBase + p.installInRoot = false p.AddProperties(&p.properties) p.AddProperties(&p.subdirProperties) } func InitPrebuiltRootModule(p *PrebuiltEtc) { p.installDirBase = "." + p.installInRoot = false + p.AddProperties(&p.properties) +} + +func InitPrebuiltAvbModule(p *PrebuiltEtc) { + p.installDirBase = "avb" + p.installInRoot = true p.AddProperties(&p.properties) } @@ -553,6 +569,20 @@ func PrebuiltEtcCaCertsFactory() android.Module { return module } +// Generally, a directory will contain a `system` subdirectory, but the of +// `prebuilt_avb` will not have a `system` subdirectory. +// Ultimately, prebuilt_avb will install the prebuilt artifact to the `avb` subdirectory under the +// root directory of the partition: /avb. +// prebuilt_avb does not allow adding any other subdirectories. +func PrebuiltAvbFactory() android.Module { + module := &PrebuiltEtc{} + InitPrebuiltAvbModule(module) + // This module is device-only + android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibFirst) + android.InitDefaultableModule(module) + return module +} + // prebuilt_root is for a prebuilt artifact that is installed in // / directory. Can't have any sub directories. func PrebuiltRootFactory() android.Module { diff --git a/etc/prebuilt_etc_test.go b/etc/prebuilt_etc_test.go index c44574aab..e739afed9 100644 --- a/etc/prebuilt_etc_test.go +++ b/etc/prebuilt_etc_test.go @@ -244,6 +244,31 @@ func TestPrebuiltRootInstallDirPathValidate(t *testing.T) { `) } +func TestPrebuiltAvbInstallDirPath(t *testing.T) { + result := prepareForPrebuiltEtcTest.RunTestWithBp(t, ` + prebuilt_avb { + name: "foo.conf", + src: "foo.conf", + filename: "foo.conf", + //recovery: true, + } + `) + + p := result.Module("foo.conf", "android_arm64_armv8-a").(*PrebuiltEtc) + expected := "out/soong/target/product/test_device/root/avb" + android.AssertPathRelativeToTopEquals(t, "install dir", expected, p.installDirPath) +} + +func TestPrebuiltAvdInstallDirPathValidate(t *testing.T) { + prepareForPrebuiltEtcTest.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("filename cannot contain separator")).RunTestWithBp(t, ` + prebuilt_avb { + name: "foo.conf", + src: "foo.conf", + filename: "foo/bar.conf", + } + `) +} + func TestPrebuiltUserShareInstallDirPath(t *testing.T) { result := prepareForPrebuiltEtcTest.RunTestWithBp(t, ` prebuilt_usr_share {