diff options
| -rw-r--r-- | android/prebuilt.go | 19 | ||||
| -rw-r--r-- | android/vintf_fragment.go | 2 | ||||
| -rw-r--r-- | android/vintf_fragment_test.go | 2 | ||||
| -rw-r--r-- | etc/adb_keys.go | 1 | ||||
| -rw-r--r-- | filesystem/filesystem.go | 17 | ||||
| -rw-r--r-- | fsgen/filesystem_creator.go | 32 | ||||
| -rw-r--r-- | genrule/genrule.go | 6 | ||||
| -rw-r--r-- | java/app_import.go | 42 |
8 files changed, 96 insertions, 25 deletions
diff --git a/android/prebuilt.go b/android/prebuilt.go index 19f12f035..5d75b62fe 100644 --- a/android/prebuilt.go +++ b/android/prebuilt.go @@ -272,6 +272,25 @@ func InitConfigurablePrebuiltModule(module PrebuiltInterface, srcs *proptools.Co InitPrebuiltModuleWithSrcSupplier(module, srcsSupplier, "srcs") } +// InitConfigurablePrebuiltModuleString is the same as InitPrebuiltModule, but uses a +// Configurable string property instead of a regular list of strings. It only produces a single +// source file. +func InitConfigurablePrebuiltModuleString(module PrebuiltInterface, srcs *proptools.Configurable[string], propertyName string) { + if srcs == nil { + panic(fmt.Errorf("%s must not be nil", propertyName)) + } + + srcsSupplier := func(ctx BaseModuleContext, _ Module) []string { + src := srcs.GetOrDefault(ctx, "") + if src == "" { + return nil + } + return []string{src} + } + + InitPrebuiltModuleWithSrcSupplier(module, srcsSupplier, propertyName) +} + func InitSingleSourcePrebuiltModule(module PrebuiltInterface, srcProps interface{}, srcField string) { srcPropsValue := reflect.ValueOf(srcProps).Elem() srcStructField, _ := srcPropsValue.Type().FieldByName(srcField) diff --git a/android/vintf_fragment.go b/android/vintf_fragment.go index 329eac974..42eaaf01a 100644 --- a/android/vintf_fragment.go +++ b/android/vintf_fragment.go @@ -44,7 +44,7 @@ func vintfLibraryFactory() Module { m.AddProperties( &m.properties, ) - InitAndroidArchModule(m, DeviceSupported, MultilibFirst) + InitAndroidArchModule(m, DeviceSupported, MultilibCommon) return m } diff --git a/android/vintf_fragment_test.go b/android/vintf_fragment_test.go index 8be534cf4..cd90b986c 100644 --- a/android/vintf_fragment_test.go +++ b/android/vintf_fragment_test.go @@ -29,7 +29,7 @@ func TestVintfManifestBuildAction(t *testing.T) { testResult := PrepareForTestWithAndroidBuildComponents.RunTestWithBp(t, bp) - vintfFragmentBuild := testResult.TestContext.ModuleForTests("test_vintf_fragment", "android_arm64_armv8-a").Rule("assemble_vintf") + vintfFragmentBuild := testResult.TestContext.ModuleForTests("test_vintf_fragment", "android_common").Rule("assemble_vintf") if !strings.Contains(vintfFragmentBuild.RuleParams.Command, "assemble_vintf") { t.Errorf("Vintf_manifest build command does not process with assemble_vintf : " + vintfFragmentBuild.RuleParams.Command) } diff --git a/etc/adb_keys.go b/etc/adb_keys.go index 1bce2f124..a2df41c8e 100644 --- a/etc/adb_keys.go +++ b/etc/adb_keys.go @@ -37,7 +37,6 @@ func AdbKeysModuleFactory() android.Module { func (m *AdbKeysModule) GenerateAndroidBuildActions(ctx android.ModuleContext) { productVariables := ctx.Config().ProductVariables() if !(android.Bool(productVariables.Debuggable) && len(android.String(productVariables.AdbKeys)) > 0) { - m.Disable() m.SkipInstall() return } diff --git a/filesystem/filesystem.go b/filesystem/filesystem.go index 1e816a752..8c59df371 100644 --- a/filesystem/filesystem.go +++ b/filesystem/filesystem.go @@ -198,6 +198,10 @@ const ( unknown ) +func (fs fsType) IsUnknown() bool { + return fs == unknown +} + type FilesystemInfo struct { // A text file containing the list of paths installed on the partition. FileListFile android.Path @@ -205,8 +209,7 @@ type FilesystemInfo struct { var FilesystemProvider = blueprint.NewProvider[FilesystemInfo]() -func (f *filesystem) fsType(ctx android.ModuleContext) fsType { - typeStr := proptools.StringDefault(f.properties.Type, "ext4") +func GetFsTypeFromString(ctx android.EarlyModuleContext, typeStr string) fsType { switch typeStr { case "ext4": return ext4Type @@ -217,11 +220,19 @@ func (f *filesystem) fsType(ctx android.ModuleContext) fsType { case "cpio": return cpioType default: - ctx.PropertyErrorf("type", "%q not supported", typeStr) return unknown } } +func (f *filesystem) fsType(ctx android.ModuleContext) fsType { + typeStr := proptools.StringDefault(f.properties.Type, "ext4") + fsType := GetFsTypeFromString(ctx, typeStr) + if fsType == unknown { + ctx.PropertyErrorf("type", "%q not supported", typeStr) + } + return fsType +} + func (f *filesystem) installFileName() string { return f.BaseModuleName() + ".img" } diff --git a/fsgen/filesystem_creator.go b/fsgen/filesystem_creator.go index ed0c390ba..d5e0c581a 100644 --- a/fsgen/filesystem_creator.go +++ b/fsgen/filesystem_creator.go @@ -114,7 +114,11 @@ func filesystemCreatorFactory() android.Module { } func (f *filesystemCreator) createInternalModules(ctx android.LoadHookContext) { - for _, partitionType := range []string{"system"} { + partitionTypes := []string{"system"} + if ctx.DeviceConfig().SystemExtPath() == "system_ext" { // system_ext exists + partitionTypes = append(partitionTypes, "system_ext") + } + for _, partitionType := range partitionTypes { if f.createPartition(ctx, partitionType) { f.properties.Generated_partition_types = append(f.properties.Generated_partition_types, partitionType) } else { @@ -143,15 +147,23 @@ func (f *filesystemCreator) createDeviceModule(ctx android.LoadHookContext) { Name: proptools.StringPtr(f.generatedModuleName(ctx.Config(), "device")), } - // Currently, only the system partition module is created. + // Currently, only the system and system_ext 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")) } + if android.InList("system_ext", f.properties.Generated_partition_types) { + partitionProps.System_ext_partition_name = proptools.StringPtr(f.generatedModuleNameForPartition(ctx.Config(), "system_ext")) + } ctx.CreateModule(filesystem.AndroidDeviceFactory, baseProps, partitionProps) } +var ( + // https://source.corp.google.com/h/googleplex-android/platform/build/+/639d79f5012a6542ab1f733b0697db45761ab0f3:core/packaging/flags.mk;l=21;drc=5ba8a8b77507f93aa48cc61c5ba3f31a4d0cbf37;bpv=1;bpt=0 + partitionsWithAconfig = []string{"system", "product", "vendor"} +) + // Creates a soong module to build the given partition. Returns false if we can't support building // it. func (f *filesystemCreator) createPartition(ctx android.LoadHookContext, partitionType string) bool { @@ -183,17 +195,19 @@ func (f *filesystemCreator) createPartition(ctx android.LoadHookContext, partiti fsProps.Partition_name = proptools.StringPtr(partitionType) // BOARD_SYSTEMIMAGE_FILE_SYSTEM_TYPE - fsProps.Type = proptools.StringPtr(specificPartitionVars.BoardFileSystemType) - if *fsProps.Type != "ext4" { - // TODO(b/372522486): Support other FS types. - // Currently the android_filesystem module type only supports ext4: - // https://cs.android.com/android/platform/superproject/main/+/main:build/soong/filesystem/filesystem.go;l=416;drc=98047cfd07944b297a12d173453bc984806760d2 + fsType := specificPartitionVars.BoardFileSystemType + if fsType == "" { + fsType = "ext4" //default + } + fsProps.Type = proptools.StringPtr(fsType) + if filesystem.GetFsTypeFromString(ctx, *fsProps.Type).IsUnknown() { + // Currently the android_filesystem module type only supports a handful of FS types like ext4, erofs return false } fsProps.Base_dir = proptools.StringPtr(partitionType) - fsProps.Gen_aconfig_flags_pb = proptools.BoolPtr(true) + fsProps.Gen_aconfig_flags_pb = proptools.BoolPtr(android.InList(partitionType, partitionsWithAconfig)) // Identical to that of the generic_system_image fsProps.Fsverity.Inputs = []string{ @@ -222,6 +236,8 @@ func (f *filesystemCreator) createPartition(ctx android.LoadHookContext, partiti if partitionType == "system" { module = ctx.CreateModule(filesystem.SystemImageFactory, baseProps, fsProps) } else { + // Explicitly set the partition. + fsProps.Partition_type = proptools.StringPtr(partitionType) module = ctx.CreateModule(filesystem.FilesystemFactory, baseProps, fsProps) } module.HideFromMake() diff --git a/genrule/genrule.go b/genrule/genrule.go index c029167d0..349615f7e 100644 --- a/genrule/genrule.go +++ b/genrule/genrule.go @@ -645,6 +645,12 @@ func (g *Module) GenerateAndroidBuildActions(ctx android.ModuleContext) { } g.setOutputFiles(ctx) + + if ctx.Os() == android.Windows { + // Make doesn't support windows: + // https://cs.android.com/android/platform/superproject/main/+/main:build/make/core/module_arch_supported.mk;l=66;drc=f264690860bb6ee7762784d6b7201aae057ba6f2 + g.HideFromMake() + } } func (g *Module) setOutputFiles(ctx android.ModuleContext) { diff --git a/java/app_import.go b/java/app_import.go index a54cf2fc3..f5d9f3e79 100644 --- a/java/app_import.go +++ b/java/app_import.go @@ -61,6 +61,9 @@ var ( func RegisterAppImportBuildComponents(ctx android.RegistrationContext) { ctx.RegisterModuleType("android_app_import", AndroidAppImportFactory) ctx.RegisterModuleType("android_test_import", AndroidTestImportFactory) + ctx.PreArchMutators(func(ctx android.RegisterMutatorsContext) { + ctx.BottomUp("disable_prebuilts_without_apk", disablePrebuiltsWithoutApkMutator) + }) } type AndroidAppImport struct { @@ -90,7 +93,7 @@ type AndroidAppImport struct { type AndroidAppImportProperties struct { // A prebuilt apk to import - Apk *string `android:"path"` + Apk proptools.Configurable[string] `android:"path,replace_instead_of_append"` // The name of a certificate in the default certificate directory or an android_app_certificate // module name in the form ":module". Should be empty if presigned or default_dev_cert is set. @@ -193,13 +196,6 @@ func (a *AndroidAppImport) processVariants(ctx android.DefaultableHookContext) { } } } - - if String(a.properties.Apk) == "" { - // Disable this module since the apk property is still empty after processing all matching - // variants. This likely means there is no matching variant, and the default variant doesn't - // have an apk property value either. - a.Disable() - } } func MergePropertiesFromVariant(ctx android.EarlyModuleContext, @@ -219,6 +215,30 @@ func MergePropertiesFromVariant(ctx android.EarlyModuleContext, } } +// disablePrebuiltsWithoutApkMutator is a pre-arch mutator that disables AndroidAppImport or +// AndroidTestImport modules that don't have an apk set. We need this separate mutator instead +// of doing it in processVariants because processVariants is a defaultable hook, and configurable +// properties can only be evaluated after the defaults (and eventually, base configurabtion) +// mutators. +func disablePrebuiltsWithoutApkMutator(ctx android.BottomUpMutatorContext) { + switch a := ctx.Module().(type) { + case *AndroidAppImport: + if a.properties.Apk.GetOrDefault(ctx, "") == "" { + // Disable this module since the apk property is still empty after processing all + // matching variants. This likely means there is no matching variant, and the default + // variant doesn't have an apk property value either. + a.Disable() + } + case *AndroidTestImport: + if a.properties.Apk.GetOrDefault(ctx, "") == "" { + // Disable this module since the apk property is still empty after processing all + // matching variants. This likely means there is no matching variant, and the default + // variant doesn't have an apk property value either. + a.Disable() + } + } +} + func (a *AndroidAppImport) DepsMutator(ctx android.BottomUpMutatorContext) { cert := android.SrcIsModule(String(a.properties.Certificate)) if cert != "" { @@ -409,7 +429,7 @@ func (a *AndroidAppImport) generateAndroidBuildActions(ctx android.ModuleContext if apexInfo.IsForPlatform() { a.installPath = ctx.InstallFile(installDir, apkFilename, a.outputFile) - artifactPath := android.PathForModuleSrc(ctx, *a.properties.Apk) + artifactPath := android.PathForModuleSrc(ctx, a.properties.Apk.GetOrDefault(ctx, "")) a.provenanceMetaDataFile = provenance.GenerateArtifactProvenanceMetaData(ctx, artifactPath, a.installPath) } @@ -633,7 +653,7 @@ func AndroidAppImportFactory() android.Module { android.InitApexModule(module) android.InitAndroidMultiTargetsArchModule(module, android.DeviceSupported, android.MultilibCommon) android.InitDefaultableModule(module) - android.InitSingleSourcePrebuiltModule(module, &module.properties, "Apk") + android.InitConfigurablePrebuiltModuleString(module, &module.properties.Apk, "Apk") module.usesLibrary.enforce = true @@ -686,7 +706,7 @@ func AndroidTestImportFactory() android.Module { android.InitApexModule(module) android.InitAndroidMultiTargetsArchModule(module, android.DeviceSupported, android.MultilibCommon) android.InitDefaultableModule(module) - android.InitSingleSourcePrebuiltModule(module, &module.properties, "Apk") + android.InitConfigurablePrebuiltModuleString(module, &module.properties.Apk, "Apk") return module } |