Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit aeaddef7 authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge "Set the appropriate deps property for the soong generated fs modules" into main

parents acd01347 dc6492f0
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -60,6 +60,7 @@ func init() {
	AddNeverAllowRules(createCcStubsRule())
	AddNeverAllowRules(createProhibitHeaderOnlyRule())
	AddNeverAllowRules(createLimitNdkExportRule()...)
	AddNeverAllowRules(createFilesystemIsAutoGeneratedRule())
}

// Add a NeverAllow rule to the set of rules to apply.
@@ -275,6 +276,14 @@ func createLimitNdkExportRule() []Rule {
	}
}

func createFilesystemIsAutoGeneratedRule() Rule {
	return NeverAllow().
		NotIn("build/soong/fsgen").
		ModuleType("filesystem", "android_system_image").
		WithMatcher("is_auto_generated", isSetMatcherInstance).
		Because("is_auto_generated property is only allowed for filesystem modules in build/soong/fsgen directory")
}

func neverallowMutator(ctx BottomUpMutatorContext) {
	m, ok := ctx.Module().(Module)
	if !ok {
+16 −0
Original line number Diff line number Diff line
@@ -359,6 +359,21 @@ var neverallowTests = []struct {
			`headers_only can only be used for generating framework-minus-apex headers for non-updatable modules`,
		},
	},
	// Test for the rule restricting use of is_auto_generated
	{
		name: `"is_auto_generated" outside allowed directory`,
		fs: map[string][]byte{
			"a/b/Android.bp": []byte(`
				filesystem {
					name: "baaz",
					is_auto_generated: true,
				}
			`),
		},
		expectedErrors: []string{
			`is_auto_generated property is only allowed for filesystem modules in build/soong/fsgen directory`,
		},
	},
}

var prepareForNeverAllowTest = GroupFixturePreparers(
@@ -367,6 +382,7 @@ var prepareForNeverAllowTest = GroupFixturePreparers(
		ctx.RegisterModuleType("java_library", newMockJavaLibraryModule)
		ctx.RegisterModuleType("java_library_host", newMockJavaLibraryModule)
		ctx.RegisterModuleType("java_device_for_host", newMockJavaLibraryModule)
		ctx.RegisterModuleType("filesystem", newMockFilesystemModule)
	}),
)

+3 −2
Original line number Diff line number Diff line
@@ -2100,6 +2100,7 @@ func (p *mockLibraryModule) GenerateAndroidBuildActions(ModuleContext) {
type mockFilesystemModuleProperties struct {
	Partition_type    *string
	Deps              []string
	Is_auto_generated *bool
}

type mockFilesystemModule struct {
+23 −3
Original line number Diff line number Diff line
@@ -145,6 +145,10 @@ type FilesystemProperties struct {
	Unchecked_module *bool `blueprint:"mutated"`

	Erofs ErofsProperties

	// Determines if the module is auto-generated from Soong or not. If the module is
	// auto-generated, its deps are exempted from visibility enforcement.
	Is_auto_generated *bool
}

// Additional properties required to generate erofs FS partitions.
@@ -179,14 +183,30 @@ func initFilesystemModule(module android.DefaultableModule, filesystemModule *fi
	android.InitDefaultableModule(module)
}

var dependencyTag = struct {
type depTag struct {
	blueprint.BaseDependencyTag
	android.PackagingItemAlwaysDepTag
}{}
}

var dependencyTag = depTag{}

type depTagWithVisibilityEnforcementBypass struct {
	depTag
}

var _ android.ExcludeFromVisibilityEnforcementTag = (*depTagWithVisibilityEnforcementBypass)(nil)

func (t depTagWithVisibilityEnforcementBypass) ExcludeFromVisibilityEnforcement() {}

var dependencyTagWithVisibilityEnforcementBypass = depTagWithVisibilityEnforcementBypass{}

func (f *filesystem) DepsMutator(ctx android.BottomUpMutatorContext) {
	if proptools.Bool(f.properties.Is_auto_generated) {
		f.AddDeps(ctx, dependencyTagWithVisibilityEnforcementBypass)
	} else {
		f.AddDeps(ctx, dependencyTag)
	}
}

type fsType int

+74 −39
Original line number Diff line number Diff line
@@ -43,17 +43,32 @@ func registerBuildComponents(ctx android.RegistrationContext) {

func RegisterCollectFileSystemDepsMutators(ctx android.RegisterMutatorsContext) {
	ctx.BottomUp("fs_collect_deps", collectDepsMutator).MutatesGlobalState()
	ctx.BottomUp("fs_set_deps", setDepsMutator)
}

var fsDepsMutex = sync.Mutex{}
var collectFsDepsOnceKey = android.NewOnceKey("CollectFsDeps")
var depCandidatesOnceKey = android.NewOnceKey("DepCandidates")

// List of partitions that the filesystem_creator module currently generates the partition
var soongGeneratedPartitions = []string{"system"}

// Map of partition module name to its partition that may be generated by Soong.
// Note that it is not guaranteed that all modules returned by this function are successfully
// created.
func getAllSoongGeneratedPartitionNames(config android.Config) map[string]string {
	ret := map[string]string{}
	for _, partition := range soongGeneratedPartitions {
		ret[generatedModuleNameForPartition(config, partition)] = partition
	}
	return ret
}

func collectDepsMutator(mctx android.BottomUpMutatorContext) {
	// These additional deps are added according to the cuttlefish system image bp.
	fsDeps := mctx.Config().Once(collectFsDepsOnceKey, func() interface{} {
		deps := []string{
			"android_vintf_manifest",
		deps := map[string][]string{
			"system": {
				"com.android.apex.cts.shim.v1_prebuilt",
				"dex_bootjars",
				"framework_compatibility_matrix.device.xml",
@@ -70,9 +85,10 @@ func collectDepsMutator(mctx android.BottomUpMutatorContext) {
				"preloaded-classes",
				"public.libraries.android.txt",
				"update_engine_sideload",
			},
		}
		return &deps
	}).(*[]string)
	}).(*map[string][]string)

	depCandidates := mctx.Config().Once(depCandidatesOnceKey, func() interface{} {
		partitionVars := mctx.Config().ProductVariables().PartitionVarsForSoongMigrationOnlyDoNotUse
@@ -82,12 +98,32 @@ func collectDepsMutator(mctx android.BottomUpMutatorContext) {

	m := mctx.Module()
	if slices.Contains(*depCandidates, m.Name()) {
		if installInSystem(mctx, m) {
		installPartition := getInstallPartition(m, mctx.DeviceConfig())
		fsDepsMutex.Lock()
			*fsDeps = append(*fsDeps, m.Name())
		if _, ok := (*fsDeps)[installPartition]; !ok {
			(*fsDeps)[installPartition] = make([]string, 0)
		}
		if m.Enabled(mctx) {
			(*fsDeps)[installPartition] = append((*fsDeps)[installPartition], m.Name())
		}
		fsDepsMutex.Unlock()
	}
}

type depsStruct struct {
	Deps []string
}

func setDepsMutator(mctx android.BottomUpMutatorContext) {
	fsDeps := mctx.Config().Get(collectFsDepsOnceKey).(*map[string][]string)
	soongGeneratedPartitionMap := getAllSoongGeneratedPartitionNames(mctx.Config())
	m := mctx.Module()
	if partition, ok := soongGeneratedPartitionMap[m.Name()]; ok {
		deps := (*fsDeps)[partition]
		if err := proptools.AppendMatchingProperties(m.GetProperties(), &depsStruct{Deps: deps}, nil); err != nil {
			mctx.ModuleErrorf(err.Error())
		}
	}
}

type filesystemCreatorProps struct {
@@ -114,7 +150,7 @@ func filesystemCreatorFactory() android.Module {
}

func (f *filesystemCreator) createInternalModules(ctx android.LoadHookContext) {
	for _, partitionType := range []string{"system"} {
	for _, partitionType := range soongGeneratedPartitions {
		if f.createPartition(ctx, partitionType) {
			f.properties.Generated_partition_types = append(f.properties.Generated_partition_types, partitionType)
		} else {
@@ -124,7 +160,7 @@ func (f *filesystemCreator) createInternalModules(ctx android.LoadHookContext) {
	f.createDeviceModule(ctx)
}

func (f *filesystemCreator) generatedModuleName(cfg android.Config, suffix string) string {
func generatedModuleName(cfg android.Config, suffix string) string {
	prefix := "soong"
	if cfg.HasDeviceProduct() {
		prefix = cfg.DeviceProduct()
@@ -132,21 +168,21 @@ func (f *filesystemCreator) generatedModuleName(cfg android.Config, suffix strin
	return fmt.Sprintf("%s_generated_%s", prefix, suffix)
}

func (f *filesystemCreator) generatedModuleNameForPartition(cfg android.Config, partitionType string) string {
	return f.generatedModuleName(cfg, fmt.Sprintf("%s_image", partitionType))
func generatedModuleNameForPartition(cfg android.Config, partitionType string) string {
	return generatedModuleName(cfg, fmt.Sprintf("%s_image", partitionType))
}

func (f *filesystemCreator) createDeviceModule(ctx android.LoadHookContext) {
	baseProps := &struct {
		Name *string
	}{
		Name: proptools.StringPtr(f.generatedModuleName(ctx.Config(), "device")),
		Name: proptools.StringPtr(generatedModuleName(ctx.Config(), "device")),
	}

	// Currently, only the system partition module is created.
	partitionProps := &filesystem.PartitionNameProperties{}
	if android.InList("system", f.properties.Generated_partition_types) {
		partitionProps.System_partition_name = proptools.StringPtr(f.generatedModuleNameForPartition(ctx.Config(), "system"))
		partitionProps.System_partition_name = proptools.StringPtr(generatedModuleNameForPartition(ctx.Config(), "system"))
	}

	ctx.CreateModule(filesystem.AndroidDeviceFactory, baseProps, partitionProps)
@@ -158,7 +194,7 @@ func (f *filesystemCreator) createPartition(ctx android.LoadHookContext, partiti
	baseProps := &struct {
		Name *string
	}{
		Name: proptools.StringPtr(f.generatedModuleNameForPartition(ctx.Config(), partitionType)),
		Name: proptools.StringPtr(generatedModuleNameForPartition(ctx.Config(), partitionType)),
	}

	fsProps := &filesystem.FilesystemProperties{}
@@ -195,6 +231,8 @@ func (f *filesystemCreator) createPartition(ctx android.LoadHookContext, partiti

	fsProps.Gen_aconfig_flags_pb = proptools.BoolPtr(true)

	fsProps.Is_auto_generated = proptools.BoolPtr(true)

	// Identical to that of the generic_system_image
	fsProps.Fsverity.Inputs = []string{
		"etc/boot-image.prof",
@@ -229,7 +267,7 @@ func (f *filesystemCreator) createPartition(ctx android.LoadHookContext, partiti
}

func (f *filesystemCreator) createDiffTest(ctx android.ModuleContext, partitionType string) android.Path {
	partitionModuleName := f.generatedModuleNameForPartition(ctx.Config(), partitionType)
	partitionModuleName := generatedModuleNameForPartition(ctx.Config(), partitionType)
	systemImage := ctx.GetDirectDepWithTag(partitionModuleName, generatedFilesystemDepTag)
	filesystemInfo, ok := android.OtherModuleProvider(ctx, systemImage, filesystem.FilesystemProvider)
	if !ok {
@@ -273,7 +311,7 @@ var generatedFilesystemDepTag systemImageDepTagType

func (f *filesystemCreator) DepsMutator(ctx android.BottomUpMutatorContext) {
	for _, partitionType := range f.properties.Generated_partition_types {
		ctx.AddDependency(ctx.Module(), generatedFilesystemDepTag, f.generatedModuleNameForPartition(ctx.Config(), partitionType))
		ctx.AddDependency(ctx.Module(), generatedFilesystemDepTag, generatedModuleNameForPartition(ctx.Config(), partitionType))
	}
}

@@ -298,11 +336,8 @@ func (f *filesystemCreator) GenerateAndroidBuildActions(ctx android.ModuleContex
	ctx.Phony("soong_generated_filesystem_tests", diffTestFiles...)
}

func installInSystem(ctx android.BottomUpMutatorContext, m android.Module) bool {
	return m.PartitionTag(ctx.DeviceConfig()) == "system" && !m.InstallInData() &&
		!m.InstallInTestcases() && !m.InstallInSanitizerDir() && !m.InstallInVendorRamdisk() &&
		!m.InstallInDebugRamdisk() && !m.InstallInRecovery() && !m.InstallInOdm() &&
		!m.InstallInVendor()
func getInstallPartition(m android.Module, config android.DeviceConfig) string {
	return m.PartitionTag(config)
}

// TODO: assemble baseProps and fsProps here
@@ -312,9 +347,9 @@ func generateBpContent(ctx android.EarlyModuleContext, partitionType string) str
		return ""
	}

	deps := ctx.Config().Get(collectFsDepsOnceKey).(*[]string)
	deps := ctx.Config().Get(collectFsDepsOnceKey).(*map[string][]string)
	depProps := &android.PackagingProperties{
		Deps: android.NewSimpleConfigurable(android.SortedUniqueStrings(*deps)),
		Deps: android.NewSimpleConfigurable(android.SortedUniqueStrings((*deps)[partitionType])),
	}

	result, err := proptools.RepackProperties([]interface{}{depProps})
Loading