diff options
-rw-r--r-- | Android.bp | 13 | ||||
-rw-r--r-- | android/Android.bp | 1 | ||||
-rw-r--r-- | android/config.go | 4 | ||||
-rw-r--r-- | android/logtags.go | 48 | ||||
-rw-r--r-- | android/recovery_build_prop.go | 111 | ||||
-rw-r--r-- | android/variable.go | 2 | ||||
-rw-r--r-- | cc/config/x86_windows_host.go | 2 | ||||
-rw-r--r-- | cc/library.go | 10 | ||||
-rw-r--r-- | cmd/release_config/release_config/main.go | 2 | ||||
-rw-r--r-- | cmd/release_config/release_config_lib/release_config.go | 12 | ||||
-rw-r--r-- | cmd/release_config/release_config_lib/release_configs.go | 1 | ||||
-rw-r--r-- | filesystem/bootimg.go | 10 | ||||
-rw-r--r-- | filesystem/filesystem.go | 37 | ||||
-rw-r--r-- | filesystem/filesystem_test.go | 2 | ||||
-rw-r--r-- | filesystem/fsverity_metadata.go | 14 | ||||
-rw-r--r-- | fsgen/filesystem_creator.go | 37 | ||||
-rw-r--r-- | fsgen/fsgen_mutators.go | 1 | ||||
-rw-r--r-- | java/base.go | 35 | ||||
-rw-r--r-- | rust/proc_macro.go | 1 |
19 files changed, 283 insertions, 60 deletions
diff --git a/Android.bp b/Android.bp index 434ee9f96..d78379a60 100644 --- a/Android.bp +++ b/Android.bp @@ -179,6 +179,7 @@ build_prop { visibility: [ "//build/make/target/product/generic", "//build/make/target/product/gsi", + "//build/soong/fsgen", "//packages/modules/Virtualization/build/microdroid", "//frameworks/base/ravenwood", ], @@ -190,7 +191,10 @@ build_prop { system_ext_specific: true, product_config: ":product_config", relative_install_path: "etc", // system_ext/etc/build.prop - visibility: ["//build/make/target/product/gsi"], + visibility: [ + "//build/make/target/product/gsi", + "//build/soong/fsgen", + ], } build_prop { @@ -199,7 +203,10 @@ build_prop { product_specific: true, product_config: ":product_config", relative_install_path: "etc", // product/etc/build.prop - visibility: ["//build/make/target/product/gsi"], + visibility: [ + "//build/make/target/product/gsi", + "//build/soong/fsgen", + ], } build_prop { @@ -208,7 +215,7 @@ build_prop { device_specific: true, product_config: ":product_config", relative_install_path: "etc", // odm/etc/build.prop - visibility: ["//visibility:private"], + visibility: ["//build/soong/fsgen"], } build_prop { diff --git a/android/Android.bp b/android/Android.bp index 20cd28be5..79969a8f0 100644 --- a/android/Android.bp +++ b/android/Android.bp @@ -95,6 +95,7 @@ bootstrap_go_package { "proto.go", "provider.go", "raw_files.go", + "recovery_build_prop.go", "register.go", "rule_builder.go", "sandbox.go", diff --git a/android/config.go b/android/config.go index b811c55eb..d78bbf774 100644 --- a/android/config.go +++ b/android/config.go @@ -1320,6 +1320,10 @@ func (c *config) RunErrorProne() bool { return c.IsEnvTrue("RUN_ERROR_PRONE") } +func (c *config) RunErrorProneInline() bool { + return c.IsEnvTrue("RUN_ERROR_PRONE_INLINE") +} + // XrefCorpusName returns the Kythe cross-reference corpus name. func (c *config) XrefCorpusName() string { return c.Getenv("XREF_CORPUS") diff --git a/android/logtags.go b/android/logtags.go index 1e92dad68..abc37f997 100644 --- a/android/logtags.go +++ b/android/logtags.go @@ -14,10 +14,56 @@ package android -import "github.com/google/blueprint" +import ( + "strings" + + "github.com/google/blueprint" +) + +func init() { + RegisterParallelSingletonType("logtags", LogtagsSingleton) +} type LogtagsInfo struct { Logtags Paths } var LogtagsProviderKey = blueprint.NewProvider[*LogtagsInfo]() + +func LogtagsSingleton() Singleton { + return &logtagsSingleton{} +} + +type logtagsSingleton struct{} + +func MergedLogtagsPath(ctx PathContext) OutputPath { + return PathForIntermediates(ctx, "all-event-log-tags.txt") +} + +func (l *logtagsSingleton) GenerateBuildActions(ctx SingletonContext) { + var allLogtags Paths + ctx.VisitAllModules(func(module Module) { + if !module.ExportedToMake() { + return + } + if logtagsInfo, ok := OtherModuleProvider(ctx, module, LogtagsProviderKey); ok { + allLogtags = append(allLogtags, logtagsInfo.Logtags...) + } + }) + allLogtags = SortedUniquePaths(allLogtags) + filteredLogTags := make([]Path, 0, len(allLogtags)) + for _, p := range allLogtags { + // Logic copied from make: + // https://cs.android.com/android/platform/superproject/main/+/main:build/make/core/Makefile;l=987;drc=0585bb1bcf4c89065adaf709f48acc8b869fd3ce + if !strings.HasPrefix(p.String(), "vendor/") && !strings.HasPrefix(p.String(), "device/") && !strings.HasPrefix(p.String(), "out/") { + filteredLogTags = append(filteredLogTags, p) + } + } + + builder := NewRuleBuilder(pctx, ctx) + builder.Command(). + BuiltTool("merge-event-log-tags"). + FlagWithOutput("-o ", MergedLogtagsPath(ctx)). + Inputs(filteredLogTags) + builder.Build("all-event-log-tags.txt", "merge logtags") +} diff --git a/android/recovery_build_prop.go b/android/recovery_build_prop.go new file mode 100644 index 000000000..91d190421 --- /dev/null +++ b/android/recovery_build_prop.go @@ -0,0 +1,111 @@ +// Copyright 2024 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package android + +import "github.com/google/blueprint/proptools" + +func init() { + RegisterModuleType("recovery_build_prop", RecoveryBuildPropModuleFactory) +} + +type recoveryBuildPropProperties struct { + // Path to the system build.prop file + System_build_prop *string `android:"path"` + + // Path to the vendor build.prop file + Vendor_build_prop *string `android:"path"` + + // Path to the odm build.prop file + Odm_build_prop *string `android:"path"` + + // Path to the product build.prop file + Product_build_prop *string `android:"path"` + + // Path to the system_ext build.prop file + System_ext_build_prop *string `android:"path"` +} + +type recoveryBuildPropModule struct { + ModuleBase + properties recoveryBuildPropProperties + + outputFilePath ModuleOutPath + + installPath InstallPath +} + +func RecoveryBuildPropModuleFactory() Module { + module := &recoveryBuildPropModule{} + module.AddProperties(&module.properties) + InitAndroidArchModule(module, DeviceSupported, MultilibCommon) + return module +} + +// Overrides ctx.Module().InstallInRoot(). +// recovery_build_prop module always installs in root so that the prop.default +// file is installed in recovery/root instead of recovery/root/system +func (r *recoveryBuildPropModule) InstallInRoot() bool { + return true +} + +func (r *recoveryBuildPropModule) appendRecoveryUIProperties(ctx ModuleContext, rule *RuleBuilder) { + rule.Command().Text("echo '#' >>").Output(r.outputFilePath) + rule.Command().Text("echo '# RECOVERY UI BUILD PROPERTIES' >>").Output(r.outputFilePath) + rule.Command().Text("echo '#' >>").Output(r.outputFilePath) + + for propName, val := range ctx.Config().ProductVariables().PartitionVarsForSoongMigrationOnlyDoNotUse.PrivateRecoveryUiProperties { + if len(val) > 0 { + rule.Command(). + Textf("echo ro.recovery.ui.%s=%s >>", propName, val). + Output(r.outputFilePath) + } + } +} + +func (r *recoveryBuildPropModule) getBuildProps(ctx ModuleContext) Paths { + var buildProps Paths + for _, buildProp := range []*string{ + r.properties.System_build_prop, + r.properties.Vendor_build_prop, + r.properties.Odm_build_prop, + r.properties.Product_build_prop, + r.properties.System_ext_build_prop, + } { + if buildPropPath := PathForModuleSrc(ctx, proptools.String(buildProp)); buildPropPath != nil { + buildProps = append(buildProps, buildPropPath) + } + } + return buildProps +} + +func (r *recoveryBuildPropModule) GenerateAndroidBuildActions(ctx ModuleContext) { + if !r.InstallInRecovery() { + ctx.ModuleErrorf("recovery_build_prop module must set `recovery` property to true") + } + r.outputFilePath = PathForModuleOut(ctx, ctx.ModuleName(), "prop.default") + + // Replicates the logic in https://cs.android.com/android/platform/superproject/main/+/main:build/make/core/Makefile;l=2733;drc=0585bb1bcf4c89065adaf709f48acc8b869fd3ce + rule := NewRuleBuilder(pctx, ctx) + rule.Command().Text("rm").FlagWithOutput("-f ", r.outputFilePath) + rule.Command().Text("cat"). + Inputs(r.getBuildProps(ctx)). + Text(">>"). + Output(r.outputFilePath) + r.appendRecoveryUIProperties(ctx, rule) + + rule.Build(ctx.ModuleName(), "generating recovery prop.default") + r.installPath = PathForModuleInstall(ctx) + ctx.InstallFile(r.installPath, "prop.default", r.outputFilePath) +} diff --git a/android/variable.go b/android/variable.go index 19f63e33f..69e0337a6 100644 --- a/android/variable.go +++ b/android/variable.go @@ -688,6 +688,8 @@ type PartitionVariables struct { ProductFsverityGenerateMetadata bool `json:",omitempty"` TargetScreenDensity string `json:",omitempty"` + + PrivateRecoveryUiProperties map[string]string `json:",omitempty"` } func boolPtr(v bool) *bool { diff --git a/cc/config/x86_windows_host.go b/cc/config/x86_windows_host.go index a4d43b996..1f6cf23a7 100644 --- a/cc/config/x86_windows_host.go +++ b/cc/config/x86_windows_host.go @@ -106,6 +106,8 @@ var ( } windowsAvailableLibraries = addPrefix([]string{ + "bcrypt", + "dbghelp", "gdi32", "imagehlp", "iphlpapi", diff --git a/cc/library.go b/cc/library.go index ebc65efbd..a3a2f5c77 100644 --- a/cc/library.go +++ b/cc/library.go @@ -34,6 +34,8 @@ import ( // LibraryProperties is a collection of properties shared by cc library rules/cc. type LibraryProperties struct { + // local file name to pass to the linker as -exported_symbols_list + Exported_symbols_list *string `android:"path,arch_variant"` // local file name to pass to the linker as -unexported_symbols_list Unexported_symbols_list *string `android:"path,arch_variant"` // local file name to pass to the linker as -force_symbols_not_weak_list @@ -1049,10 +1051,14 @@ func (library *libraryDecorator) linkShared(ctx ModuleContext, linkerDeps = append(linkerDeps, flags.LdFlagsDeps...) linkerDeps = append(linkerDeps, ndkSharedLibDeps(ctx)...) + exportedSymbols := ctx.ExpandOptionalSource(library.Properties.Exported_symbols_list, "exported_symbols_list") unexportedSymbols := ctx.ExpandOptionalSource(library.Properties.Unexported_symbols_list, "unexported_symbols_list") forceNotWeakSymbols := ctx.ExpandOptionalSource(library.Properties.Force_symbols_not_weak_list, "force_symbols_not_weak_list") forceWeakSymbols := ctx.ExpandOptionalSource(library.Properties.Force_symbols_weak_list, "force_symbols_weak_list") if !ctx.Darwin() { + if exportedSymbols.Valid() { + ctx.PropertyErrorf("exported_symbols_list", "Only supported on Darwin") + } if unexportedSymbols.Valid() { ctx.PropertyErrorf("unexported_symbols_list", "Only supported on Darwin") } @@ -1063,6 +1069,10 @@ func (library *libraryDecorator) linkShared(ctx ModuleContext, ctx.PropertyErrorf("force_symbols_weak_list", "Only supported on Darwin") } } else { + if exportedSymbols.Valid() { + flags.Local.LdFlags = append(flags.Local.LdFlags, "-Wl,-exported_symbols_list,"+exportedSymbols.String()) + linkerDeps = append(linkerDeps, exportedSymbols.Path()) + } if unexportedSymbols.Valid() { flags.Local.LdFlags = append(flags.Local.LdFlags, "-Wl,-unexported_symbols_list,"+unexportedSymbols.String()) linkerDeps = append(linkerDeps, unexportedSymbols.Path()) diff --git a/cmd/release_config/release_config/main.go b/cmd/release_config/release_config/main.go index d06b2b796..7013d6bd4 100644 --- a/cmd/release_config/release_config/main.go +++ b/cmd/release_config/release_config/main.go @@ -95,7 +95,7 @@ func main() { if allMake { // Write one makefile per release config, using the canonical release name. for _, c := range configs.GetSortedReleaseConfigs() { - if c.Name != targetRelease { + if c.Name != targetRelease && !c.DisallowLunchUse { makefilePath = filepath.Join(outputDir, fmt.Sprintf("release_config-%s-%s.varmk", product, c.Name)) err = config.WriteMakefile(makefilePath, c.Name, configs) if err != nil { diff --git a/cmd/release_config/release_config_lib/release_config.go b/cmd/release_config/release_config_lib/release_config.go index 719ddc08c..873f2fc28 100644 --- a/cmd/release_config/release_config_lib/release_config.go +++ b/cmd/release_config/release_config_lib/release_config.go @@ -67,6 +67,9 @@ type ReleaseConfig struct { // overrides. Build flag value overrides are an error. AconfigFlagsOnly bool + // True if this release config is not allowed as TARGET_RELEASE. + DisallowLunchUse bool + // Unmarshalled flag artifacts FlagArtifacts FlagArtifacts @@ -93,6 +96,11 @@ type ReleaseConfig struct { // If true, this is a proper release config that can be used in "lunch". func (config *ReleaseConfig) isConfigListable() bool { + // Do not list disallowed release configs. + if config.DisallowLunchUse { + return false + } + // Logic based on ReleaseConfigType. switch config.ReleaseConfigType { case rc_proto.ReleaseConfigType_RELEASE_CONFIG: return true @@ -405,6 +413,7 @@ func (config *ReleaseConfig) GenerateReleaseConfig(configs *ReleaseConfigs) erro ValueDirectories: valueDirectories, PriorStages: SortedMapKeys(config.PriorStagesMap), ReleaseConfigType: config.ReleaseConfigType.Enum(), + DisallowLunchUse: proto.Bool(config.DisallowLunchUse), } config.compileInProgress = false @@ -481,6 +490,9 @@ func (config *ReleaseConfig) WriteMakefile(outFile, targetRelease string, config } // As it stands this list is not per-product, but conceptually it is, and will be. data += fmt.Sprintf("ALL_RELEASE_CONFIGS_FOR_PRODUCT :=$= %s\n", strings.Join(configs.GetAllReleaseNames(), " ")) + if config.DisallowLunchUse { + data += fmt.Sprintf("_disallow_lunch_use :=$= true\n") + } data += fmt.Sprintf("_used_files := %s\n", strings.Join(config.GetSortedFileList(), " ")) data += fmt.Sprintf("_ALL_RELEASE_FLAGS :=$= %s\n", strings.Join(names, " ")) for _, pName := range pNames { diff --git a/cmd/release_config/release_config_lib/release_configs.go b/cmd/release_config/release_config_lib/release_configs.go index 4f621c70a..b0f8cb7bf 100644 --- a/cmd/release_config/release_config_lib/release_configs.go +++ b/cmd/release_config/release_config_lib/release_configs.go @@ -378,6 +378,7 @@ func (configs *ReleaseConfigs) LoadReleaseConfigMap(path string, ConfigDirIndex return fmt.Errorf("%s mismatching ReleaseConfigType value %s", path, *releaseConfigType) } config.FilesUsedMap[path] = true + config.DisallowLunchUse = config.DisallowLunchUse || releaseConfigContribution.proto.GetDisallowLunchUse() inheritNames := make(map[string]bool) for _, inh := range config.InheritNames { inheritNames[inh] = true diff --git a/filesystem/bootimg.go b/filesystem/bootimg.go index 0ffec2654..36b1a1870 100644 --- a/filesystem/bootimg.go +++ b/filesystem/bootimg.go @@ -391,15 +391,6 @@ func (b *bootimg) signImage(ctx android.ModuleContext, unsignedImage android.Pat return output } -// Calculates avb_salt from some input for deterministic output. -func (b *bootimg) salt() string { - var input []string - input = append(input, b.properties.Cmdline...) - input = append(input, proptools.StringDefault(b.properties.Partition_name, b.Name())) - input = append(input, proptools.String(b.properties.Header_version)) - return sha1sum(input) -} - func (b *bootimg) buildPropFile(ctx android.ModuleContext) (android.Path, android.Paths) { var sb strings.Builder var deps android.Paths @@ -420,7 +411,6 @@ func (b *bootimg) buildPropFile(ctx android.ModuleContext) (android.Path, androi addStr("avb_add_hash_footer_args", "") // TODO(jiyong): add --rollback_index partitionName := proptools.StringDefault(b.properties.Partition_name, b.Name()) addStr("partition_name", partitionName) - addStr("avb_salt", b.salt()) propFile := android.PathForModuleOut(ctx, "prop") android.WriteFileRule(ctx, propFile, sb.String()) diff --git a/filesystem/filesystem.go b/filesystem/filesystem.go index 1d32b8f70..eea54a92f 100644 --- a/filesystem/filesystem.go +++ b/filesystem/filesystem.go @@ -465,7 +465,7 @@ func (f *filesystem) validateVintfFragments(ctx android.ModuleContext) { } func (f *filesystem) appendToEntry(ctx android.ModuleContext, installedFile android.Path) { - partitionBaseDir := android.PathForModuleOut(ctx, "root", proptools.String(f.properties.Base_dir)).String() + "/" + partitionBaseDir := android.PathForModuleOut(ctx, f.rootDirString(), proptools.String(f.properties.Base_dir)).String() + "/" relPath, inTargetPartition := strings.CutPrefix(installedFile.String(), partitionBaseDir) if inTargetPartition { @@ -555,8 +555,12 @@ func (f *filesystem) copyFilesToProductOut(ctx android.ModuleContext, builder *a builder.Command().Textf("cp -prf %s/* %s", rebasedDir, installPath) } +func (f *filesystem) rootDirString() string { + return f.partitionName() +} + func (f *filesystem) buildImageUsingBuildImage(ctx android.ModuleContext) android.Path { - rootDir := android.PathForModuleOut(ctx, "root").OutputPath + rootDir := android.PathForModuleOut(ctx, f.rootDirString()).OutputPath rebasedDir := rootDir if f.properties.Base_dir != nil { rebasedDir = rootDir.Join(ctx, *f.properties.Base_dir) @@ -618,11 +622,6 @@ func (f *filesystem) buildFileContexts(ctx android.ModuleContext) android.Path { return fcBin } -// Calculates avb_salt from entry list (sorted) for deterministic output. -func (f *filesystem) salt() string { - return sha1sum(f.entries) -} - func (f *filesystem) buildPropFile(ctx android.ModuleContext) (android.Path, android.Paths) { var deps android.Paths var propFileString strings.Builder @@ -688,7 +687,6 @@ func (f *filesystem) buildPropFile(ctx android.ModuleContext) (android.Path, and avb_add_hashtree_footer_args += fmt.Sprintf(" --prop com.android.build.%s.fingerprint:{CONTENTS_OF:%s}", f.partitionName(), ctx.Config().BuildFingerprintFile(ctx)) avb_add_hashtree_footer_args += fmt.Sprintf(" --prop com.android.build.%s.security_patch:%s", f.partitionName(), ctx.Config().PlatformSecurityPatch()) addStr("avb_add_hashtree_footer_args", avb_add_hashtree_footer_args) - addStr("avb_salt", f.salt()) } if f.properties.File_contexts != nil && f.properties.Precompiled_file_contexts != nil { @@ -783,7 +781,7 @@ func (f *filesystem) buildCpioImage(ctx android.ModuleContext, compressed bool) ctx.PropertyErrorf("include_make_built_files", "include_make_built_files is not supported for compressed cpio image.") } - rootDir := android.PathForModuleOut(ctx, "root").OutputPath + rootDir := android.PathForModuleOut(ctx, f.rootDirString()).OutputPath rebasedDir := rootDir if f.properties.Base_dir != nil { rebasedDir = rootDir.Join(ctx, *f.properties.Base_dir) @@ -868,29 +866,10 @@ func (f *filesystem) buildEventLogtagsFile(ctx android.ModuleContext, builder *a return } - logtagsFilePaths := make(map[string]bool) - ctx.WalkDeps(func(child, parent android.Module) bool { - if logtagsInfo, ok := android.OtherModuleProvider(ctx, child, android.LogtagsProviderKey); ok { - for _, path := range logtagsInfo.Logtags { - logtagsFilePaths[path.String()] = true - } - } - return true - }) - - if len(logtagsFilePaths) == 0 { - return - } - etcPath := rebasedDir.Join(ctx, "etc") eventLogtagsPath := etcPath.Join(ctx, "event-log-tags") builder.Command().Text("mkdir").Flag("-p").Text(etcPath.String()) - cmd := builder.Command().BuiltTool("merge-event-log-tags"). - FlagWithArg("-o ", eventLogtagsPath.String()) - - for _, path := range android.SortedKeys(logtagsFilePaths) { - cmd.Text(path) - } + builder.Command().Text("cp").Input(android.MergedLogtagsPath(ctx)).Text(eventLogtagsPath.String()) f.appendToEntry(ctx, eventLogtagsPath) } diff --git a/filesystem/filesystem_test.go b/filesystem/filesystem_test.go index 0ed3870a6..2dcb23d3f 100644 --- a/filesystem/filesystem_test.go +++ b/filesystem/filesystem_test.go @@ -181,7 +181,7 @@ func TestFileSystemFillsLinkerConfigWithStubLibs(t *testing.T) { `) module := result.ModuleForTests("myfilesystem", "android_common") - output := module.Output("out/soong/.intermediates/myfilesystem/android_common/root/system/etc/linker.config.pb") + output := module.Output("out/soong/.intermediates/myfilesystem/android_common/myfilesystem/system/etc/linker.config.pb") fullCommand := output.RuleParams.Command startIndex := strings.Index(fullCommand, "conv_linker_config") diff --git a/filesystem/fsverity_metadata.go b/filesystem/fsverity_metadata.go index 6372c5e62..91b8c570d 100644 --- a/filesystem/fsverity_metadata.go +++ b/filesystem/fsverity_metadata.go @@ -85,6 +85,18 @@ func (f *filesystem) buildFsverityMetadataFiles(ctx android.ModuleContext, build f.appendToEntry(ctx, destPath) } + fsVerityBaseDir := rootDir.String() + if f.PartitionType() == "system_ext" { + // Use the equivalent of $PRODUCT_OUT as the base dir. + // This ensures that the paths in build_manifest.pb contain on-device paths + // e.g. system_ext/framework/javalib.jar + // and not framework/javalib.jar. + // + // Although base-dir is outside the rootdir provided for packaging, this action + // is hermetic since it uses `manifestGeneratorListPath` to filter the files to be written to build_manifest.pb + fsVerityBaseDir = filepath.Dir(rootDir.String()) + } + // STEP 2: generate signed BuildManifest.apk // STEP 2-1: generate build_manifest.pb manifestGeneratorListPath := android.PathForModuleOut(ctx, "fsverity_manifest.list") @@ -96,7 +108,7 @@ func (f *filesystem) buildFsverityMetadataFiles(ctx android.ModuleContext, build builder.Command(). BuiltTool("fsverity_manifest_generator"). FlagWithInput("--fsverity-path ", fsverityPath). - FlagWithArg("--base-dir ", rootDir.String()). + FlagWithArg("--base-dir ", fsVerityBaseDir). FlagWithArg("--output ", manifestPbPath.String()). FlagWithInput("@", manifestGeneratorListPath) diff --git a/fsgen/filesystem_creator.go b/fsgen/filesystem_creator.go index b9fddcab5..2dc5077a5 100644 --- a/fsgen/filesystem_creator.go +++ b/fsgen/filesystem_creator.go @@ -596,6 +596,43 @@ func (f *filesystemCreator) createVendorBuildProp(ctx android.LoadHookContext) { vendorBuildProp.HideFromMake() } +func createRecoveryBuildProp(ctx android.LoadHookContext) string { + moduleName := generatedModuleName(ctx.Config(), "recovery-prop.default") + + var vendorBuildProp *string + if android.InList("vendor", generatedPartitions(ctx)) { + vendorBuildProp = proptools.StringPtr(":" + generatedModuleName(ctx.Config(), "vendor-build.prop")) + } + + recoveryBuildProps := &struct { + Name *string + System_build_prop *string + Vendor_build_prop *string + Odm_build_prop *string + Product_build_prop *string + System_ext_build_prop *string + + Recovery *bool + No_full_install *bool + Visibility []string + }{ + Name: proptools.StringPtr(moduleName), + System_build_prop: proptools.StringPtr(":system-build.prop"), + Vendor_build_prop: vendorBuildProp, + Odm_build_prop: proptools.StringPtr(":odm-build.prop"), + Product_build_prop: proptools.StringPtr(":product-build.prop"), + System_ext_build_prop: proptools.StringPtr(":system_ext-build.prop"), + + Recovery: proptools.BoolPtr(true), + No_full_install: proptools.BoolPtr(true), + Visibility: []string{"//visibility:public"}, + } + + ctx.CreateModule(android.RecoveryBuildPropModuleFactory, recoveryBuildProps) + + return moduleName +} + // createLinkerConfigSourceFilegroups creates filegroup modules to generate linker.config.pb for the following partitions // 1. vendor: Using PRODUCT_VENDOR_LINKER_CONFIG_FRAGMENTS (space separated file list) // 1. product: Using PRODUCT_PRODUCT_LINKER_CONFIG_FRAGMENTS (space separated file list) diff --git a/fsgen/fsgen_mutators.go b/fsgen/fsgen_mutators.go index 20e4c3e72..de0a1cb2d 100644 --- a/fsgen/fsgen_mutators.go +++ b/fsgen/fsgen_mutators.go @@ -165,6 +165,7 @@ func createFsGenState(ctx android.LoadHookContext, generatedPrebuiltEtcModuleNam // Add common resources `prebuilt_res` module as dep of recovery partition (*fsGenState.fsDeps["recovery"])[fmt.Sprintf("recovery-resources-common-%s", getDpi(ctx))] = defaultDepCandidateProps(ctx.Config()) (*fsGenState.fsDeps["recovery"])[getRecoveryFontModuleName(ctx)] = defaultDepCandidateProps(ctx.Config()) + (*fsGenState.fsDeps["recovery"])[createRecoveryBuildProp(ctx)] = defaultDepCandidateProps(ctx.Config()) return &fsGenState }).(*FsGenState) diff --git a/java/base.go b/java/base.go index 215285fdb..cd5550a7c 100644 --- a/java/base.go +++ b/java/base.go @@ -1442,20 +1442,27 @@ func (j *Module) compile(ctx android.ModuleContext, extraSrcJars, extraClasspath // build. flags = enableErrorproneFlags(flags) } else if hasErrorproneableFiles && ctx.Config().RunErrorProne() && j.properties.Errorprone.Enabled == nil { - // Otherwise, if the RUN_ERROR_PRONE environment variable is set, create - // a new jar file just for compiling with the errorprone compiler to. - // This is because we don't want to cause the java files to get completely - // rebuilt every time the state of the RUN_ERROR_PRONE variable changes. - // We also don't want to run this if errorprone is enabled by default for - // this module, or else we could have duplicated errorprone messages. - errorproneFlags := enableErrorproneFlags(flags) - errorprone := android.PathForModuleOut(ctx, "errorprone", jarName) - errorproneAnnoSrcJar := android.PathForModuleOut(ctx, "errorprone", "anno.srcjar") - - transformJavaToClasses(ctx, errorprone, -1, uniqueJavaFiles, srcJars, errorproneAnnoSrcJar, errorproneFlags, nil, - "errorprone", "errorprone") - - extraJarDeps = append(extraJarDeps, errorprone) + if ctx.Config().RunErrorProneInline() { + // On CI, we're not going to toggle back/forth between errorprone and non-errorprone + // builds, so it's faster if we don't compile the module twice and instead always + // compile the module with errorprone. + flags = enableErrorproneFlags(flags) + } else { + // Otherwise, if the RUN_ERROR_PRONE environment variable is set, create + // a new jar file just for compiling with the errorprone compiler to. + // This is because we don't want to cause the java files to get completely + // rebuilt every time the state of the RUN_ERROR_PRONE variable changes. + // We also don't want to run this if errorprone is enabled by default for + // this module, or else we could have duplicated errorprone messages. + errorproneFlags := enableErrorproneFlags(flags) + errorprone := android.PathForModuleOut(ctx, "errorprone", jarName) + errorproneAnnoSrcJar := android.PathForModuleOut(ctx, "errorprone", "anno.srcjar") + + transformJavaToClasses(ctx, errorprone, -1, uniqueJavaFiles, srcJars, errorproneAnnoSrcJar, errorproneFlags, nil, + "errorprone", "errorprone") + + extraJarDeps = append(extraJarDeps, errorprone) + } } if enableSharding { diff --git a/rust/proc_macro.go b/rust/proc_macro.go index 1ff6637a6..28ed68b71 100644 --- a/rust/proc_macro.go +++ b/rust/proc_macro.go @@ -67,6 +67,7 @@ func (procMacro *procMacroDecorator) compilerProps() []interface{} { func (procMacro *procMacroDecorator) compilerFlags(ctx ModuleContext, flags Flags) Flags { flags = procMacro.baseCompiler.compilerFlags(ctx, flags) flags.RustFlags = append(flags.RustFlags, "--extern proc_macro") + flags.RustFlags = append(flags.RustFlags, "-C metadata="+ctx.ModuleName()) return flags } |