diff options
109 files changed, 1454 insertions, 640 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/aconfig/codegen/cc_aconfig_library.go b/aconfig/codegen/cc_aconfig_library.go index 8c4bfe696..f9c7b8c9a 100644 --- a/aconfig/codegen/cc_aconfig_library.go +++ b/aconfig/codegen/cc_aconfig_library.go @@ -104,7 +104,7 @@ func (this *CcAconfigLibraryCallbacks) GeneratorSources(ctx cc.ModuleContext) cc result := cc.GeneratedSource{} // Get the values that came from the global RELEASE_ACONFIG_VALUE_SETS flag - declarationsModules := ctx.GetDirectDepsWithTag(ccDeclarationsTag) + declarationsModules := ctx.GetDirectDepsProxyWithTag(ccDeclarationsTag) if len(declarationsModules) != 1 { panic(fmt.Errorf("Exactly one aconfig_declarations property required")) } @@ -134,7 +134,7 @@ func (this *CcAconfigLibraryCallbacks) GeneratorFlags(ctx cc.ModuleContext, flag func (this *CcAconfigLibraryCallbacks) GeneratorBuildActions(ctx cc.ModuleContext, flags cc.Flags, deps cc.PathDeps) { // Get the values that came from the global RELEASE_ACONFIG_VALUE_SETS flag - declarationsModules := ctx.GetDirectDepsWithTag(ccDeclarationsTag) + declarationsModules := ctx.GetDirectDepsProxyWithTag(ccDeclarationsTag) if len(declarationsModules) != 1 { panic(fmt.Errorf("Exactly one aconfig_declarations property required")) } diff --git a/aconfig/init.go b/aconfig/init.go index 621d619fd..21903e212 100644 --- a/aconfig/init.go +++ b/aconfig/init.go @@ -73,11 +73,11 @@ var ( CreateStorageRule = pctx.AndroidStaticRule("aconfig_create_storage", blueprint.RuleParams{ - Command: `${aconfig} create-storage --container ${container} --file ${file_type} --out ${out} ${cache_files}`, + Command: `${aconfig} create-storage --container ${container} --file ${file_type} --out ${out} ${cache_files} --version ${version}`, CommandDeps: []string{ "${aconfig}", }, - }, "container", "file_type", "cache_files") + }, "container", "file_type", "cache_files", "version") // For exported_java_aconfig_library: Generate a JAR from all // java_aconfig_libraries to be consumed by apps built outside the 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/aconfig_providers.go b/android/aconfig_providers.go index 210a65638..b698d24a5 100644 --- a/android/aconfig_providers.go +++ b/android/aconfig_providers.go @@ -92,11 +92,11 @@ func VerifyAconfigBuildMode(ctx ModuleContext, container string, module blueprin if asError { ctx.ModuleErrorf(msg) } else { - fmt.Printf("WARNING: " + msg) + fmt.Print("WARNING: " + msg) } } else { if !asError { - fmt.Printf("PASSED: " + msg) + fmt.Print("PASSED: " + msg) } } } diff --git a/android/apex.go b/android/apex.go index 45448b5d1..08c82eb5a 100644 --- a/android/apex.go +++ b/android/apex.go @@ -441,6 +441,10 @@ func CheckAvailableForApex(what string, apex_available []string) bool { if strings.HasSuffix(apex_name, ".*") && strings.HasPrefix(what, strings.TrimSuffix(apex_name, "*")) { return true } + // TODO b/383863941: Remove once legacy name is no longer used + if (apex_name == "com.android.btservices" && what == "com.android.bt") || (apex_name == "com.android.bt" && what == "com.android.btservices") { + return true + } } return false } diff --git a/android/base_module_context.go b/android/base_module_context.go index 06819d64a..d8558d0e5 100644 --- a/android/base_module_context.go +++ b/android/base_module_context.go @@ -110,15 +110,14 @@ type BaseModuleContext interface { GetDirectDepsWithTag(tag blueprint.DependencyTag) []Module + GetDirectDepsProxyWithTag(tag blueprint.DependencyTag) []ModuleProxy + // GetDirectDepWithTag returns the Module the direct dependency with the specified name, or nil if // none exists. It panics if the dependency does not have the specified tag. It skips any // dependencies that are not an android.Module. GetDirectDepWithTag(name string, tag blueprint.DependencyTag) Module - // GetDirectDep returns the Module and DependencyTag for the direct dependency with the specified - // name, or nil if none exists. If there are multiple dependencies on the same module it returns - // the first DependencyTag. - GetDirectDep(name string) (blueprint.Module, blueprint.DependencyTag) + GetDirectDepProxyWithTag(name string, tag blueprint.DependencyTag) *ModuleProxy // VisitDirectDeps calls visit for each direct dependency. If there are multiple // direct dependencies on the same module visit will be called multiple times on that module @@ -314,6 +313,13 @@ func (b *baseModuleContext) GetDirectDepWithTag(name string, tag blueprint.Depen return nil } +func (b *baseModuleContext) GetDirectDepProxyWithTag(name string, tag blueprint.DependencyTag) *ModuleProxy { + if module := b.bp.GetDirectDepProxyWithTag(name, tag); module != nil { + return &ModuleProxy{*module} + } + return nil +} + func (b *baseModuleContext) blueprintBaseModuleContext() blueprint.BaseModuleContext { return b.bp } @@ -402,53 +408,30 @@ func (b *baseModuleContext) validateAndroidModuleProxy( return &aModule } -type dep struct { - mod blueprint.Module - tag blueprint.DependencyTag -} - -func (b *baseModuleContext) getDirectDepsInternal(name string, tag blueprint.DependencyTag) []dep { - var deps []dep +func (b *baseModuleContext) getDirectDepsInternal(name string, tag blueprint.DependencyTag) []Module { + var deps []Module b.VisitDirectDeps(func(module Module) { if module.base().BaseModuleName() == name { returnedTag := b.bp.OtherModuleDependencyTag(module) if tag == nil || returnedTag == tag { - deps = append(deps, dep{module, returnedTag}) + deps = append(deps, module) } } }) return deps } -func (b *baseModuleContext) getDirectDepInternal(name string, tag blueprint.DependencyTag) (blueprint.Module, blueprint.DependencyTag) { - deps := b.getDirectDepsInternal(name, tag) - if len(deps) == 1 { - return deps[0].mod, deps[0].tag - } else if len(deps) >= 2 { - panic(fmt.Errorf("Multiple dependencies having same BaseModuleName() %q found from %q", - name, b.ModuleName())) - } else { - return nil, nil - } -} - -func (b *baseModuleContext) getDirectDepFirstTag(name string) (blueprint.Module, blueprint.DependencyTag) { - foundDeps := b.getDirectDepsInternal(name, nil) - deps := map[blueprint.Module]bool{} - for _, dep := range foundDeps { - deps[dep.mod] = true - } - if len(deps) == 1 { - return foundDeps[0].mod, foundDeps[0].tag - } else if len(deps) >= 2 { - // this could happen if two dependencies have the same name in different namespaces - // TODO(b/186554727): this should not occur if namespaces are handled within - // getDirectDepsInternal. - panic(fmt.Errorf("Multiple dependencies having same BaseModuleName() %q found from %q", - name, b.ModuleName())) - } else { - return nil, nil - } +func (b *baseModuleContext) getDirectDepsProxyInternal(name string, tag blueprint.DependencyTag) []ModuleProxy { + var deps []ModuleProxy + b.VisitDirectDepsProxy(func(module ModuleProxy) { + if OtherModuleProviderOrDefault(b, module, CommonModuleInfoKey).BaseModuleName == name { + returnedTag := b.OtherModuleDependencyTag(module) + if tag == nil || returnedTag == tag { + deps = append(deps, module) + } + } + }) + return deps } func (b *baseModuleContext) GetDirectDepsWithTag(tag blueprint.DependencyTag) []Module { @@ -461,11 +444,14 @@ func (b *baseModuleContext) GetDirectDepsWithTag(tag blueprint.DependencyTag) [] return deps } -// GetDirectDep returns the Module and DependencyTag for the direct dependency with the specified -// name, or nil if none exists. If there are multiple dependencies on the same module it returns the -// first DependencyTag. -func (b *baseModuleContext) GetDirectDep(name string) (blueprint.Module, blueprint.DependencyTag) { - return b.getDirectDepFirstTag(name) +func (b *baseModuleContext) GetDirectDepsProxyWithTag(tag blueprint.DependencyTag) []ModuleProxy { + var deps []ModuleProxy + b.VisitDirectDepsProxy(func(module ModuleProxy) { + if b.OtherModuleDependencyTag(module) == tag { + deps = append(deps, module) + } + }) + return deps } func (b *baseModuleContext) VisitDirectDeps(visit func(Module)) { diff --git a/android/config.go b/android/config.go index b811c55eb..00d5e2c6a 100644 --- a/android/config.go +++ b/android/config.go @@ -289,6 +289,10 @@ func (c Config) ReleaseUseSystemFeatureBuildFlags() bool { return c.config.productVariables.GetBuildFlagBool("RELEASE_USE_SYSTEM_FEATURE_BUILD_FLAGS") } +func (c Config) ReleaseFingerprintAconfigPackages() bool { + return c.config.productVariables.GetBuildFlagBool("RELEASE_FINGERPRINT_ACONFIG_PACKAGES") +} + // A DeviceConfig object represents the configuration for a particular device // being built. For now there will only be one of these, but in the future there // may be multiple devices being built. @@ -1317,7 +1321,16 @@ func (c *config) UseRemoteBuild() bool { } func (c *config) RunErrorProne() bool { - return c.IsEnvTrue("RUN_ERROR_PRONE") + return c.IsEnvTrue("RUN_ERROR_PRONE") || c.RunErrorProneInline() +} + +// Returns if the errorprone build should be run "inline", that is, using errorprone as part +// of the main javac compilation instead of its own separate compilation. This is good for CI +// but bad for local development, because if you toggle errorprone+inline on/off it will repeatedly +// clobber java files from the old configuration. +func (c *config) RunErrorProneInline() bool { + value := strings.ToLower(c.Getenv("RUN_ERROR_PRONE")) + return c.IsEnvTrue("RUN_ERROR_PRONE_INLINE") || value == "inline" } // XrefCorpusName returns the Kythe cross-reference corpus name. @@ -2159,6 +2172,10 @@ func (c *config) UseTransitiveJarsInClasspath() bool { return c.productVariables.GetBuildFlagBool("RELEASE_USE_TRANSITIVE_JARS_IN_CLASSPATH") } +func (c *config) UseR8StoreStoreFenceConstructorInlining() bool { + return c.productVariables.GetBuildFlagBool("RELEASE_R8_STORE_STORE_FENCE_CONSTRUCTOR_INLINING") +} + func (c *config) UseDexV41() bool { return c.productVariables.GetBuildFlagBool("RELEASE_USE_DEX_V41") } diff --git a/android/config_test.go b/android/config_test.go index adb5ffac5..4fdcc9ca4 100644 --- a/android/config_test.go +++ b/android/config_test.go @@ -77,7 +77,7 @@ Did you mean to use an annotation of ",omitempty"? func TestProductConfigAnnotations(t *testing.T) { err := validateConfigAnnotations(&ProductVariables{}) if err != nil { - t.Errorf(err.Error()) + t.Error(err.Error()) } } diff --git a/android/container.go b/android/container.go index 27b17ed99..99e6a3075 100644 --- a/android/container.go +++ b/android/container.go @@ -197,7 +197,10 @@ var unstableInfoProvider = blueprint.NewProvider[unstableInfo]() func determineUnstableModule(mctx ModuleContext) bool { module := mctx.Module() - unstableModule := module.Name() == "framework-minus-apex" + + // TODO(b/383559945) Remove "framework-minus-apex_jarjar-sharded" once + // we remove this module. + unstableModule := module.Name() == "framework-minus-apex" || module.Name() == "framework-minus-apex_jarjar-sharded" if installable, ok := module.(InstallableModule); ok { for _, staticDepTag := range installable.StaticDependencyTags() { mctx.VisitDirectDepsWithTag(staticDepTag, func(dep Module) { diff --git a/android/container_violations.go b/android/container_violations.go index cfee562ac..ba8f7d598 100644 --- a/android/container_violations.go +++ b/android/container_violations.go @@ -15,6 +15,10 @@ package android var ContainerDependencyViolationAllowlist = map[string][]string{ + "adservices-service-core": { + "gson", // apex [com.android.adservices, com.android.extservices] -> apex [com.android.virt] + }, + "android.car-module.impl": { "modules-utils-preconditions", // apex [com.android.car.framework] -> apex [com.android.adservices, com.android.appsearch, com.android.cellbroadcast, com.android.extservices, com.android.ondevicepersonalization, com.android.tethering, com.android.uwb, com.android.wifi, test_com.android.cellbroadcast, test_com.android.wifi] }, @@ -46,6 +50,11 @@ var ContainerDependencyViolationAllowlist = map[string][]string{ "modules-utils-shell-command-handler", // apex [com.android.car.framework] -> apex [com.android.adservices, com.android.art, com.android.art.debug, com.android.art.testing, com.android.btservices, com.android.configinfrastructure, com.android.mediaprovider, com.android.nfcservices, com.android.permission, com.android.scheduling, com.android.tethering, com.android.uwb, com.android.wifi, test_com.android.mediaprovider, test_com.android.permission, test_com.android.wifi, test_imgdiag_com.android.art, test_jitzygote_com.android.art] }, + "cellbroadcastreceiver_aconfig_flags_lib": { + "ext", // apex [com.android.cellbroadcast, test_com.android.cellbroadcast] -> system + "framework", // apex [com.android.cellbroadcast, test_com.android.cellbroadcast] -> system + }, + "connectivity-net-module-utils-bpf": { "net-utils-device-common-struct-base", // apex [com.android.tethering] -> system }, @@ -161,6 +170,10 @@ var ContainerDependencyViolationAllowlist = map[string][]string{ "framework", // cts -> unstable }, + "CtsAppFunctionTestCases": { + "framework", // cts -> unstable + }, + "CtsAppOpsTestCases": { "framework", // cts -> unstable }, @@ -701,6 +714,10 @@ var ContainerDependencyViolationAllowlist = map[string][]string{ "framework", // cts -> unstable }, + "CtsTvInputTestCases": { + "framework", // cts -> unstable + }, + "CtsTvTunerTestCases": { "framework", // cts -> unstable }, @@ -822,6 +839,10 @@ var ContainerDependencyViolationAllowlist = map[string][]string{ "app-compat-annotations", // apex [com.android.btservices] -> system }, + "framework-configinfrastructure.impl": { + "configinfra_framework_flags_java_lib", // apex [com.android.configinfrastructure] -> system + }, + "framework-connectivity-t.impl": { "app-compat-annotations", // apex [com.android.tethering] -> system "framework-connectivity-pre-jarjar", // apex [com.android.tethering] -> system @@ -839,6 +860,7 @@ var ContainerDependencyViolationAllowlist = map[string][]string{ }, "framework-ondevicepersonalization.impl": { + "app-compat-annotations", // apex [com.android.ondevicepersonalization] -> system "ondevicepersonalization_flags_lib", // apex [com.android.ondevicepersonalization] -> system }, @@ -959,7 +981,11 @@ var ContainerDependencyViolationAllowlist = map[string][]string{ }, "NfcNciApex": { + // TODO(b/383782511): Remove the violations once the infra is fixed. + "android.nfc.flags-aconfig-java", // apex [com.android.nfcservices] -> system "android.permission.flags-aconfig-java", // apex [com.android.nfcservices] -> apex [com.android.permission, test_com.android.permission] + // TODO(b/383782511): Remove the violations once the infra is fixed. + "framework-nfc.impl", // apex [com.android.nfcservices] -> system }, "okhttp-norepackage": { diff --git a/android/early_module_context.go b/android/early_module_context.go index 5e971ef1e..8d2828545 100644 --- a/android/early_module_context.go +++ b/android/early_module_context.go @@ -182,7 +182,7 @@ func (e *earlyModuleContext) Namespace() *Namespace { } func (e *earlyModuleContext) OtherModulePropertyErrorf(module Module, property string, fmt string, args ...interface{}) { - e.EarlyModuleContext.OtherModulePropertyErrorf(module, property, fmt, args...) + e.EarlyModuleContext.OtherModulePropertyErrorf(getWrappedModule(module), property, fmt, args...) } func (e *earlyModuleContext) HasMutatorFinished(mutatorName string) bool { diff --git a/android/filegroup.go b/android/filegroup.go index 67e5add1f..4daff8f68 100644 --- a/android/filegroup.go +++ b/android/filegroup.go @@ -104,7 +104,6 @@ func (fg *fileGroup) GenerateAndroidBuildActions(ctx ModuleContext) { if fg.properties.Path != nil { srcs = PathsWithModuleSrcSubDir(ctx, srcs, String(fg.properties.Path)) } - SetProvider(ctx, blueprint.SrcsFileProviderKey, blueprint.SrcsFileProviderData{SrcPaths: srcs.Strings()}) var aconfigDeclarations []string var intermediateCacheOutputPaths Paths diff --git a/android/license_metadata.go b/android/license_metadata.go index 3df36e674..d15dfa841 100644 --- a/android/license_metadata.go +++ b/android/license_metadata.go @@ -15,11 +15,11 @@ package android import ( - "github.com/google/blueprint/depset" "sort" "strings" "github.com/google/blueprint" + "github.com/google/blueprint/depset" "github.com/google/blueprint/proptools" ) @@ -64,8 +64,8 @@ func buildLicenseMetadata(ctx *moduleContext, licenseMetadataFile WritablePath) var allDepOutputFiles Paths var allDepMetadataDepSets []depset.DepSet[Path] - ctx.VisitDirectDeps(func(dep Module) { - if !dep.Enabled(ctx) { + ctx.VisitDirectDepsProxy(func(dep ModuleProxy) { + if !OtherModuleProviderOrDefault(ctx, dep, CommonModuleInfoKey).Enabled { return } @@ -81,7 +81,7 @@ func buildLicenseMetadata(ctx *moduleContext, licenseMetadataFile WritablePath) if info, ok := OtherModuleProvider(ctx, dep, LicenseMetadataProvider); ok { allDepMetadataFiles = append(allDepMetadataFiles, info.LicenseMetadataPath) - if isContainer || isInstallDepNeeded(dep, ctx.OtherModuleDependencyTag(dep)) { + if isContainer || isInstallDepNeeded(ctx, dep) { allDepMetadataDepSets = append(allDepMetadataDepSets, info.LicenseMetadataDepSet) } 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/module.go b/android/module.go index c2f4342b4..72dba04f4 100644 --- a/android/module.go +++ b/android/module.go @@ -1475,12 +1475,13 @@ func (m *ModuleBase) EffectiveLicenseFiles() Paths { func (m *ModuleBase) computeInstallDeps(ctx ModuleContext) ([]depset.DepSet[InstallPath], []depset.DepSet[PackagingSpec]) { var installDeps []depset.DepSet[InstallPath] var packagingSpecs []depset.DepSet[PackagingSpec] - ctx.VisitDirectDeps(func(dep Module) { - if isInstallDepNeeded(dep, ctx.OtherModuleDependencyTag(dep)) { + ctx.VisitDirectDepsProxy(func(dep ModuleProxy) { + if isInstallDepNeeded(ctx, dep) { // Installation is still handled by Make, so anything hidden from Make is not // installable. info := OtherModuleProviderOrDefault(ctx, dep, InstallFilesProvider) - if !dep.IsHideFromMake() && !dep.IsSkipInstall() { + commonInfo := OtherModuleProviderOrDefault(ctx, dep, CommonModuleInfoKey) + if !commonInfo.HideFromMake && !commonInfo.SkipInstall { installDeps = append(installDeps, info.TransitiveInstallFiles) } // Add packaging deps even when the dependency is not installed so that uninstallable @@ -1494,13 +1495,13 @@ func (m *ModuleBase) computeInstallDeps(ctx ModuleContext) ([]depset.DepSet[Inst // isInstallDepNeeded returns true if installing the output files of the current module // should also install the output files of the given dependency and dependency tag. -func isInstallDepNeeded(dep Module, tag blueprint.DependencyTag) bool { +func isInstallDepNeeded(ctx ModuleContext, dep ModuleProxy) bool { // Don't add a dependency from the platform to a library provided by an apex. - if dep.base().commonProperties.UninstallableApexPlatformVariant { + if OtherModuleProviderOrDefault(ctx, dep, CommonModuleInfoKey).UninstallableApexPlatformVariant { return false } // Only install modules if the dependency tag is an InstallDepNeeded tag. - return IsInstallDepNeededTag(tag) + return IsInstallDepNeededTag(ctx.OtherModuleDependencyTag(dep)) } func (m *ModuleBase) NoAddressSanitizer() bool { @@ -1873,6 +1874,13 @@ type CommonModuleInfo struct { CanHaveApexVariants bool MinSdkVersion string NotAvailableForPlatform bool + // UninstallableApexPlatformVariant is set by MakeUninstallable called by the apex + // mutator. MakeUninstallable also sets HideFromMake. UninstallableApexPlatformVariant + // is used to avoid adding install or packaging dependencies into libraries provided + // by apexes. + UninstallableApexPlatformVariant bool + HideFromMake bool + SkipInstall bool } var CommonModuleInfoKey = blueprint.NewProvider[CommonModuleInfo]() @@ -2138,10 +2146,13 @@ func (m *ModuleBase) GenerateBuildActions(blueprintCtx blueprint.ModuleContext) buildComplianceMetadataProvider(ctx, m) commonData := CommonModuleInfo{ - ReplacedByPrebuilt: m.commonProperties.ReplacedByPrebuilt, - CompileTarget: m.commonProperties.CompileTarget, - SkipAndroidMkProcessing: shouldSkipAndroidMkProcessing(ctx, m), - BaseModuleName: m.BaseModuleName(), + ReplacedByPrebuilt: m.commonProperties.ReplacedByPrebuilt, + CompileTarget: m.commonProperties.CompileTarget, + SkipAndroidMkProcessing: shouldSkipAndroidMkProcessing(ctx, m), + BaseModuleName: m.BaseModuleName(), + UninstallableApexPlatformVariant: m.commonProperties.UninstallableApexPlatformVariant, + HideFromMake: m.commonProperties.HideFromMake, + SkipInstall: m.commonProperties.SkipInstall, } if mm, ok := m.module.(interface { MinSdkVersion(ctx EarlyModuleContext) ApiLevel @@ -2737,6 +2748,7 @@ func outputFilesForModule(ctx PathContext, module Module, tag string) (Paths, er if octx, ok := ctx.(OutputFilesProviderModuleContext); ok { if octx.EqualModules(octx.Module(), module) { + // It is the current module, we can access the srcs through interface if sourceFileProducer, ok := module.(SourceFileProducer); ok { return sourceFileProducer.Srcs(), nil } diff --git a/android/module_context.go b/android/module_context.go index ae7b54f66..b59e33d83 100644 --- a/android/module_context.go +++ b/android/module_context.go @@ -440,10 +440,27 @@ func (m *moduleContext) GetMissingDependencies() []string { } func (m *moduleContext) GetDirectDepWithTag(name string, tag blueprint.DependencyTag) Module { - if module, _ := m.getDirectDepInternal(name, tag); module != nil { - return module.(Module) + deps := m.getDirectDepsInternal(name, tag) + if len(deps) == 1 { + return deps[0] + } else if len(deps) >= 2 { + panic(fmt.Errorf("Multiple dependencies having same BaseModuleName() %q found from %q", + name, m.ModuleName())) + } else { + return nil + } +} + +func (m *moduleContext) GetDirectDepProxyWithTag(name string, tag blueprint.DependencyTag) *ModuleProxy { + deps := m.getDirectDepsProxyInternal(name, tag) + if len(deps) == 1 { + return &deps[0] + } else if len(deps) >= 2 { + panic(fmt.Errorf("Multiple dependencies having same BaseModuleName() %q found from %q", + name, m.ModuleName())) + } else { + return nil } - return nil } func (m *moduleContext) ModuleSubDir() string { @@ -623,8 +640,10 @@ func (m *moduleContext) installFile(installPath InstallPath, name string, srcPat if m.requiresFullInstall() { deps = append(deps, InstallPaths(m.TransitiveInstallFiles.ToList())...) - deps = append(deps, m.installedInitRcPaths...) - deps = append(deps, m.installedVintfFragmentsPaths...) + if m.config.KatiEnabled() { + deps = append(deps, m.installedInitRcPaths...) + deps = append(deps, m.installedVintfFragmentsPaths...) + } var implicitDeps, orderOnlyDeps Paths diff --git a/android/module_test.go b/android/module_test.go index d5bf94137..6e6d44909 100644 --- a/android/module_test.go +++ b/android/module_test.go @@ -327,21 +327,21 @@ func TestInstall(t *testing.T) { outputRule := func(name string) TestingBuildParams { return module(name, false).Output(name) } installRule := func(name string) TestingBuildParams { - return module(name, false).Output(filepath.Join("out/soong/target/product/test_device/system", name)) + return module(name, false).Output(filepath.Join("out/target/product/test_device/system", name)) } symlinkRule := func(name string) TestingBuildParams { - return module(name, false).Output(filepath.Join("out/soong/target/product/test_device/system/symlinks", name)) + return module(name, false).Output(filepath.Join("out/target/product/test_device/system/symlinks", name)) } hostOutputRule := func(name string) TestingBuildParams { return module(name, true).Output(name) } hostInstallRule := func(name string) TestingBuildParams { - return module(name, true).Output(filepath.Join("out/soong/host/linux-x86", name)) + return module(name, true).Output(filepath.Join("out/host/linux-x86", name)) } hostSymlinkRule := func(name string) TestingBuildParams { - return module(name, true).Output(filepath.Join("out/soong/host/linux-x86/symlinks", name)) + return module(name, true).Output(filepath.Join("out/host/linux-x86/symlinks", name)) } assertInputs := func(params TestingBuildParams, inputs ...Path) { diff --git a/android/namespace.go b/android/namespace.go index 8b3ebc4d5..9ba502514 100644 --- a/android/namespace.go +++ b/android/namespace.go @@ -332,7 +332,7 @@ func (r *NameResolver) MissingDependencyError(depender string, dependerNamespace if isAbs { // if the user gave a fully-qualified name, we don't need to look for other // modules that they might have been referring to - return fmt.Errorf(text) + return fmt.Errorf("%s", text) } // determine which namespaces the module can be found in @@ -368,7 +368,7 @@ func (r *NameResolver) MissingDependencyError(depender string, dependerNamespace text += fmt.Sprintf("\nOr did you mean %q?", guess) } - return fmt.Errorf(text) + return fmt.Errorf("%s", text) } func (r *NameResolver) GetNamespace(ctx blueprint.NamespaceContext) blueprint.Namespace { diff --git a/android/paths.go b/android/paths.go index 94f00ad43..d57ac7043 100644 --- a/android/paths.go +++ b/android/paths.go @@ -2076,7 +2076,7 @@ func pathForInstall(ctx PathContext, os OsType, arch ArchType, partition string, reportPathError(ctx, err) } - base := pathForPartitionInstallDir(ctx, partition, partitionPath, ctx.Config().KatiEnabled()) + base := pathForPartitionInstallDir(ctx, partition, partitionPath, true) return base.Join(ctx, pathComponents...) } diff --git a/android/paths_test.go b/android/paths_test.go index 5e618f914..20beecc35 100644 --- a/android/paths_test.go +++ b/android/paths_test.go @@ -1561,7 +1561,7 @@ func TestPathRelativeToTop(t *testing.T) { t.Run("install for soong", func(t *testing.T) { p := PathForModuleInstall(ctx, "install/path") - AssertPathRelativeToTopEquals(t, "install path for soong", "out/soong/target/product/test_device/system/install/path", p) + AssertPathRelativeToTopEquals(t, "install path for soong", "out/target/product/test_device/system/install/path", p) }) t.Run("install for make", func(t *testing.T) { p := PathForModuleInstall(ctx, "install/path") @@ -1584,7 +1584,7 @@ func TestPathRelativeToTop(t *testing.T) { } expected := []string{ - "out/soong/target/product/test_device/system/install/path", + "out/target/product/test_device/system/install/path", "out/soong/output/path", "source/path", } 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/rule_builder_test.go b/android/rule_builder_test.go index e1a1e08c4..566bafa06 100644 --- a/android/rule_builder_test.go +++ b/android/rule_builder_test.go @@ -358,7 +358,7 @@ func TestRuleBuilder(t *testing.T) { "command3 input3 out_local/soong/module/output2 out_local/soong/module/output3 input3 out_local/soong/module/output2", } - wantDepMergerCommand := "out_local/soong/host/" + ctx.Config().PrebuiltOS() + "/bin/dep_fixer " + + wantDepMergerCommand := "out_local/host/" + ctx.Config().PrebuiltOS() + "/bin/dep_fixer " + "out_local/soong/module/DepFile out_local/soong/module/depfile out_local/soong/module/ImplicitDepFile out_local/soong/module/depfile2" AssertDeepEquals(t, "rule.Commands()", wantCommands, rule.Commands()) @@ -388,7 +388,7 @@ func TestRuleBuilder(t *testing.T) { "command3 input3 __SBOX_SANDBOX_DIR__/out/output2 __SBOX_SANDBOX_DIR__/out/output3 input3 __SBOX_SANDBOX_DIR__/out/output2", } - wantDepMergerCommand := "out_local/soong/host/" + ctx.Config().PrebuiltOS() + "/bin/dep_fixer __SBOX_SANDBOX_DIR__/out/DepFile __SBOX_SANDBOX_DIR__/out/depfile __SBOX_SANDBOX_DIR__/out/ImplicitDepFile __SBOX_SANDBOX_DIR__/out/depfile2" + wantDepMergerCommand := "out_local/host/" + ctx.Config().PrebuiltOS() + "/bin/dep_fixer __SBOX_SANDBOX_DIR__/out/DepFile __SBOX_SANDBOX_DIR__/out/depfile __SBOX_SANDBOX_DIR__/out/ImplicitDepFile __SBOX_SANDBOX_DIR__/out/depfile2" AssertDeepEquals(t, "rule.Commands()", wantCommands, rule.Commands()) @@ -664,7 +664,7 @@ func TestRuleBuilder_Build(t *testing.T) { rspFile := filepath.Join(outDir, "rsp") rspFile2 := filepath.Join(outDir, "rsp2") manifest := filepath.Join(outDir, "sbox.textproto") - sbox := filepath.Join("out", "soong", "host", result.Config.PrebuiltOS(), "bin/sbox") + sbox := filepath.Join("out", "host", result.Config.PrebuiltOS(), "bin/sbox") sandboxPath := shared.TempDirForOutDir("out/soong") cmd := sbox + ` --sandbox-path ` + sandboxPath + ` --output-dir ` + sboxOutDir + ` --manifest ` + manifest @@ -680,7 +680,7 @@ func TestRuleBuilder_Build(t *testing.T) { rspFile := filepath.Join(outDir, "rsp") rspFile2 := filepath.Join(outDir, "rsp2") manifest := filepath.Join(outDir, "sbox.textproto") - sbox := filepath.Join("out", "soong", "host", result.Config.PrebuiltOS(), "bin/sbox") + sbox := filepath.Join("out", "host", result.Config.PrebuiltOS(), "bin/sbox") sandboxPath := shared.TempDirForOutDir("out/soong") cmd := sbox + ` --sandbox-path ` + sandboxPath + ` --output-dir ` + sboxOutDir + ` --manifest ` + manifest diff --git a/android/testing.go b/android/testing.go index 765839ffa..6c4f4f8de 100644 --- a/android/testing.go +++ b/android/testing.go @@ -1157,7 +1157,7 @@ func AndroidMkEntriesForTest(t *testing.T, ctx *TestContext, mod blueprint.Modul var p AndroidMkEntriesProvider var ok bool if p, ok = mod.(AndroidMkEntriesProvider); !ok { - t.Errorf("module does not implement AndroidMkEntriesProvider: " + mod.Name()) + t.Error("module does not implement AndroidMkEntriesProvider: " + mod.Name()) } entriesList := p.AndroidMkEntries() @@ -1177,7 +1177,7 @@ func AndroidMkInfoForTest(t *testing.T, ctx *TestContext, mod blueprint.Module) t.Helper() var ok bool if _, ok = mod.(AndroidMkProviderInfoProducer); !ok { - t.Errorf("module does not implement AndroidMkProviderInfoProducer: " + mod.Name()) + t.Error("module does not implement AndroidMkProviderInfoProducer: " + mod.Name()) } info := OtherModuleProviderOrDefault(ctx, mod, AndroidMkInfoProvider) @@ -1197,7 +1197,7 @@ func AndroidMkDataForTest(t *testing.T, ctx *TestContext, mod blueprint.Module) var p AndroidMkDataProvider var ok bool if p, ok = mod.(AndroidMkDataProvider); !ok { - t.Fatalf("module does not implement AndroidMkDataProvider: " + mod.Name()) + t.Fatal("module does not implement AndroidMkDataProvider: " + mod.Name()) } data := p.AndroidMk() data.fillInData(ctx, mod) diff --git a/android/variable.go b/android/variable.go index 19f63e33f..3cf66eaf1 100644 --- a/android/variable.go +++ b/android/variable.go @@ -617,7 +617,11 @@ type PartitionVariables struct { ProductUseDynamicPartitionSize bool `json:",omitempty"` CopyImagesForTargetFilesZip bool `json:",omitempty"` - VendorSecurityPatch string `json:",omitempty"` + VendorSecurityPatch string `json:",omitempty"` + OdmSecurityPatch string `json:",omitempty"` + SystemDlkmSecurityPatch string `json:",omitempty"` + VendorDlkmSecurityPatch string `json:",omitempty"` + OdmDlkmSecurityPatch string `json:",omitempty"` // Boot image stuff BuildingRamdiskImage bool `json:",omitempty"` @@ -688,6 +692,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/android/vintf_fragment_test.go b/android/vintf_fragment_test.go index cd90b986c..cb038f5ad 100644 --- a/android/vintf_fragment_test.go +++ b/android/vintf_fragment_test.go @@ -31,6 +31,6 @@ func TestVintfManifestBuildAction(t *testing.T) { 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) + t.Error("Vintf_manifest build command does not process with assemble_vintf : " + vintfFragmentBuild.RuleParams.Command) } } diff --git a/apex/apex.go b/apex/apex.go index 2848ddcd6..375d5af17 100644 --- a/apex/apex.go +++ b/apex/apex.go @@ -147,9 +147,6 @@ type apexBundleProperties struct { // Default: true. Installable *bool - // Deprecated. Do not use. TODO(b/350644693) remove this after removing all usage - Use_vndk_as_stable *bool - // The type of filesystem to use. Either 'ext4', 'f2fs' or 'erofs'. Default 'ext4'. Payload_fs_type *string @@ -157,10 +154,6 @@ type apexBundleProperties struct { // Default is false. Ignore_system_library_special_case *bool - // Whenever apex_payload.img of the APEX should include dm-verity hashtree. - // Default value is true. - Generate_hashtree *bool - // Whenever apex_payload.img of the APEX should not be dm-verity signed. Should be only // used in tests. Test_only_unsigned_payload *bool @@ -1321,11 +1314,6 @@ func (a *apexBundle) installable() bool { return !a.properties.PreventInstall && (a.properties.Installable == nil || proptools.Bool(a.properties.Installable)) } -// See the generate_hashtree property -func (a *apexBundle) shouldGenerateHashtree() bool { - return proptools.BoolDefault(a.properties.Generate_hashtree, true) -} - // See the test_only_unsigned_payload property func (a *apexBundle) testOnlyShouldSkipPayloadSign() bool { return proptools.Bool(a.properties.Test_only_unsigned_payload) diff --git a/apex/apex_test.go b/apex/apex_test.go index a03bb4492..fa4cf3bb1 100644 --- a/apex/apex_test.go +++ b/apex/apex_test.go @@ -4771,7 +4771,7 @@ func TestApexInVariousPartition(t *testing.T) { `) apex := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle) - expected := "out/soong/target/product/test_device/" + tc.partition + "/apex" + expected := "out/target/product/test_device/" + tc.partition + "/apex" actual := apex.installDir.RelativeToTop().String() if actual != expected { t.Errorf("wrong install path. expected %q. actual %q", expected, actual) @@ -7431,7 +7431,6 @@ func TestLegacyAndroid10Support(t *testing.T) { module := ctx.ModuleForTests("myapex", "android_common_myapex") args := module.Rule("apexRule").Args ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String()) - ensureNotContains(t, args["opt_flags"], "--no_hashtree") // The copies of the libraries in the apex should have one more dependency than // the ones outside the apex, namely the unwinder. Ideally we should check diff --git a/apex/builder.go b/apex/builder.go index 45608c933..c85d0a0ce 100644 --- a/apex/builder.go +++ b/apex/builder.go @@ -70,7 +70,7 @@ func init() { pctx.HostBinToolVariable("extract_apks", "extract_apks") pctx.HostBinToolVariable("make_f2fs", "make_f2fs") pctx.HostBinToolVariable("sload_f2fs", "sload_f2fs") - pctx.HostBinToolVariable("make_erofs", "make_erofs") + pctx.HostBinToolVariable("make_erofs", "mkfs.erofs") pctx.HostBinToolVariable("apex_compression_tool", "apex_compression_tool") pctx.HostBinToolVariable("dexdeps", "dexdeps") pctx.HostBinToolVariable("apex_sepolicy_tests", "apex_sepolicy_tests") @@ -275,6 +275,12 @@ func (a *apexBundle) buildAconfigFiles(ctx android.ModuleContext) []apexFile { }) files = append(files, newApexFile(ctx, apexAconfigFile, "aconfig_flags", "etc", etc, nil)) + // To enable fingerprint, we need to have v2 storage files. The default version is 1. + storageFilesVersion := 1 + if ctx.Config().ReleaseFingerprintAconfigPackages() { + storageFilesVersion = 2 + } + for _, info := range createStorageInfo { outputFile := android.PathForModuleOut(ctx, info.Output_file) ctx.Build(pctx, android.BuildParams{ @@ -286,6 +292,7 @@ func (a *apexBundle) buildAconfigFiles(ctx android.ModuleContext) []apexFile { "container": ctx.ModuleName(), "file_type": info.File_type, "cache_files": android.JoinPathsWithPrefix(aconfigFiles, "--cache "), + "version": strconv.Itoa(storageFilesVersion), }, }) files = append(files, newApexFile(ctx, outputFile, info.File_type, "etc", etc, nil)) @@ -544,7 +551,7 @@ func (a *apexBundle) buildApex(ctx android.ModuleContext) { imageDir := android.PathForModuleOut(ctx, "image"+suffix) - installSymbolFiles := (!ctx.Config().KatiEnabled() || a.ExportedToMake()) && a.installable() + installSymbolFiles := (ctx.Config().KatiEnabled() && a.ExportedToMake()) && a.installable() // set of dependency module:location mappings installMapSet := make(map[string]bool) @@ -764,18 +771,6 @@ func (a *apexBundle) buildApex(ctx android.ModuleContext) { implicitInputs = append(implicitInputs, noticeAssetPath) optFlags = append(optFlags, "--assets_dir "+filepath.Dir(noticeAssetPath.String())) - // Apexes which are supposed to be installed in builtin dirs(/system, etc) - // don't need hashtree for activation. Therefore, by removing hashtree from - // apex bundle (filesystem image in it, to be specific), we can save storage. - needHashTree := moduleMinSdkVersion.LessThanOrEqualTo(android.SdkVersion_Android10) || - a.shouldGenerateHashtree() - if ctx.Config().ApexCompressionEnabled() && a.isCompressable() { - needHashTree = true - } - if !needHashTree { - optFlags = append(optFlags, "--no_hashtree") - } - if a.testOnlyShouldSkipPayloadSign() { optFlags = append(optFlags, "--unsigned_payload") } diff --git a/apex/platform_bootclasspath_test.go b/apex/platform_bootclasspath_test.go index 9f9b0b4d8..c13d59989 100644 --- a/apex/platform_bootclasspath_test.go +++ b/apex/platform_bootclasspath_test.go @@ -653,7 +653,7 @@ func TestPlatformBootclasspath_IncludesRemainingApexJars(t *testing.T) { true, // proto should be generated "myapex:foo", // apex doesn't generate its own config, so must be in platform_bootclasspath "bootclasspath.pb", - "out/soong/target/product/test_device/system/etc/classpaths", + "out/target/product/test_device/system/etc/classpaths", ) } diff --git a/bpf/bpf.go b/bpf/bpf.go index 3b7073e1b..3f3438247 100644 --- a/bpf/bpf.go +++ b/bpf/bpf.go @@ -230,8 +230,6 @@ func (bpf *bpf) GenerateAndroidBuildActions(ctx android.ModuleContext) { ctx.PackageFile(installDir, obj.Base(), obj) } - android.SetProvider(ctx, blueprint.SrcsFileProviderKey, blueprint.SrcsFileProviderData{SrcPaths: srcs.Strings()}) - ctx.SetOutputFiles(bpf.objs, "") } diff --git a/bpf/libbpf/libbpf_prog.go b/bpf/libbpf/libbpf_prog.go index 3b26d4654..44013e5e3 100644 --- a/bpf/libbpf/libbpf_prog.go +++ b/bpf/libbpf/libbpf_prog.go @@ -239,8 +239,6 @@ func (libbpf *libbpfProg) GenerateAndroidBuildActions(ctx android.ModuleContext) ctx.PackageFile(installDir, obj.Base(), obj) } - android.SetProvider(ctx, blueprint.SrcsFileProviderKey, blueprint.SrcsFileProviderData{SrcPaths: srcs.Strings()}) - ctx.SetOutputFiles(libbpf.objs, "") } diff --git a/cc/afdo.go b/cc/afdo.go index 03dc2713e..828e494e1 100644 --- a/cc/afdo.go +++ b/cc/afdo.go @@ -65,8 +65,8 @@ func (afdo *afdo) isAfdoCompile(ctx ModuleContext) bool { } func getFdoProfilePathFromDep(ctx ModuleContext) string { - fdoProfileDeps := ctx.GetDirectDepsWithTag(FdoProfileTag) - if len(fdoProfileDeps) > 0 && fdoProfileDeps[0] != nil { + fdoProfileDeps := ctx.GetDirectDepsProxyWithTag(FdoProfileTag) + if len(fdoProfileDeps) > 0 { if info, ok := android.OtherModuleProvider(ctx, fdoProfileDeps[0], FdoProfileProvider); ok { return info.Path.String() } @@ -46,16 +46,72 @@ type CcMakeVarsInfo struct { var CcMakeVarsInfoProvider = blueprint.NewProvider[*CcMakeVarsInfo]() type CcObjectInfo struct { - objFiles android.Paths - tidyFiles android.Paths - kytheFiles android.Paths + ObjFiles android.Paths + TidyFiles android.Paths + KytheFiles android.Paths } var CcObjectInfoProvider = blueprint.NewProvider[CcObjectInfo]() +type AidlInterfaceInfo struct { + // list of aidl_interface sources + Sources []string + // root directory of AIDL sources + AidlRoot string + // AIDL backend language (e.g. "cpp", "ndk") + Lang string + // list of flags passed to AIDL generator + Flags []string +} + +type CompilerInfo struct { + Srcs android.Paths + // list of module-specific flags that will be used for C and C++ compiles. + Cflags proptools.Configurable[[]string] + AidlInterfaceInfo AidlInterfaceInfo + LibraryDecoratorInfo *LibraryDecoratorInfo +} + +type LinkerInfo struct { + WholeStaticLibs proptools.Configurable[[]string] + // list of modules that should be statically linked into this module. + StaticLibs proptools.Configurable[[]string] + // list of modules that should be dynamically linked into this module. + SharedLibs proptools.Configurable[[]string] + // list of modules that should only provide headers for this module. + HeaderLibs proptools.Configurable[[]string] + UnstrippedOutputFile android.Path + + BinaryDecoratorInfo *BinaryDecoratorInfo + LibraryDecoratorInfo *LibraryDecoratorInfo + TestBinaryInfo *TestBinaryInfo + BenchmarkDecoratorInfo *BenchmarkDecoratorInfo + ObjectLinkerInfo *ObjectLinkerInfo +} + +type BinaryDecoratorInfo struct{} +type LibraryDecoratorInfo struct { + ExportIncludeDirs proptools.Configurable[[]string] +} + +type LibraryInfo struct { + StubsVersion string +} + +type TestBinaryInfo struct { + Gtest bool +} +type BenchmarkDecoratorInfo struct{} +type ObjectLinkerInfo struct{} + // Common info about the cc module. type CcInfo struct { - HasStubsVariants bool + HasStubsVariants bool + IsPrebuilt bool + CmakeSnapshotSupported bool + CompilerInfo *CompilerInfo + LinkerInfo *LinkerInfo + LibraryInfo *LibraryInfo } var CcInfoProvider = blueprint.NewProvider[CcInfo]() @@ -1194,11 +1250,6 @@ func (c *Module) BuildRlibVariant() bool { return false } -func (c *Module) IsRustFFI() bool { - // cc modules are not Rust modules - return false -} - func (c *Module) Module() android.Module { return c } @@ -2069,8 +2120,6 @@ func (c *Module) GenerateAndroidBuildActions(actx android.ModuleContext) { }) } - android.SetProvider(ctx, blueprint.SrcsFileProviderKey, blueprint.SrcsFileProviderData{SrcPaths: deps.GeneratedSources.Strings()}) - if Bool(c.Properties.Cmake_snapshot_supported) { android.SetProvider(ctx, cmakeSnapshotSourcesProvider, android.GlobFiles(ctx, ctx.ModuleDir()+"/**/*", nil)) } @@ -2122,13 +2171,13 @@ func (c *Module) GenerateAndroidBuildActions(actx android.ModuleContext) { } ccObjectInfo := CcObjectInfo{ - kytheFiles: objs.kytheFiles, + KytheFiles: objs.kytheFiles, } if !ctx.Config().KatiEnabled() || !android.ShouldSkipAndroidMkProcessing(ctx, c) { - ccObjectInfo.objFiles = objs.objFiles - ccObjectInfo.tidyFiles = objs.tidyFiles + ccObjectInfo.ObjFiles = objs.objFiles + ccObjectInfo.TidyFiles = objs.tidyFiles } - if len(ccObjectInfo.kytheFiles)+len(ccObjectInfo.objFiles)+len(ccObjectInfo.tidyFiles) > 0 { + if len(ccObjectInfo.KytheFiles)+len(ccObjectInfo.ObjFiles)+len(ccObjectInfo.TidyFiles) > 0 { android.SetProvider(ctx, CcObjectInfoProvider, ccObjectInfo) } @@ -2136,9 +2185,58 @@ func (c *Module) GenerateAndroidBuildActions(actx android.ModuleContext) { StaticExecutable: c.StaticExecutable(), }) - android.SetProvider(ctx, CcInfoProvider, CcInfo{ - HasStubsVariants: c.HasStubsVariants(), - }) + ccInfo := CcInfo{ + HasStubsVariants: c.HasStubsVariants(), + IsPrebuilt: c.IsPrebuilt(), + CmakeSnapshotSupported: proptools.Bool(c.Properties.Cmake_snapshot_supported), + } + if c.compiler != nil { + ccInfo.CompilerInfo = &CompilerInfo{ + Srcs: c.compiler.(CompiledInterface).Srcs(), + Cflags: c.compiler.baseCompilerProps().Cflags, + AidlInterfaceInfo: AidlInterfaceInfo{ + Sources: c.compiler.baseCompilerProps().AidlInterface.Sources, + AidlRoot: c.compiler.baseCompilerProps().AidlInterface.AidlRoot, + Lang: c.compiler.baseCompilerProps().AidlInterface.Lang, + Flags: c.compiler.baseCompilerProps().AidlInterface.Flags, + }, + } + switch decorator := c.compiler.(type) { + case *libraryDecorator: + ccInfo.CompilerInfo.LibraryDecoratorInfo = &LibraryDecoratorInfo{ + ExportIncludeDirs: decorator.flagExporter.Properties.Export_include_dirs, + } + } + } + if c.linker != nil { + ccInfo.LinkerInfo = &LinkerInfo{ + WholeStaticLibs: c.linker.baseLinkerProps().Whole_static_libs, + StaticLibs: c.linker.baseLinkerProps().Static_libs, + SharedLibs: c.linker.baseLinkerProps().Shared_libs, + HeaderLibs: c.linker.baseLinkerProps().Header_libs, + UnstrippedOutputFile: c.UnstrippedOutputFile(), + } + switch decorator := c.linker.(type) { + case *binaryDecorator: + ccInfo.LinkerInfo.BinaryDecoratorInfo = &BinaryDecoratorInfo{} + case *libraryDecorator: + ccInfo.LinkerInfo.LibraryDecoratorInfo = &LibraryDecoratorInfo{} + case *testBinary: + ccInfo.LinkerInfo.TestBinaryInfo = &TestBinaryInfo{ + Gtest: decorator.testDecorator.gtest(), + } + case *benchmarkDecorator: + ccInfo.LinkerInfo.BenchmarkDecoratorInfo = &BenchmarkDecoratorInfo{} + case *objectLinker: + ccInfo.LinkerInfo.ObjectLinkerInfo = &ObjectLinkerInfo{} + } + } + if c.library != nil { + ccInfo.LibraryInfo = &LibraryInfo{ + StubsVersion: c.library.stubsVersion(), + } + } + android.SetProvider(ctx, CcInfoProvider, ccInfo) c.setOutputFiles(ctx) @@ -2172,7 +2270,7 @@ func buildComplianceMetadataInfo(ctx ModuleContext, c *Module, deps PathDeps) { complianceMetadataInfo.SetStringValue(android.ComplianceMetadataProp.BUILT_FILES, c.outputFile.String()) // Static deps - staticDeps := ctx.GetDirectDepsWithTag(StaticDepTag(false)) + staticDeps := ctx.GetDirectDepsProxyWithTag(StaticDepTag(false)) staticDepNames := make([]string, 0, len(staticDeps)) for _, dep := range staticDeps { staticDepNames = append(staticDepNames, dep.Name()) @@ -2186,7 +2284,7 @@ func buildComplianceMetadataInfo(ctx ModuleContext, c *Module, deps PathDeps) { complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.STATIC_DEP_FILES, android.FirstUniqueStrings(staticDepPaths)) // Whole static deps - wholeStaticDeps := ctx.GetDirectDepsWithTag(StaticDepTag(true)) + wholeStaticDeps := ctx.GetDirectDepsProxyWithTag(StaticDepTag(true)) wholeStaticDepNames := make([]string, 0, len(wholeStaticDeps)) for _, dep := range wholeStaticDeps { wholeStaticDepNames = append(wholeStaticDepNames, dep.Name()) @@ -3993,7 +4091,7 @@ type kytheExtractAllSingleton struct { func (ks *kytheExtractAllSingleton) GenerateBuildActions(ctx android.SingletonContext) { var xrefTargets android.Paths ctx.VisitAllModuleProxies(func(module android.ModuleProxy) { - files := android.OtherModuleProviderOrDefault(ctx, module, CcObjectInfoProvider).kytheFiles + files := android.OtherModuleProviderOrDefault(ctx, module, CcObjectInfoProvider).KytheFiles if len(files) > 0 { xrefTargets = append(xrefTargets, files...) } diff --git a/cc/cmake_module_aidl.txt b/cc/cmake_module_aidl.txt index 84755a32a..36226486b 100644 --- a/cc/cmake_module_aidl.txt +++ b/cc/cmake_module_aidl.txt @@ -1,11 +1,11 @@ # <<.M.Name>> -<<setList .M.Name "_SRCS" "" (getAidlSources .M)>> +<<setList .M.Name "_SRCS" "" (getAidlSources .CcInfo)>> -<<setList .M.Name "_AIDLFLAGS" "" (getCompilerProperties .M).AidlInterface.Flags>> +<<setList .M.Name "_AIDLFLAGS" "" (getAidlInterface .CcInfo).Flags>> -add_aidl_library(<<.M.Name>> <<(getCompilerProperties .M).AidlInterface.Lang>> - "${ANDROID_BUILD_TOP}/<<.Ctx.OtherModuleDir .M>>/<<(getCompilerProperties .M).AidlInterface.AidlRoot>>" +add_aidl_library(<<.M.Name>> <<(getAidlInterface .CcInfo).Lang>> + "${ANDROID_BUILD_TOP}/<<.Ctx.OtherModuleDir .M>>/<<(getAidlInterface .CcInfo).AidlRoot>>" "${<<.M.Name>>_SRCS}" "${<<.M.Name>>_AIDLFLAGS}") add_library(android::<<.M.Name>> ALIAS <<.M.Name>>) diff --git a/cc/cmake_module_cc.txt b/cc/cmake_module_cc.txt index 0f6e62f10..a57e0530f 100644 --- a/cc/cmake_module_cc.txt +++ b/cc/cmake_module_cc.txt @@ -1,14 +1,14 @@ -<<$srcs := getSources .M>> -<<$includeDirs := getIncludeDirs .Ctx .M>> -<<$cflags := getCflagsProperty .Ctx .M>> +<<$srcs := getSources .Ctx .CcInfo>> +<<$includeDirs := getIncludeDirs .Ctx .M .CcInfo>> +<<$cflags := getCflagsProperty .Ctx .CcInfo>> <<$deps := mapLibraries .Ctx .M (concat5 -(getWholeStaticLibsProperty .Ctx .M) -(getStaticLibsProperty .Ctx .M) -(getSharedLibsProperty .Ctx .M) -(getHeaderLibsProperty .Ctx .M) -(getExtraLibs .M) +(getWholeStaticLibsProperty .Ctx .CcInfo) +(getStaticLibsProperty .Ctx .CcInfo) +(getSharedLibsProperty .Ctx .CcInfo) +(getHeaderLibsProperty .Ctx .CcInfo) +(getExtraLibs .CcInfo) ) .Pprop.LibraryMapping>> -<<$moduleType := getModuleType .M>> +<<$moduleType := getModuleType .CcInfo>> <<$moduleTypeCmake := "executable">> <<if eq $moduleType "library">> <<$moduleTypeCmake = "library">> diff --git a/cc/cmake_snapshot.go b/cc/cmake_snapshot.go index f553f27be..a40b863f9 100644 --- a/cc/cmake_snapshot.go +++ b/cc/cmake_snapshot.go @@ -196,39 +196,36 @@ func parseTemplate(templateContents string) *template.Template { return list.String() }, - "getSources": func(m *Module) android.Paths { - return m.compiler.(CompiledInterface).Srcs() + "getSources": func(ctx android.ModuleContext, info *CcInfo) android.Paths { + return info.CompilerInfo.Srcs }, "getModuleType": getModuleType, - "getCompilerProperties": func(m *Module) BaseCompilerProperties { - return m.compiler.baseCompilerProps() + "getAidlInterface": func(info *CcInfo) AidlInterfaceInfo { + return info.CompilerInfo.AidlInterfaceInfo }, - "getCflagsProperty": func(ctx android.ModuleContext, m *Module) []string { - prop := m.compiler.baseCompilerProps().Cflags + "getCflagsProperty": func(ctx android.ModuleContext, info *CcInfo) []string { + prop := info.CompilerInfo.Cflags return prop.GetOrDefault(ctx, nil) }, - "getLinkerProperties": func(m *Module) BaseLinkerProperties { - return m.linker.baseLinkerProps() - }, - "getWholeStaticLibsProperty": func(ctx android.ModuleContext, m *Module) []string { - prop := m.linker.baseLinkerProps().Whole_static_libs + "getWholeStaticLibsProperty": func(ctx android.ModuleContext, info *CcInfo) []string { + prop := info.LinkerInfo.WholeStaticLibs return prop.GetOrDefault(ctx, nil) }, - "getStaticLibsProperty": func(ctx android.ModuleContext, m *Module) []string { - prop := m.linker.baseLinkerProps().Static_libs + "getStaticLibsProperty": func(ctx android.ModuleContext, info *CcInfo) []string { + prop := info.LinkerInfo.StaticLibs return prop.GetOrDefault(ctx, nil) }, - "getSharedLibsProperty": func(ctx android.ModuleContext, m *Module) []string { - prop := m.linker.baseLinkerProps().Shared_libs + "getSharedLibsProperty": func(ctx android.ModuleContext, info *CcInfo) []string { + prop := info.LinkerInfo.SharedLibs return prop.GetOrDefault(ctx, nil) }, - "getHeaderLibsProperty": func(ctx android.ModuleContext, m *Module) []string { - prop := m.linker.baseLinkerProps().Header_libs + "getHeaderLibsProperty": func(ctx android.ModuleContext, info *CcInfo) []string { + prop := info.LinkerInfo.HeaderLibs return prop.GetOrDefault(ctx, nil) }, "getExtraLibs": getExtraLibs, "getIncludeDirs": getIncludeDirs, - "mapLibraries": func(ctx android.ModuleContext, m *Module, libs []string, mapping map[string]LibraryMappingProperty) []string { + "mapLibraries": func(ctx android.ModuleContext, m android.ModuleProxy, libs []string, mapping map[string]LibraryMappingProperty) []string { var mappedLibs []string for _, lib := range libs { mappedLib, exists := mapping[lib] @@ -249,8 +246,8 @@ func parseTemplate(templateContents string) *template.Template { mappedLibs = slices.Compact(mappedLibs) return mappedLibs }, - "getAidlSources": func(m *Module) []string { - aidlInterface := m.compiler.baseCompilerProps().AidlInterface + "getAidlSources": func(info *CcInfo) []string { + aidlInterface := info.CompilerInfo.AidlInterfaceInfo aidlRoot := aidlInterface.AidlRoot + string(filepath.Separator) if aidlInterface.AidlRoot == "" { aidlRoot = "" @@ -340,14 +337,14 @@ func (m *CmakeSnapshot) GenerateAndroidBuildActions(ctx android.ModuleContext) { moduleDirs := map[string][]string{} sourceFiles := map[string]android.Path{} visitedModules := map[string]bool{} - var pregeneratedModules []*Module - ctx.WalkDeps(func(dep_a android.Module, parent android.Module) bool { - moduleName := ctx.OtherModuleName(dep_a) + var pregeneratedModules []android.ModuleProxy + ctx.WalkDepsProxy(func(dep, parent android.ModuleProxy) bool { + moduleName := ctx.OtherModuleName(dep) if visited := visitedModules[moduleName]; visited { return false // visit only once } visitedModules[moduleName] = true - dep, ok := dep_a.(*Module) + ccInfo, ok := android.OtherModuleProvider(ctx, dep, CcInfoProvider) if !ok { return false // not a cc module } @@ -363,15 +360,15 @@ func (m *CmakeSnapshot) GenerateAndroidBuildActions(ctx android.ModuleContext) { if slices.Contains(ignoredSystemLibs, moduleName) { return false // system libs built in-tree for Android } - if dep.IsPrebuilt() { + if ccInfo.IsPrebuilt { return false // prebuilts are not supported } - if dep.compiler == nil { + if ccInfo.CompilerInfo == nil { return false // unsupported module type } - isAidlModule := dep.compiler.baseCompilerProps().AidlInterface.Lang != "" + isAidlModule := ccInfo.CompilerInfo.AidlInterfaceInfo.Lang != "" - if !proptools.Bool(dep.Properties.Cmake_snapshot_supported) { + if !ccInfo.CmakeSnapshotSupported { ctx.OtherModulePropertyErrorf(dep, "cmake_snapshot_supported", "CMake snapshots not supported, despite being a dependency for %s", ctx.OtherModuleName(parent)) @@ -389,12 +386,14 @@ func (m *CmakeSnapshot) GenerateAndroidBuildActions(ctx android.ModuleContext) { } moduleFragment := executeTemplate(templateToUse, &templateBuffer, struct { Ctx *android.ModuleContext - M *Module + M android.ModuleProxy + CcInfo *CcInfo Snapshot *CmakeSnapshot Pprop *cmakeProcessedProperties }{ &ctx, dep, + &ccInfo, m, &pprop, }) @@ -415,7 +414,7 @@ func (m *CmakeSnapshot) GenerateAndroidBuildActions(ctx android.ModuleContext) { // Enumerate sources for pregenerated modules if m.Properties.Include_sources { for _, dep := range pregeneratedModules { - if !proptools.Bool(dep.Properties.Cmake_snapshot_supported) { + if !android.OtherModuleProviderOrDefault(ctx, dep, CcInfoProvider).CmakeSnapshotSupported { ctx.OtherModulePropertyErrorf(dep, "cmake_snapshot_supported", "Pregenerated CMake snapshots not supported, despite being requested for %s", ctx.ModuleName()) @@ -491,7 +490,7 @@ func (m *CmakeSnapshot) GenerateAndroidBuildActions(ctx android.ModuleContext) { if len(m.Properties.Prebuilts) > 0 { var prebuiltsList android.Paths - ctx.VisitDirectDepsWithTag(cmakeSnapshotPrebuiltTag, func(dep android.Module) { + ctx.VisitDirectDepsProxyWithTag(cmakeSnapshotPrebuiltTag, func(dep android.ModuleProxy) { for _, file := range android.OtherModuleProviderOrDefault( ctx, dep, android.InstallFilesProvider).InstallFiles { prebuiltsList = append(prebuiltsList, file) @@ -523,42 +522,37 @@ func (m *CmakeSnapshot) AndroidMkEntries() []android.AndroidMkEntries { }} } -func getModuleType(m *Module) string { - switch m.linker.(type) { - case *binaryDecorator: +func getModuleType(info *CcInfo) string { + if info.LinkerInfo.BinaryDecoratorInfo != nil { return "executable" - case *libraryDecorator: + } else if info.LinkerInfo.LibraryDecoratorInfo != nil { return "library" - case *testBinary: - return "test" - case *benchmarkDecorator: + } else if info.LinkerInfo.TestBinaryInfo != nil || info.LinkerInfo.BenchmarkDecoratorInfo != nil { return "test" - case *objectLinker: + } else if info.LinkerInfo.ObjectLinkerInfo != nil { return "object" } - panic(fmt.Sprintf("Unexpected module type: %T", m.linker)) + panic(fmt.Sprintf("Unexpected module type for LinkerInfo")) } -func getExtraLibs(m *Module) []string { - switch decorator := m.linker.(type) { - case *testBinary: - if decorator.testDecorator.gtest() { +func getExtraLibs(info *CcInfo) []string { + if info.LinkerInfo.TestBinaryInfo != nil { + if info.LinkerInfo.TestBinaryInfo.Gtest { return []string{ "libgtest", "libgtest_main", } } - case *benchmarkDecorator: + } else if info.LinkerInfo.BenchmarkDecoratorInfo != nil { return []string{"libgoogle-benchmark"} } return nil } -func getIncludeDirs(ctx android.ModuleContext, m *Module) []string { +func getIncludeDirs(ctx android.ModuleContext, m android.ModuleProxy, info *CcInfo) []string { moduleDir := ctx.OtherModuleDir(m) + string(filepath.Separator) - switch decorator := m.compiler.(type) { - case *libraryDecorator: - return sliceWithPrefix(moduleDir, decorator.flagExporter.Properties.Export_include_dirs.GetOrDefault(ctx, nil)) + if info.CompilerInfo.LibraryDecoratorInfo != nil { + return sliceWithPrefix(moduleDir, info.CompilerInfo.LibraryDecoratorInfo.ExportIncludeDirs.GetOrDefault(ctx, nil)) } return nil } diff --git a/cc/compiler.go b/cc/compiler.go index 91f107c29..f2bced10a 100644 --- a/cc/compiler.go +++ b/cc/compiler.go @@ -367,7 +367,7 @@ func (compiler *baseCompiler) compilerFlags(ctx ModuleContext, flags Flags, deps modulePath := ctx.ModuleDir() reuseObjs := false - if len(ctx.GetDirectDepsWithTag(reuseObjTag)) > 0 { + if len(ctx.GetDirectDepsProxyWithTag(reuseObjTag)) > 0 { reuseObjs = true } 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/fuzz.go b/cc/fuzz.go index 26ac7d1b8..911a81c18 100644 --- a/cc/fuzz.go +++ b/cc/fuzz.go @@ -288,7 +288,7 @@ func SharedLibrarySymbolsInstallLocation(libraryBase string, isVendor bool, fuzz } func (fuzzBin *fuzzBinary) install(ctx ModuleContext, file android.Path) { - fuzzBin.fuzzPackagedModule = PackageFuzzModule(ctx, fuzzBin.fuzzPackagedModule, pctx) + fuzzBin.fuzzPackagedModule = PackageFuzzModule(ctx, fuzzBin.fuzzPackagedModule) installBase := "fuzz" @@ -345,7 +345,7 @@ func (fuzzBin *fuzzBinary) install(ctx ModuleContext, file android.Path) { fuzzBin.binaryDecorator.baseInstaller.install(ctx, file) } -func PackageFuzzModule(ctx android.ModuleContext, fuzzPackagedModule fuzz.FuzzPackagedModule, pctx android.PackageContext) fuzz.FuzzPackagedModule { +func PackageFuzzModule(ctx android.ModuleContext, fuzzPackagedModule fuzz.FuzzPackagedModule) fuzz.FuzzPackagedModule { fuzzPackagedModule.Corpus = android.PathsForModuleSrc(ctx, fuzzPackagedModule.FuzzProperties.Corpus) fuzzPackagedModule.Corpus = append(fuzzPackagedModule.Corpus, android.PathsForModuleSrc(ctx, fuzzPackagedModule.FuzzProperties.Device_common_corpus)...) @@ -638,7 +638,7 @@ func CollectAllSharedDependencies(ctx android.ModuleContext) (android.RuleBuilde ctx.WalkDeps(func(child, parent android.Module) bool { // If this is a Rust module which is not rust_ffi_shared, we still want to bundle any transitive - // shared dependencies (even for rust_ffi_rlib or rust_ffi_static) + // shared dependencies (even for rust_ffi_static) if rustmod, ok := child.(LinkableInterface); ok && rustmod.RustLibraryInterface() && !rustmod.Shared() { if recursed[ctx.OtherModuleName(child)] { return false diff --git a/cc/library.go b/cc/library.go index ebc65efbd..c9114fdd7 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()) @@ -1206,7 +1216,7 @@ func (library *libraryDecorator) linkShared(ctx ModuleContext, // Visits the stub variants of the library and returns a struct containing the stub .so paths func addStubDependencyProviders(ctx ModuleContext) []SharedStubLibrary { stubsInfo := []SharedStubLibrary{} - stubs := ctx.GetDirectDepsWithTag(stubImplDepTag) + stubs := ctx.GetDirectDepsProxyWithTag(stubImplDepTag) if len(stubs) > 0 { for _, stub := range stubs { stubInfo, ok := android.OtherModuleProvider(ctx, stub, SharedLibraryInfoProvider) @@ -1215,8 +1225,12 @@ func addStubDependencyProviders(ctx ModuleContext) []SharedStubLibrary { continue } flagInfo, _ := android.OtherModuleProvider(ctx, stub, FlagExporterInfoProvider) + ccInfo, ok := android.OtherModuleProvider(ctx, stub, CcInfoProvider) + if !ok || ccInfo.LibraryInfo == nil { + panic(fmt.Errorf("couldn't find library info for %s", stub)) + } stubsInfo = append(stubsInfo, SharedStubLibrary{ - Version: moduleLibraryInterface(stub).stubsVersion(), + Version: ccInfo.LibraryInfo.StubsVersion, SharedLibraryInfo: stubInfo, FlagExporterInfo: flagInfo, }) @@ -2112,7 +2126,7 @@ func (linkageTransitionMutator) Split(ctx android.BaseModuleContext) []string { } else { // Header only } - } else if library, ok := ctx.Module().(LinkableInterface); ok && (library.CcLibraryInterface() || library.RustLibraryInterface()) { + } else if library, ok := ctx.Module().(LinkableInterface); ok && (library.CcLibraryInterface()) { // Non-cc.Modules may need an empty variant for their mutators. variations := []string{} if library.NonCcVariants() { @@ -2167,7 +2181,7 @@ func (linkageTransitionMutator) IncomingTransition(ctx android.IncomingTransitio } buildStatic := library.BuildStaticVariant() && !isLLNDK buildShared := library.BuildSharedVariant() - if library.BuildRlibVariant() && library.IsRustFFI() && !buildStatic && (incomingVariation == "static" || incomingVariation == "") { + if library.BuildRlibVariant() && !buildStatic && (incomingVariation == "static" || incomingVariation == "") { // Rust modules do not build static libs, but rlibs are used as if they // were via `static_libs`. Thus we need to alias the BuildRlibVariant // to "static" for Rust FFI libraries. diff --git a/cc/linkable.go b/cc/linkable.go index 1a9a9abbc..78ea71c7c 100644 --- a/cc/linkable.go +++ b/cc/linkable.go @@ -102,9 +102,6 @@ type LinkableInterface interface { IsPrebuilt() bool Toc() android.OptionalPath - // IsRustFFI returns true if this is a Rust FFI library. - IsRustFFI() bool - // IsFuzzModule returns true if this a *_fuzz module. IsFuzzModule() bool diff --git a/cc/llndk_library.go b/cc/llndk_library.go index 162dd5429..8cc385205 100644 --- a/cc/llndk_library.go +++ b/cc/llndk_library.go @@ -63,23 +63,52 @@ type llndkLibraryProperties struct { } func makeLlndkVars(ctx android.MakeVarsContext) { + +} + +func init() { + RegisterLlndkLibraryTxtType(android.InitRegistrationContext) + android.RegisterParallelSingletonType("movedToApexLlndkLibraries", movedToApexLlndkLibrariesFactory) +} + +func movedToApexLlndkLibrariesFactory() android.Singleton { + return &movedToApexLlndkLibraries{} +} + +type movedToApexLlndkLibraries struct { + movedToApexLlndkLibraries []string +} + +func (s *movedToApexLlndkLibraries) GenerateBuildActions(ctx android.SingletonContext) { // Make uses LLNDK_MOVED_TO_APEX_LIBRARIES to generate the linker config. - movedToApexLlndkLibraries := make(map[string]bool) + movedToApexLlndkLibrariesMap := make(map[string]bool) ctx.VisitAllModules(func(module android.Module) { if library := moduleLibraryInterface(module); library != nil && library.hasLLNDKStubs() { if library.isLLNDKMovedToApex() { name := library.implementationModuleName(module.(*Module).BaseModuleName()) - movedToApexLlndkLibraries[name] = true + movedToApexLlndkLibrariesMap[name] = true } } }) + s.movedToApexLlndkLibraries = android.SortedKeys(movedToApexLlndkLibrariesMap) + + var sb strings.Builder + for i, l := range s.movedToApexLlndkLibraries { + if i > 0 { + sb.WriteRune(' ') + } + sb.WriteString(l) + sb.WriteString(".so") + } + android.WriteFileRule(ctx, MovedToApexLlndkLibrariesFile(ctx), sb.String()) +} - ctx.Strict("LLNDK_MOVED_TO_APEX_LIBRARIES", - strings.Join(android.SortedKeys(movedToApexLlndkLibraries), " ")) +func MovedToApexLlndkLibrariesFile(ctx android.PathContext) android.WritablePath { + return android.PathForIntermediates(ctx, "moved_to_apex_llndk_libraries.txt") } -func init() { - RegisterLlndkLibraryTxtType(android.InitRegistrationContext) +func (s *movedToApexLlndkLibraries) MakeVars(ctx android.MakeVarsContext) { + ctx.Strict("LLNDK_MOVED_TO_APEX_LIBRARIES", strings.Join(s.movedToApexLlndkLibraries, " ")) } func RegisterLlndkLibraryTxtType(ctx android.RegistrationContext) { diff --git a/cc/makevars.go b/cc/makevars.go index 4cb98e70a..ca97b76f3 100644 --- a/cc/makevars.go +++ b/cc/makevars.go @@ -186,8 +186,6 @@ func makeVarsProvider(ctx android.MakeVarsContext) { if len(deviceTargets) > 1 { makeVarsToolchain(ctx, "2ND_", deviceTargets[1]) } - - makeLlndkVars(ctx) } func makeVarsToolchain(ctx android.MakeVarsContext, secondPrefix string, diff --git a/cc/ndk_library.go b/cc/ndk_library.go index 2411614a4..197a4b252 100644 --- a/cc/ndk_library.go +++ b/cc/ndk_library.go @@ -296,20 +296,20 @@ func compileStubLibrary(ctx ModuleContext, flags Flags, src android.Path) Object } func (this *stubDecorator) findImplementationLibrary(ctx ModuleContext) android.Path { - dep := ctx.GetDirectDepWithTag(strings.TrimSuffix(ctx.ModuleName(), ndkLibrarySuffix), + dep := ctx.GetDirectDepProxyWithTag(strings.TrimSuffix(ctx.ModuleName(), ndkLibrarySuffix), stubImplementation) if dep == nil { - ctx.ModuleErrorf("Could not find implementation for stub") + ctx.ModuleErrorf("Could not find implementation for stub: ") return nil } - impl, ok := dep.(*Module) + info, ok := android.OtherModuleProvider(ctx, *dep, CcInfoProvider) if !ok { ctx.ModuleErrorf("Implementation for stub is not correct module type") return nil } - output := impl.UnstrippedOutputFile() + output := info.LinkerInfo.UnstrippedOutputFile if output == nil { - ctx.ModuleErrorf("implementation module (%s) has no output", impl) + ctx.ModuleErrorf("implementation module (%s) has no output", *dep) return nil } diff --git a/cc/stub_library.go b/cc/stub_library.go index e746a331a..5911be017 100644 --- a/cc/stub_library.go +++ b/cc/stub_library.go @@ -26,9 +26,13 @@ func init() { android.RegisterParallelSingletonType("stublibraries", stubLibrariesSingleton) } +func stubLibrariesSingleton() android.Singleton { + return &stubLibraries{} +} + type stubLibraries struct { - stubLibraryMap map[string]bool - stubVendorLibraryMap map[string]bool + stubLibraries []string + vendorStubLibraries []string apiListCoverageXmlPaths []string } @@ -51,13 +55,15 @@ func getInstalledFileName(ctx android.SingletonContext, m *Module) string { func (s *stubLibraries) GenerateBuildActions(ctx android.SingletonContext) { // Visit all generated soong modules and store stub library file names. + stubLibraryMap := make(map[string]bool) + vendorStubLibraryMap := make(map[string]bool) ctx.VisitAllModules(func(module android.Module) { if m, ok := module.(*Module); ok { if IsStubTarget(m) { if name := getInstalledFileName(ctx, m); name != "" { - s.stubLibraryMap[name] = true + stubLibraryMap[name] = true if m.InVendor() { - s.stubVendorLibraryMap[name] = true + vendorStubLibraryMap[name] = true } } } @@ -68,19 +74,20 @@ func (s *stubLibraries) GenerateBuildActions(ctx android.SingletonContext) { } } }) + s.stubLibraries = android.SortedKeys(stubLibraryMap) + s.vendorStubLibraries = android.SortedKeys(vendorStubLibraryMap) + + android.WriteFileRule(ctx, StubLibrariesFile(ctx), strings.Join(s.stubLibraries, " ")) } -func stubLibrariesSingleton() android.Singleton { - return &stubLibraries{ - stubLibraryMap: make(map[string]bool), - stubVendorLibraryMap: make(map[string]bool), - } +func StubLibrariesFile(ctx android.PathContext) android.WritablePath { + return android.PathForIntermediates(ctx, "stub_libraries.txt") } func (s *stubLibraries) MakeVars(ctx android.MakeVarsContext) { // Convert stub library file names into Makefile variable. - ctx.Strict("STUB_LIBRARIES", strings.Join(android.SortedKeys(s.stubLibraryMap), " ")) - ctx.Strict("SOONG_STUB_VENDOR_LIBRARIES", strings.Join(android.SortedKeys(s.stubVendorLibraryMap), " ")) + ctx.Strict("STUB_LIBRARIES", strings.Join(s.stubLibraries, " ")) + ctx.Strict("SOONG_STUB_VENDOR_LIBRARIES", strings.Join(s.vendorStubLibraries, " ")) // Export the list of API XML files to Make. sort.Strings(s.apiListCoverageXmlPaths) diff --git a/cc/tidy.go b/cc/tidy.go index 6481b9537..18e6f3575 100644 --- a/cc/tidy.go +++ b/cc/tidy.go @@ -222,8 +222,8 @@ func collectTidyObjModuleTargets(ctx android.SingletonContext, module android.Mo ctx.VisitAllModuleVariantProxies(module, func(variant android.ModuleProxy) { osName := android.OtherModuleProviderOrDefault(ctx, variant, android.CommonModuleInfoKey).CompileTarget.Os.Name info := android.OtherModuleProviderOrDefault(ctx, variant, CcObjectInfoProvider) - addToOSGroup(osName, info.objFiles, allObjFileGroups, subsetObjFileGroups) - addToOSGroup(osName, info.tidyFiles, allTidyFileGroups, subsetTidyFileGroups) + addToOSGroup(osName, info.ObjFiles, allObjFileGroups, subsetObjFileGroups) + addToOSGroup(osName, info.TidyFiles, allTidyFileGroups, subsetTidyFileGroups) }) // (2) Add an all-OS group, with "" or "subset" name, to include all os-specific phony targets. 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/flag_artifact.go b/cmd/release_config/release_config_lib/flag_artifact.go index cb13fdce4..f493e1e06 100644 --- a/cmd/release_config/release_config_lib/flag_artifact.go +++ b/cmd/release_config/release_config_lib/flag_artifact.go @@ -189,7 +189,7 @@ func (fa *FlagArtifact) UpdateValue(flagValue FlagValue) error { if redacted { fa.Redact() flagValue.proto.Value = fa.Value - fmt.Printf("Redacting flag %s in %s\n", name, flagValue.path) + warnf("Redacting flag %s in %s\n", name, flagValue.path) } else { // If we are assigning a value, then the flag is no longer redacted. fa.Redacted = false 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/cmd/soong_ui/main.go b/cmd/soong_ui/main.go index c119823cd..792629218 100644 --- a/cmd/soong_ui/main.go +++ b/cmd/soong_ui/main.go @@ -197,7 +197,7 @@ func main() { rbeMetricsFile := filepath.Join(logsDir, c.logsPrefix+"rbe_metrics.pb") soongBuildMetricsFile := filepath.Join(logsDir, c.logsPrefix+"soong_build_metrics.pb") buildTraceFile := filepath.Join(logsDir, c.logsPrefix+"build.trace.gz") - executionMetricsFile := filepath.Join(logsDir, c.logsPrefix+"soong_execution_metrics.pb") + executionMetricsFile := filepath.Join(logsDir, c.logsPrefix+"execution_metrics.pb") metricsFiles := []string{ buildErrorFile, // build error strings diff --git a/etc/avbpubkey.go b/etc/avbpubkey.go index 3f998d487..dc242ce38 100644 --- a/etc/avbpubkey.go +++ b/etc/avbpubkey.go @@ -51,6 +51,7 @@ var avbPubKeyRule = pctx.AndroidStaticRule("avbpubkey", Command: `${avbtool} extract_public_key --key ${in} --output ${out}.tmp` + ` && ( if cmp -s ${out}.tmp ${out} ; then rm ${out}.tmp ; else mv ${out}.tmp ${out} ; fi )`, CommandDeps: []string{"${avbtool}"}, + Restat: true, Description: "Extracting system_other avb key", }) diff --git a/etc/prebuilt_etc_test.go b/etc/prebuilt_etc_test.go index 0fd04d85f..70b54629f 100644 --- a/etc/prebuilt_etc_test.go +++ b/etc/prebuilt_etc_test.go @@ -133,8 +133,8 @@ func TestPrebuiltEtcDsts(t *testing.T) { android.AssertStringEquals(t, "output file path", "different.name", p.outputFilePaths[1].Base()) expectedPaths := [...]string{ - "out/soong/target/product/test_device/system/etc/foodir", - "out/soong/target/product/test_device/system/etc/bardir/extradir", + "out/target/product/test_device/system/etc/foodir", + "out/target/product/test_device/system/etc/bardir/extradir", } android.AssertPathRelativeToTopEquals(t, "install dir", expectedPaths[0], p.installDirPaths[0]) android.AssertPathRelativeToTopEquals(t, "install dir", expectedPaths[1], p.installDirPaths[1]) @@ -155,8 +155,8 @@ func TestPrebuiltEtcDstsPlusRelativeInstallPath(t *testing.T) { android.AssertStringEquals(t, "output file path", "different.name", p.outputFilePaths[1].Base()) expectedPaths := [...]string{ - "out/soong/target/product/test_device/system/etc/somewhere/foodir", - "out/soong/target/product/test_device/system/etc/somewhere/bardir/extradir", + "out/target/product/test_device/system/etc/somewhere/foodir", + "out/target/product/test_device/system/etc/somewhere/bardir/extradir", } android.AssertPathRelativeToTopEquals(t, "install dir", expectedPaths[0], p.installDirPaths[0]) android.AssertPathRelativeToTopEquals(t, "install dir", expectedPaths[1], p.installDirPaths[1]) @@ -271,7 +271,7 @@ func TestPrebuiltEtcRelativeInstallPathInstallDirPath(t *testing.T) { `) p := result.Module("foo.conf", "android_arm64_armv8-a").(*PrebuiltEtc) - expected := "out/soong/target/product/test_device/system/etc/bar" + expected := "out/target/product/test_device/system/etc/bar" android.AssertPathRelativeToTopEquals(t, "install dir", expected, p.installDirPaths[0]) } @@ -337,7 +337,7 @@ func TestPrebuiltRootInstallDirPath(t *testing.T) { `) p := result.Module("foo.conf", "android_arm64_armv8-a").(*PrebuiltEtc) - expected := "out/soong/target/product/test_device/system" + expected := "out/target/product/test_device/system" android.AssertPathRelativeToTopEquals(t, "install dir", expected, p.installDirPaths[0]) } @@ -362,7 +362,7 @@ func TestPrebuiltAvbInstallDirPath(t *testing.T) { `) p := result.Module("foo.conf", "android_arm64_armv8-a").(*PrebuiltEtc) - expected := "out/soong/target/product/test_device/root/avb" + expected := "out/target/product/test_device/root/avb" android.AssertPathRelativeToTopEquals(t, "install dir", expected, p.installDirPaths[0]) } @@ -386,7 +386,7 @@ func TestPrebuiltUserShareInstallDirPath(t *testing.T) { `) p := result.Module("foo.conf", "android_arm64_armv8-a").(*PrebuiltEtc) - expected := "out/soong/target/product/test_device/system/usr/share/bar" + expected := "out/target/product/test_device/system/usr/share/bar" android.AssertPathRelativeToTopEquals(t, "install dir", expected, p.installDirPaths[0]) } @@ -401,7 +401,7 @@ func TestPrebuiltUserShareHostInstallDirPath(t *testing.T) { buildOS := result.Config.BuildOS.String() p := result.Module("foo.conf", buildOS+"_common").(*PrebuiltEtc) - expected := filepath.Join("out/soong/host", result.Config.PrebuiltOS(), "usr", "share", "bar") + expected := filepath.Join("out/host", result.Config.PrebuiltOS(), "usr", "share", "bar") android.AssertPathRelativeToTopEquals(t, "install dir", expected, p.installDirPaths[0]) } @@ -415,7 +415,7 @@ func TestPrebuiltPrebuiltUserHyphenDataInstallDirPath(t *testing.T) { `) p := result.Module("foo.conf", "android_arm64_armv8-a").(*PrebuiltEtc) - expected := "out/soong/target/product/test_device/system/usr/hyphen-data/bar" + expected := "out/target/product/test_device/system/usr/hyphen-data/bar" android.AssertPathRelativeToTopEquals(t, "install dir", expected, p.installDirPaths[0]) } @@ -429,7 +429,7 @@ func TestPrebuiltPrebuiltUserKeyLayoutInstallDirPath(t *testing.T) { `) p := result.Module("foo.conf", "android_arm64_armv8-a").(*PrebuiltEtc) - expected := "out/soong/target/product/test_device/system/usr/keylayout/bar" + expected := "out/target/product/test_device/system/usr/keylayout/bar" android.AssertPathRelativeToTopEquals(t, "install dir", expected, p.installDirPaths[0]) } @@ -443,7 +443,7 @@ func TestPrebuiltPrebuiltUserKeyCharsInstallDirPath(t *testing.T) { `) p := result.Module("foo.conf", "android_arm64_armv8-a").(*PrebuiltEtc) - expected := "out/soong/target/product/test_device/system/usr/keychars/bar" + expected := "out/target/product/test_device/system/usr/keychars/bar" android.AssertPathRelativeToTopEquals(t, "install dir", expected, p.installDirPaths[0]) } @@ -457,7 +457,7 @@ func TestPrebuiltPrebuiltUserIdcInstallDirPath(t *testing.T) { `) p := result.Module("foo.conf", "android_arm64_armv8-a").(*PrebuiltEtc) - expected := "out/soong/target/product/test_device/system/usr/idc/bar" + expected := "out/target/product/test_device/system/usr/idc/bar" android.AssertPathRelativeToTopEquals(t, "install dir", expected, p.installDirPaths[0]) } @@ -470,7 +470,7 @@ func TestPrebuiltFontInstallDirPath(t *testing.T) { `) p := result.Module("foo.conf", "android_common").(*PrebuiltEtc) - expected := "out/soong/target/product/test_device/system/fonts" + expected := "out/target/product/test_device/system/fonts" android.AssertPathRelativeToTopEquals(t, "install dir", expected, p.installDirPaths[0]) } @@ -483,12 +483,12 @@ func TestPrebuiltOverlayInstallDirPath(t *testing.T) { `) p := result.Module("foo.conf", "android_arm64_armv8-a").(*PrebuiltEtc) - expected := "out/soong/target/product/test_device/system/overlay" + expected := "out/target/product/test_device/system/overlay" android.AssertPathRelativeToTopEquals(t, "install dir", expected, p.installDirPaths[0]) } func TestPrebuiltFirmwareDirPath(t *testing.T) { - targetPath := "out/soong/target/product/test_device" + targetPath := "out/target/product/test_device" tests := []struct { description string config string @@ -522,7 +522,7 @@ func TestPrebuiltFirmwareDirPath(t *testing.T) { } func TestPrebuiltDSPDirPath(t *testing.T) { - targetPath := "out/soong/target/product/test_device" + targetPath := "out/target/product/test_device" tests := []struct { description string config string @@ -556,7 +556,7 @@ func TestPrebuiltDSPDirPath(t *testing.T) { } func TestPrebuiltRFSADirPath(t *testing.T) { - targetPath := "out/soong/target/product/test_device" + targetPath := "out/target/product/test_device" tests := []struct { description string config string @@ -600,6 +600,6 @@ func TestPrebuiltMediaAutoDirPath(t *testing.T) { `) p := result.Module("foo", "android_common").(*PrebuiltEtc) - expected := "out/soong/target/product/test_device/product/media/alarms" + expected := "out/target/product/test_device/product/media/alarms" android.AssertPathRelativeToTopEquals(t, "install dir", expected, p.installDirPaths[0]) } diff --git a/filesystem/aconfig_files.go b/filesystem/aconfig_files.go index c80ae03d7..9a3ca5408 100644 --- a/filesystem/aconfig_files.go +++ b/filesystem/aconfig_files.go @@ -16,27 +16,57 @@ package filesystem import ( "android/soong/android" + "strconv" + "github.com/google/blueprint" "github.com/google/blueprint/proptools" ) -func (f *filesystem) buildAconfigFlagsFiles(ctx android.ModuleContext, builder *android.RuleBuilder, specs map[string]android.PackagingSpec, dir android.OutputPath) { - if !proptools.Bool(f.properties.Gen_aconfig_flags_pb) { - return - } +type installedAconfigFlagsInfo struct { + aconfigFiles android.Paths +} +var installedAconfigFlagsProvider = blueprint.NewProvider[installedAconfigFlagsInfo]() + +type importAconfigDepDag struct { + blueprint.BaseDependencyTag +} + +var importAconfigDependencyTag = interPartitionDepTag{} + +func (f *filesystem) buildAconfigFlagsFiles(ctx android.ModuleContext, builder *android.RuleBuilder, specs map[string]android.PackagingSpec, dir android.OutputPath) { var caches []android.Path for _, ps := range specs { caches = append(caches, ps.GetAconfigPaths()...) } + + ctx.VisitDirectDepsWithTag(importAconfigDependencyTag, func(m android.Module) { + info, ok := android.OtherModuleProvider(ctx, m, installedAconfigFlagsProvider) + if !ok { + ctx.ModuleErrorf("expected dependency %s to have an installedAconfigFlagsProvider", m.Name()) + return + } + caches = append(caches, info.aconfigFiles...) + }) caches = android.SortedUniquePaths(caches) + android.SetProvider(ctx, installedAconfigFlagsProvider, installedAconfigFlagsInfo{ + aconfigFiles: caches, + }) + + if !proptools.Bool(f.properties.Gen_aconfig_flags_pb) { + return + } + + container := f.PartitionType() + installAconfigFlagsPath := dir.Join(ctx, "etc", "aconfig_flags.pb") cmd := builder.Command(). BuiltTool("aconfig"). Text(" dump-cache --dedup --format protobuf --out"). Output(installAconfigFlagsPath). - Textf("--filter container:%s", f.PartitionType()) + Textf("--filter container:%s+state:ENABLED", container). + Textf("--filter container:%s+permission:READ_WRITE", container) for _, cache := range caches { cmd.FlagWithInput("--cache ", cache) } @@ -45,14 +75,21 @@ func (f *filesystem) buildAconfigFlagsFiles(ctx android.ModuleContext, builder * installAconfigStorageDir := dir.Join(ctx, "etc", "aconfig") builder.Command().Text("mkdir -p").Text(installAconfigStorageDir.String()) + // To enable fingerprint, we need to have v2 storage files. The default version is 1. + storageFilesVersion := 1 + if ctx.Config().ReleaseFingerprintAconfigPackages() { + storageFilesVersion = 2 + } + generatePartitionAconfigStorageFile := func(fileType, fileName string) { outputPath := installAconfigStorageDir.Join(ctx, fileName) builder.Command(). BuiltTool("aconfig"). - FlagWithArg("create-storage --container ", f.PartitionType()). + FlagWithArg("create-storage --container ", container). FlagWithArg("--file ", fileType). FlagWithOutput("--out ", outputPath). - FlagWithArg("--cache ", installAconfigFlagsPath.String()) + FlagWithArg("--cache ", installAconfigFlagsPath.String()). + FlagWithArg("--version ", strconv.Itoa(storageFilesVersion)) f.appendToEntry(ctx, outputPath) } 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..2244aff57 100644 --- a/filesystem/filesystem.go +++ b/filesystem/filesystem.go @@ -121,6 +121,9 @@ type FilesystemProperties struct { // avbtool. Default used by avbtool is sha1. Avb_hash_algorithm *string + // The security patch passed to as the com.android.build.<type>.security_patch avb property. + Security_patch *string + // Whether or not to use forward-error-correction codes when signing with AVB. Defaults to true. Use_fec *bool @@ -178,6 +181,11 @@ type FilesystemProperties struct { // Install aconfig_flags.pb file for the modules installed in this partition. Gen_aconfig_flags_pb *bool + // List of names of other filesystem partitions to import their aconfig flags from. + // This is used for the system partition to import system_ext's aconfig flags, as currently + // those are considered one "container": aosp/3261300 + Import_aconfig_flags_from []string + Fsverity fsverityProperties // If this property is set to true, the filesystem will call ctx.UncheckedModule(), causing @@ -306,6 +314,9 @@ func (f *filesystem) DepsMutator(ctx android.BottomUpMutatorContext) { if f.properties.Android_filesystem_deps.System_ext != nil { ctx.AddDependency(ctx.Module(), interPartitionDependencyTag, proptools.String(f.properties.Android_filesystem_deps.System_ext)) } + for _, partition := range f.properties.Import_aconfig_flags_from { + ctx.AddDependency(ctx.Module(), importAconfigDependencyTag, partition) + } } type fsType int @@ -465,7 +476,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 { @@ -526,6 +537,12 @@ func (f *filesystem) buildNonDepsFiles(ctx android.ModuleContext, builder *andro builder.Command().Text("ln -sf").Text(proptools.ShellEscape(target)).Text(dst.String()) f.appendToEntry(ctx, dst) } + + // https://cs.android.com/android/platform/superproject/main/+/main:build/make/core/Makefile;l=2835;drc=b186569ef00ff2f2a1fab28aedc75ebc32bcd67b + if f.partitionName() == "recovery" { + builder.Command().Text("mkdir -p").Text(rootDir.Join(ctx, "root/linkerconfig").String()) + builder.Command().Text("touch").Text(rootDir.Join(ctx, "root/linkerconfig/ld.config.txt").String()) + } } func (f *filesystem) copyPackagingSpecs(ctx android.ModuleContext, builder *android.RuleBuilder, specs map[string]android.PackagingSpec, rootDir, rebasedDir android.WritablePath) []string { @@ -555,8 +572,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) @@ -599,6 +620,7 @@ func (f *filesystem) buildImageUsingBuildImage(ctx android.ModuleContext) androi Input(propFile). Implicits(toolDeps). Implicit(fec). + FlagWithArg("--build_datetime_file ", ctx.Config().Getenv("BUILD_DATETIME_FILE")). Output(output). Text(rootDir.String()) // directory where to find fs_config_files|dirs @@ -618,11 +640,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 @@ -685,10 +702,14 @@ func (f *filesystem) buildPropFile(ctx android.ModuleContext) (android.Path, and avb_add_hashtree_footer_args += " --rollback_index " + strconv.Itoa(rollbackIndex) } avb_add_hashtree_footer_args += fmt.Sprintf(" --prop com.android.build.%s.os_version:%s", f.partitionName(), ctx.Config().PlatformVersionLastStable()) + // We're not going to add BuildFingerPrintFile as a dep. If it changed, it's likely because + // the build number changed, and we don't want to trigger rebuilds solely based on the build + // number. 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()) + if f.properties.Security_patch != nil && proptools.String(f.properties.Security_patch) != "" { + avb_add_hashtree_footer_args += fmt.Sprintf(" --prop com.android.build.%s.security_patch:%s", f.partitionName(), proptools.String(f.properties.Security_patch)) + } 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 { @@ -741,10 +762,9 @@ func (f *filesystem) buildPropFile(ctx android.ModuleContext) (android.Path, and android.WriteFileRuleVerbatim(ctx, propFilePreProcessing, propFileString.String()) propFile := android.PathForModuleOut(ctx, "prop") ctx.Build(pctx, android.BuildParams{ - Rule: textFileProcessorRule, - Input: propFilePreProcessing, - Output: propFile, - Implicit: ctx.Config().BuildFingerprintFile(ctx), + Rule: textFileProcessorRule, + Input: propFilePreProcessing, + Output: propFile, }) return propFile, deps } @@ -783,7 +803,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 +888,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) } @@ -901,8 +902,10 @@ func (f *filesystem) BuildLinkerConfigFile(ctx android.ModuleContext, builder *a } provideModules, _ := f.getLibsForLinkerConfig(ctx) + intermediateOutput := android.PathForModuleOut(ctx, "linker.config.pb") + linkerconfig.BuildLinkerConfig(ctx, android.PathsForModuleSrc(ctx, f.properties.Linker_config.Linker_config_srcs), provideModules, nil, intermediateOutput) output := rebasedDir.Join(ctx, "etc", "linker.config.pb") - linkerconfig.BuildLinkerConfig(ctx, builder, android.PathsForModuleSrc(ctx, f.properties.Linker_config.Linker_config_srcs), provideModules, nil, output) + builder.Command().Text("cp").Input(intermediateOutput).Output(output) f.appendToEntry(ctx, output) } @@ -1092,6 +1095,12 @@ func addAutogeneratedRroDeps(ctx android.BottomUpMutatorContext) { } thisPartition := f.PartitionType() if thisPartition != "vendor" && thisPartition != "product" { + if f.properties.Android_filesystem_deps.System != nil { + ctx.PropertyErrorf("android_filesystem_deps.system", "only vendor or product partitions can use android_filesystem_deps") + } + if f.properties.Android_filesystem_deps.System_ext != nil { + ctx.PropertyErrorf("android_filesystem_deps.system_ext", "only vendor or product partitions can use android_filesystem_deps") + } return } ctx.WalkDeps(func(child, parent android.Module) bool { diff --git a/filesystem/filesystem_test.go b/filesystem/filesystem_test.go index 0ed3870a6..33cddf87d 100644 --- a/filesystem/filesystem_test.go +++ b/filesystem/filesystem_test.go @@ -16,7 +16,6 @@ package filesystem import ( "os" - "strings" "testing" "android/soong/android" @@ -181,11 +180,9 @@ 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/linker.config.pb") - fullCommand := output.RuleParams.Command - startIndex := strings.Index(fullCommand, "conv_linker_config") - linkerConfigCommand := fullCommand[startIndex:] + linkerConfigCommand := output.RuleParams.Command android.AssertStringDoesContain(t, "linker.config.pb should have libfoo", linkerConfigCommand, "libfoo.so") @@ -735,7 +732,7 @@ cc_library { } `) - linkerConfigCmd := result.ModuleForTests("myfilesystem", "android_common").Rule("build_filesystem_image").RuleParams.Command + linkerConfigCmd := result.ModuleForTests("myfilesystem", "android_common").Output("out/soong/.intermediates/myfilesystem/android_common/linker.config.pb").RuleParams.Command android.AssertStringDoesContain(t, "Could not find linker.config.json file in cmd", linkerConfigCmd, "conv_linker_config proto --force -s linker.config.json") android.AssertStringDoesContain(t, "Could not find stub in `provideLibs`", linkerConfigCmd, "--key provideLibs --value libfoo_has_stubs.so") } 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/filesystem/system_image.go b/filesystem/system_image.go index 60a513346..874d20d80 100644 --- a/filesystem/system_image.go +++ b/filesystem/system_image.go @@ -16,6 +16,7 @@ package filesystem import ( "android/soong/android" + "android/soong/cc" "android/soong/linkerconfig" "strings" @@ -48,9 +49,45 @@ func (s *systemImage) BuildLinkerConfigFile(ctx android.ModuleContext, builder * return } - provideModules, requireModules := s.getLibsForLinkerConfig(ctx) output := rebasedDir.Join(ctx, "etc", "linker.config.pb") - linkerconfig.BuildLinkerConfig(ctx, builder, android.PathsForModuleSrc(ctx, s.filesystem.properties.Linker_config.Linker_config_srcs), provideModules, requireModules, output) + if s.filesystem.properties.Linker_config.Linker_config_srcs != nil { + provideModules, requireModules := s.getLibsForLinkerConfig(ctx) + intermediateOutput := android.PathForModuleOut(ctx, "linker.config.pb") + linkerconfig.BuildLinkerConfig(ctx, android.PathsForModuleSrc(ctx, s.filesystem.properties.Linker_config.Linker_config_srcs), provideModules, requireModules, intermediateOutput) + builder.Command().Text("cp").Input(intermediateOutput).Output(output) + } else { + // TODO: This branch is the logic that make uses for the linker config file, which is + // different than linkerconfig.BuildLinkerConfig used above. Keeping both branches for now + // because microdroid uses the other method and is in theory happy with it. But we should + // consider deduping them. + stubLibraries := cc.StubLibrariesFile(ctx) + llndkMovedToApexLibraries := cc.MovedToApexLlndkLibrariesFile(ctx) + outputStep1 := android.PathForModuleOut(ctx, "linker.config.pb.step1") + builder.Command(). + BuiltTool("conv_linker_config"). + Text("proto --force"). + FlagWithInput("-s ", android.PathForSource(ctx, "system/core/rootdir/etc/linker.config.json")). + FlagWithOutput("-o ", outputStep1) + builder.Temporary(outputStep1) + builder.Command(). + BuiltTool("conv_linker_config"). + Text("systemprovide"). + FlagWithInput("--source ", outputStep1). + FlagWithArg("--output ", output.String()). + Textf(`--value "$(cat %s)"`, stubLibraries). + Implicit(stubLibraries). + FlagWithArg("--system ", rebasedDir.String()) + builder.Command(). + BuiltTool("conv_linker_config"). + Text("append"). + FlagWithArg("--source ", output.String()). + FlagWithOutput("--output ", output). + FlagWithArg("--key ", "requireLibs"). + Textf(`--value "$(cat %s)"`, llndkMovedToApexLibraries). + Implicit(llndkMovedToApexLibraries) + // TODO: Make also supports adding an extra append command with PRODUCT_EXTRA_STUB_LIBRARIES, + // but that variable appears to have no usages. + } s.appendToEntry(ctx, output) } diff --git a/fsgen/config.go b/fsgen/config.go index 31f721b45..a2176009c 100644 --- a/fsgen/config.go +++ b/fsgen/config.go @@ -110,7 +110,6 @@ var ( // filesystem module. commonPartitionDirs = []string{ // From generic_rootdirs in build/make/target/product/generic/Android.bp - "acct", "apex", "bootstrap-apex", "config", diff --git a/fsgen/filesystem_creator.go b/fsgen/filesystem_creator.go index b9fddcab5..59470d3fc 100644 --- a/fsgen/filesystem_creator.go +++ b/fsgen/filesystem_creator.go @@ -266,6 +266,11 @@ func partitionSpecificFsProps(ctx android.EarlyModuleContext, fsProps *filesyste ) fsProps.Base_dir = proptools.StringPtr("system") fsProps.Dirs = proptools.NewSimpleConfigurable(commonPartitionDirs) + fsProps.Security_patch = proptools.StringPtr(ctx.Config().PlatformSecurityPatch()) + + if ctx.DeviceConfig().SystemExtPath() == "system_ext" { + fsProps.Import_aconfig_flags_from = []string{generatedModuleNameForPartition(ctx.Config(), "system_ext")} + } case "system_ext": if partitionVars.ProductFsverityGenerateMetadata { fsProps.Fsverity.Inputs = []string{ @@ -275,12 +280,14 @@ func partitionSpecificFsProps(ctx android.EarlyModuleContext, fsProps *filesyste } fsProps.Fsverity.Libs = []string{":framework-res{.export-package.apk}"} } + fsProps.Security_patch = proptools.StringPtr(ctx.Config().PlatformSecurityPatch()) case "product": fsProps.Gen_aconfig_flags_pb = proptools.BoolPtr(true) fsProps.Android_filesystem_deps.System = proptools.StringPtr(generatedModuleNameForPartition(ctx.Config(), "system")) if ctx.DeviceConfig().SystemExtPath() == "system_ext" { fsProps.Android_filesystem_deps.System_ext = proptools.StringPtr(generatedModuleNameForPartition(ctx.Config(), "system_ext")) } + fsProps.Security_patch = proptools.StringPtr(ctx.Config().PlatformSecurityPatch()) case "vendor": fsProps.Gen_aconfig_flags_pb = proptools.BoolPtr(true) fsProps.Symlinks = []filesystem.SymlinkDefinition{ @@ -297,6 +304,7 @@ func partitionSpecificFsProps(ctx android.EarlyModuleContext, fsProps *filesyste if ctx.DeviceConfig().SystemExtPath() == "system_ext" { fsProps.Android_filesystem_deps.System_ext = proptools.StringPtr(generatedModuleNameForPartition(ctx.Config(), "system_ext")) } + fsProps.Security_patch = proptools.StringPtr(partitionVars.VendorSecurityPatch) case "odm": fsProps.Symlinks = []filesystem.SymlinkDefinition{ filesystem.SymlinkDefinition{ @@ -304,6 +312,7 @@ func partitionSpecificFsProps(ctx android.EarlyModuleContext, fsProps *filesyste Name: proptools.StringPtr("lib/modules"), }, } + fsProps.Security_patch = proptools.StringPtr(partitionVars.OdmSecurityPatch) case "userdata": fsProps.Base_dir = proptools.StringPtr("data") case "ramdisk": @@ -358,6 +367,12 @@ func partitionSpecificFsProps(ctx android.EarlyModuleContext, fsProps *filesyste Target: proptools.StringPtr("prop.default"), Name: proptools.StringPtr("default.prop"), }), "root") + case "system_dlkm": + fsProps.Security_patch = proptools.StringPtr(partitionVars.SystemDlkmSecurityPatch) + case "vendor_dlkm": + fsProps.Security_patch = proptools.StringPtr(partitionVars.VendorDlkmSecurityPatch) + case "odm_dlkm": + fsProps.Security_patch = proptools.StringPtr(partitionVars.OdmDlkmSecurityPatch) } } @@ -562,9 +577,11 @@ func (f *filesystemCreator) createVendorBuildProp(ctx android.LoadHookContext) { Name *string Board_info_files []string Bootloader_board_name *string + Stem *string }{ - Name: proptools.StringPtr(generatedModuleName(ctx.Config(), "android-info.prop")), + Name: proptools.StringPtr(generatedModuleName(ctx.Config(), "android_info.prop")), Board_info_files: partitionVars.BoardInfoFiles, + Stem: proptools.StringPtr("android_info.txt"), } if len(androidInfoProps.Board_info_files) == 0 { androidInfoProps.Bootloader_board_name = proptools.StringPtr(partitionVars.BootLoaderBoardName) @@ -582,12 +599,14 @@ func (f *filesystemCreator) createVendorBuildProp(ctx android.LoadHookContext) { Stem *string Product_config *string Android_info *string + Licenses []string }{ Name: proptools.StringPtr(generatedModuleName(ctx.Config(), "vendor-build.prop")), Vendor: proptools.BoolPtr(true), Stem: proptools.StringPtr("build.prop"), Product_config: proptools.StringPtr(":product_config"), Android_info: proptools.StringPtr(":" + androidInfoProp.Name()), + Licenses: []string{"Android-Apache-2.0"}, } vendorBuildProp := ctx.CreateModule( android.BuildPropFactory, @@ -596,6 +615,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) @@ -709,6 +765,9 @@ func generateFsProps(ctx android.EarlyModuleContext, partitionType string) (*fil } fsProps.Is_auto_generated = proptools.BoolPtr(true) + if partitionType != "system" { + fsProps.Mount_point = proptools.StringPtr(partitionType) + } partitionSpecificFsProps(ctx, fsProps, partitionVars, partitionType) 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/genrule/genrule.go b/genrule/genrule.go index ac62b8d06..6137c707a 100644 --- a/genrule/genrule.go +++ b/genrule/genrule.go @@ -455,7 +455,6 @@ func (g *Module) generateCommonBuildActions(ctx android.ModuleContext) { srcFiles = append(srcFiles, addLabelsForInputs("device_first_srcs", g.properties.Device_first_srcs.GetOrDefault(ctx, nil), nil)...) srcFiles = append(srcFiles, addLabelsForInputs("device_common_srcs", g.properties.Device_common_srcs.GetOrDefault(ctx, nil), nil)...) srcFiles = append(srcFiles, addLabelsForInputs("common_os_srcs", g.properties.Common_os_srcs.GetOrDefault(ctx, nil), nil)...) - android.SetProvider(ctx, blueprint.SrcsFileProviderKey, blueprint.SrcsFileProviderData{SrcPaths: srcFiles.Strings()}) var copyFrom android.Paths var outputFiles android.WritablePaths diff --git a/genrule/genrule_test.go b/genrule/genrule_test.go index f190750d1..688db0761 100644 --- a/genrule/genrule_test.go +++ b/genrule/genrule_test.go @@ -24,7 +24,6 @@ import ( "android/soong/android" - "github.com/google/blueprint" "github.com/google/blueprint/proptools" ) @@ -694,13 +693,6 @@ func TestGenruleDefaults(t *testing.T) { expectedCmd := "cp in1 __SBOX_SANDBOX_DIR__/out/out" android.AssertStringEquals(t, "cmd", expectedCmd, gen.rawCommands[0]) - - srcsFileProvider, ok := android.OtherModuleProvider(result.TestContext, gen, blueprint.SrcsFileProviderKey) - if !ok { - t.Fatal("Expected genrule to have a SrcsFileProviderData, but did not") - } - expectedSrcs := []string{"in1"} - android.AssertDeepEquals(t, "srcs", expectedSrcs, srcsFileProvider.SrcPaths) } func TestGenruleAllowMissingDependencies(t *testing.T) { diff --git a/java/aar.go b/java/aar.go index d9a8c0e36..c09ed9ea2 100644 --- a/java/aar.go +++ b/java/aar.go @@ -1046,6 +1046,8 @@ func (a *AndroidLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) AconfigTextFiles: aconfigTextFilePaths, }) + android.SetProvider(ctx, AndroidLibraryInfoProvider, AndroidLibraryInfo{}) + a.setOutputFiles(ctx) } @@ -1574,6 +1576,8 @@ func (a *AARImport) GenerateAndroidBuildActions(ctx android.ModuleContext) { JniPackages: a.jniPackages, }) + android.SetProvider(ctx, AndroidLibraryInfoProvider, AndroidLibraryInfo{}) + ctx.SetOutputFiles([]android.Path{a.implementationAndResourcesJarFile}, "") ctx.SetOutputFiles([]android.Path{a.aarPath}, ".aar") } diff --git a/java/app.go b/java/app.go index b8c85fb62..b0dcbb003 100644 --- a/java/app.go +++ b/java/app.go @@ -52,6 +52,12 @@ type FlagsPackages struct { var FlagsPackagesProvider = blueprint.NewProvider[FlagsPackages]() +type AndroidLibraryInfo struct { + // Empty for now +} + +var AndroidLibraryInfoProvider = blueprint.NewProvider[AndroidLibraryInfo]() + func RegisterAppBuildComponents(ctx android.RegistrationContext) { ctx.RegisterModuleType("android_app", AndroidAppFactory) ctx.RegisterModuleType("android_test", AndroidTestFactory) @@ -424,6 +430,8 @@ func (a *AndroidApp) GenerateAndroidBuildActions(ctx android.ModuleContext) { EmbeddedJNILibs: embeddedJniLibs, }) + android.SetProvider(ctx, AndroidLibraryInfoProvider, AndroidLibraryInfo{}) + a.requiredModuleNames = a.getRequiredModuleNames(ctx) } diff --git a/java/app_import_test.go b/java/app_import_test.go index 54a5e7518..ef8f60a7e 100644 --- a/java/app_import_test.go +++ b/java/app_import_test.go @@ -664,17 +664,17 @@ func TestAndroidAppImport_relativeInstallPath(t *testing.T) { }{ { name: "no_relative_install_path", - expectedInstallPath: "out/soong/target/product/test_device/system/app/no_relative_install_path/no_relative_install_path.apk", + expectedInstallPath: "out/target/product/test_device/system/app/no_relative_install_path/no_relative_install_path.apk", errorMessage: "Install path is not correct when relative_install_path is missing", }, { name: "relative_install_path", - expectedInstallPath: "out/soong/target/product/test_device/system/app/my/path/relative_install_path/relative_install_path.apk", + expectedInstallPath: "out/target/product/test_device/system/app/my/path/relative_install_path/relative_install_path.apk", errorMessage: "Install path is not correct for app when relative_install_path is present", }, { name: "privileged_relative_install_path", - expectedInstallPath: "out/soong/target/product/test_device/system/priv-app/my/path/privileged_relative_install_path/privileged_relative_install_path.apk", + expectedInstallPath: "out/target/product/test_device/system/priv-app/my/path/privileged_relative_install_path/privileged_relative_install_path.apk", errorMessage: "Install path is not correct for privileged app when relative_install_path is present", }, } diff --git a/java/app_test.go b/java/app_test.go index 11556b05c..4e915d2e9 100644 --- a/java/app_test.go +++ b/java/app_test.go @@ -2476,7 +2476,7 @@ func TestPackageNameOverride(t *testing.T) { packageNameOverride: "", expected: []string{ "out/soong/.intermediates/foo/android_common/foo.apk", - "out/soong/target/product/test_device/system/app/foo/foo.apk", + "out/target/product/test_device/system/app/foo/foo.apk", }, }, { @@ -2492,7 +2492,7 @@ func TestPackageNameOverride(t *testing.T) { expected: []string{ // The package apk should be still be the original name for test dependencies. "out/soong/.intermediates/foo/android_common/bar.apk", - "out/soong/target/product/test_device/system/app/bar/bar.apk", + "out/target/product/test_device/system/app/bar/bar.apk", }, }, { @@ -2508,7 +2508,7 @@ func TestPackageNameOverride(t *testing.T) { packageNameOverride: "", expected: []string{ "out/soong/.intermediates/foo/android_common/bar.apk", - "out/soong/target/product/test_device/system/app/bar/bar.apk", + "out/target/product/test_device/system/app/bar/bar.apk", }, }, } @@ -2651,7 +2651,7 @@ func TestOverrideAndroidApp(t *testing.T) { name: "foo", moduleName: "foo", variantName: "android_common", - apkPath: "out/soong/target/product/test_device/system/app/foo/foo.apk", + apkPath: "out/target/product/test_device/system/app/foo/foo.apk", certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8", certSigningFlags: "", overrides: []string{"qux"}, @@ -2663,7 +2663,7 @@ func TestOverrideAndroidApp(t *testing.T) { name: "foo", moduleName: "bar", variantName: "android_common_bar", - apkPath: "out/soong/target/product/test_device/system/app/bar/bar.apk", + apkPath: "out/target/product/test_device/system/app/bar/bar.apk", certFlag: "cert/new_cert.x509.pem cert/new_cert.pk8", certSigningFlags: "--lineage lineage.bin --rotation-min-sdk-version 32", overrides: []string{"qux", "foo"}, @@ -2675,7 +2675,7 @@ func TestOverrideAndroidApp(t *testing.T) { name: "foo", moduleName: "baz", variantName: "android_common_baz", - apkPath: "out/soong/target/product/test_device/system/app/baz/baz.apk", + apkPath: "out/target/product/test_device/system/app/baz/baz.apk", certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8", certSigningFlags: "", overrides: []string{"qux", "foo"}, @@ -2687,7 +2687,7 @@ func TestOverrideAndroidApp(t *testing.T) { name: "foo", moduleName: "baz_no_rename_resources", variantName: "android_common_baz_no_rename_resources", - apkPath: "out/soong/target/product/test_device/system/app/baz_no_rename_resources/baz_no_rename_resources.apk", + apkPath: "out/target/product/test_device/system/app/baz_no_rename_resources/baz_no_rename_resources.apk", certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8", certSigningFlags: "", overrides: []string{"qux", "foo"}, @@ -2699,7 +2699,7 @@ func TestOverrideAndroidApp(t *testing.T) { name: "foo_no_rename_resources", moduleName: "baz_base_no_rename_resources", variantName: "android_common_baz_base_no_rename_resources", - apkPath: "out/soong/target/product/test_device/system/app/baz_base_no_rename_resources/baz_base_no_rename_resources.apk", + apkPath: "out/target/product/test_device/system/app/baz_base_no_rename_resources/baz_base_no_rename_resources.apk", certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8", certSigningFlags: "", overrides: []string{"qux", "foo_no_rename_resources"}, @@ -2711,7 +2711,7 @@ func TestOverrideAndroidApp(t *testing.T) { name: "foo_no_rename_resources", moduleName: "baz_override_base_rename_resources", variantName: "android_common_baz_override_base_rename_resources", - apkPath: "out/soong/target/product/test_device/system/app/baz_override_base_rename_resources/baz_override_base_rename_resources.apk", + apkPath: "out/target/product/test_device/system/app/baz_override_base_rename_resources/baz_override_base_rename_resources.apk", certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8", certSigningFlags: "", overrides: []string{"qux", "foo_no_rename_resources"}, @@ -2888,33 +2888,33 @@ func TestOverrideAndroidAppStem(t *testing.T) { { moduleName: "foo", variantName: "android_common", - apkPath: "out/soong/target/product/test_device/system/app/foo/foo.apk", + apkPath: "out/target/product/test_device/system/app/foo/foo.apk", }, { moduleName: "foo", variantName: "android_common_bar", - apkPath: "out/soong/target/product/test_device/system/app/bar/bar.apk", + apkPath: "out/target/product/test_device/system/app/bar/bar.apk", }, { moduleName: "foo", variantName: "android_common_baz", - apkPath: "out/soong/target/product/test_device/system/app/baz_stem/baz_stem.apk", + apkPath: "out/target/product/test_device/system/app/baz_stem/baz_stem.apk", }, { moduleName: "foo2", variantName: "android_common", - apkPath: "out/soong/target/product/test_device/system/app/foo2_stem/foo2_stem.apk", + apkPath: "out/target/product/test_device/system/app/foo2_stem/foo2_stem.apk", }, { moduleName: "foo2", variantName: "android_common_bar2", // Note that this may cause the duplicate output error. - apkPath: "out/soong/target/product/test_device/system/app/foo2_stem/foo2_stem.apk", + apkPath: "out/target/product/test_device/system/app/foo2_stem/foo2_stem.apk", }, { moduleName: "foo2", variantName: "android_common_baz2", - apkPath: "out/soong/target/product/test_device/system/app/baz2_stem/baz2_stem.apk", + apkPath: "out/target/product/test_device/system/app/baz2_stem/baz2_stem.apk", }, } { variant := ctx.ModuleForTests(expected.moduleName, expected.variantName) @@ -3024,7 +3024,7 @@ func TestOverrideAndroidTest(t *testing.T) { variant := ctx.ModuleForTests("foo_test", expected.variantName) // Check the final apk name - variant.Output("out/soong" + expected.apkPath) + variant.Output("out" + expected.apkPath) // Check if the overrides field values are correctly aggregated. mod := variant.Module().(*AndroidTest) @@ -4305,8 +4305,8 @@ func TestPrivappAllowlist(t *testing.T) { } // verify that permissions are copied to device - app.Output("out/soong/target/product/test_device/system/etc/permissions/foo.xml") - overrideApp.Output("out/soong/target/product/test_device/system/etc/permissions/bar.xml") + app.Output("out/target/product/test_device/system/etc/permissions/foo.xml") + overrideApp.Output("out/target/product/test_device/system/etc/permissions/bar.xml") } func TestPrivappAllowlistAndroidMk(t *testing.T) { diff --git a/java/base.go b/java/base.go index 215285fdb..5c1ef8585 100644 --- a/java/base.go +++ b/java/base.go @@ -109,6 +109,10 @@ type CommonProperties struct { // if not blank, used as prefix to generate repackage rule Jarjar_prefix *string + // Number of shards for jarjar. It needs to be an integer represented as a string. + // TODO(b/383559945) change it to int, once Configurable supports the type. + Jarjar_shards proptools.Configurable[string] + // If not blank, set the java version passed to javac as -source and -target Java_version *string @@ -1237,7 +1241,6 @@ func (j *Module) compile(ctx android.ModuleContext, extraSrcJars, extraClasspath uniqueSrcFiles = append(uniqueSrcFiles, uniqueJavaFiles...) uniqueSrcFiles = append(uniqueSrcFiles, uniqueKtFiles...) j.uniqueSrcFiles = uniqueSrcFiles - android.SetProvider(ctx, blueprint.SrcsFileProviderKey, blueprint.SrcsFileProviderData{SrcPaths: uniqueSrcFiles.Strings()}) // We don't currently run annotation processors in turbine, which means we can't use turbine // generated header jars when an annotation processor that generates API is enabled. One @@ -1273,7 +1276,7 @@ func (j *Module) compile(ctx android.ModuleContext, extraSrcJars, extraClasspath localHeaderJars, combinedHeaderJarFile := j.compileJavaHeader(ctx, uniqueJavaFiles, srcJars, deps, flags, jarName, extraCombinedJars) - combinedHeaderJarFile, jarjared := j.jarjarIfNecessary(ctx, combinedHeaderJarFile, jarName, "turbine") + combinedHeaderJarFile, jarjared := j.jarjarIfNecessary(ctx, combinedHeaderJarFile, jarName, "turbine", false) if jarjared { localHeaderJars = android.Paths{combinedHeaderJarFile} transitiveStaticLibsHeaderJars = nil @@ -1409,7 +1412,7 @@ func (j *Module) compile(ctx android.ModuleContext, extraSrcJars, extraClasspath shardingHeaderJars = localHeaderJars var jarjared bool - j.headerJarFile, jarjared = j.jarjarIfNecessary(ctx, combinedHeaderJarFile, jarName, "turbine") + j.headerJarFile, jarjared = j.jarjarIfNecessary(ctx, combinedHeaderJarFile, jarName, "turbine", false) if jarjared { // jarjar modifies transitive static dependencies, use the combined header jar and drop the transitive // static libs header jars. @@ -1442,20 +1445,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 { @@ -1636,7 +1646,7 @@ func (j *Module) compile(ctx android.ModuleContext, extraSrcJars, extraClasspath } // jarjar implementation jar if necessary - jarjarFile, jarjarred := j.jarjarIfNecessary(ctx, outputFile, jarName, "") + jarjarFile, jarjarred := j.jarjarIfNecessary(ctx, outputFile, jarName, "", true) if jarjarred { localImplementationJars = android.Paths{jarjarFile} completeStaticLibsImplementationJars = depset.New(depset.PREORDER, localImplementationJars, nil) @@ -1645,7 +1655,7 @@ func (j *Module) compile(ctx android.ModuleContext, extraSrcJars, extraClasspath // jarjar resource jar if necessary if combinedResourceJar != nil { - resourceJarJarFile, jarjarred := j.jarjarIfNecessary(ctx, combinedResourceJar, jarName, "resource") + resourceJarJarFile, jarjarred := j.jarjarIfNecessary(ctx, combinedResourceJar, jarName, "resource", false) combinedResourceJar = resourceJarJarFile if jarjarred { localResourceJars = android.Paths{resourceJarJarFile} @@ -2934,12 +2944,23 @@ func (j *Module) repackageFlagsIfNecessary(ctx android.ModuleContext, infile and return repackagedJarjarFile, true } -func (j *Module) jarjarIfNecessary(ctx android.ModuleContext, infile android.Path, jarName, info string) (android.Path, bool) { +func (j *Module) jarjarIfNecessary(ctx android.ModuleContext, infile android.Path, jarName, info string, useShards bool) (android.Path, bool) { if j.expandJarjarRules == nil { return infile, false } jarjarFile := android.PathForModuleOut(ctx, "jarjar", info, jarName) - TransformJarJar(ctx, jarjarFile, infile, j.expandJarjarRules) + + totalShards := 1 + if useShards { + totalShardsStr := j.properties.Jarjar_shards.GetOrDefault(ctx, "1") + ts, err := strconv.Atoi(totalShardsStr) + if err != nil { + ctx.PropertyErrorf("jarjar_shards", "jarjar_shards must be an integer represented as a string") + return infile, false + } + totalShards = ts + } + TransformJarJarWithShards(ctx, jarjarFile, infile, j.expandJarjarRules, totalShards) return jarjarFile, true } diff --git a/java/builder.go b/java/builder.go index 01fbbddf5..88058e09a 100644 --- a/java/builder.go +++ b/java/builder.go @@ -168,7 +168,7 @@ var ( "${config.JavaCmd}", }, Rspfile: "$out.rsp", - RspfileContent: "$in", + RspfileContent: "$in_newline", Restat: true, }, &remoteexec.REParams{Labels: map[string]string{"type": "tool", "name": "turbine"}, @@ -238,12 +238,12 @@ var ( // for newly repackaged classes. Dropping @UnsupportedAppUsage on repackaged classes // avoids adding new hiddenapis after jarjar'ing. " -DremoveAndroidCompatAnnotations=true" + - " -jar ${config.JarjarCmd} process $rulesFile $in $out && " + + " -jar ${config.JarjarCmd} process $rulesFile $in $out $total_shards $shard_index && " + // Turn a missing output file into a ninja error `[ -e ${out} ] || (echo "Missing output file"; exit 1)`, CommandDeps: []string{"${config.JavaCmd}", "${config.JarjarCmd}", "$rulesFile"}, }, - "rulesFile") + "rulesFile", "total_shards", "shard_index") packageCheck = pctx.AndroidStaticRule("packageCheck", blueprint.RuleParams{ @@ -459,7 +459,7 @@ func turbineFlags(ctx android.ModuleContext, flags javaBuilderFlags, dir string, const srcJarArgsLimit = 32 * 1024 if len(srcJarArgs) > srcJarArgsLimit { srcJarRspFile := android.PathForModuleOut(ctx, "turbine", "srcjars.rsp") - android.WriteFileRule(ctx, srcJarRspFile, srcJarArgs) + android.WriteFileRule(ctx, srcJarRspFile, strings.Join(srcJars.Strings(), "\n")) srcJarArgs = "@" + srcJarRspFile.String() implicits = append(implicits, srcJarRspFile) rbeInputs = append(rbeInputs, srcJarRspFile) @@ -491,7 +491,7 @@ func turbineFlags(ctx android.ModuleContext, flags javaBuilderFlags, dir string, const classpathLimit = 32 * 1024 if len(classpathFlags) > classpathLimit { classpathRspFile := android.PathForModuleOut(ctx, dir, "classpath.rsp") - android.WriteFileRule(ctx, classpathRspFile, classpathFlags) + android.WriteFileRule(ctx, classpathRspFile, strings.Join(classpath.Strings(), "\n")) classpathFlags = "@" + classpathRspFile.String() implicits = append(implicits, classpathRspFile) rspFiles = append(rspFiles, classpathRspFile) @@ -750,16 +750,58 @@ func convertImplementationJarToHeaderJar(ctx android.ModuleContext, implementati func TransformJarJar(ctx android.ModuleContext, outputFile android.WritablePath, classesJar android.Path, rulesFile android.Path) { + TransformJarJarWithShards(ctx, outputFile, classesJar, rulesFile, 1) +} + +func TransformJarJarWithShards(ctx android.ModuleContext, outputFile android.WritablePath, + classesJar android.Path, rulesFile android.Path, totalShards int) { + + // If the total number of shards is 1, just run jarjar as-is, with `total_shards` = 1 + // and `shard_index` == 0, which effectively disables sharding + if totalShards == 1 { + ctx.Build(pctx, android.BuildParams{ + Rule: jarjar, + Description: "jarjar", + Output: outputFile, + Input: classesJar, + Implicit: rulesFile, + Args: map[string]string{ + "rulesFile": rulesFile.String(), + "total_shards": "1", + "shard_index": "0", + }, + }) + return + } + + // Otherwise, run multiple jarjar instances and use merge_zips to combine the output. + tempJars := make([]android.Path, 0) + totalStr := strconv.Itoa(totalShards) + for i := 0; i < totalShards; i++ { + iStr := strconv.Itoa(i) + tempOut := android.PathForOutput(ctx, outputFile.String()+"-"+iStr+".jar") + ctx.Build(pctx, android.BuildParams{ + Rule: jarjar, + Description: "jarjar (" + iStr + "/" + totalStr + ")", + Output: tempOut, + Input: classesJar, + Implicit: rulesFile, + Args: map[string]string{ + "rulesFile": rulesFile.String(), + "total_shards": totalStr, + "shard_index": iStr, + }, + }) + tempJars = append(tempJars, tempOut) + } + ctx.Build(pctx, android.BuildParams{ - Rule: jarjar, - Description: "jarjar", + Rule: combineJar, + Description: "merge jarjar shards", Output: outputFile, - Input: classesJar, - Implicit: rulesFile, - Args: map[string]string{ - "rulesFile": rulesFile.String(), - }, + Inputs: tempJars, }) + } func CheckJarPackages(ctx android.ModuleContext, outputFile android.WritablePath, diff --git a/java/config/config.go b/java/config/config.go index 7c29722a2..19d695291 100644 --- a/java/config/config.go +++ b/java/config/config.go @@ -42,6 +42,9 @@ var ( InstrumentFrameworkModules = []string{ "framework", "framework-minus-apex", + // TODO(b/383559945) Remove "framework-minus-apex_jarjar-sharded" once + // we remove this module. + "framework-minus-apex_jarjar-sharded", "ims-common", "telephony-common", "services", diff --git a/java/dex.go b/java/dex.go index 2b3c9319a..168a23114 100644 --- a/java/dex.go +++ b/java/dex.go @@ -412,6 +412,10 @@ func (d *dexer) r8Flags(ctx android.ModuleContext, dexParams *compileDexParams, artProfileOutput = profileOutput } + if ctx.Config().UseR8StoreStoreFenceConstructorInlining() { + r8Flags = append(r8Flags, "--store-store-fence-constructor-inlining") + } + return r8Flags, r8Deps, artProfileOutput } diff --git a/java/dexpreopt_test.go b/java/dexpreopt_test.go index 07d0595e6..207ff65b3 100644 --- a/java/dexpreopt_test.go +++ b/java/dexpreopt_test.go @@ -296,7 +296,7 @@ func TestDex2oatToolDeps(t *testing.T) { }) } - sourceDex2oatPath := "host/linux-x86/bin/dex2oatd" + sourceDex2oatPath := "../host/linux-x86/bin/dex2oatd" prebuiltDex2oatPath := ".intermediates/prebuilt_dex2oatd/linux_glibc_x86_64/dex2oatd" testDex2oatToolDep(true, false, false, sourceDex2oatPath) diff --git a/java/fuzz.go b/java/fuzz.go index dba8815ed..79cd042d8 100644 --- a/java/fuzz.go +++ b/java/fuzz.go @@ -107,7 +107,7 @@ func (j *JavaFuzzTest) DepsMutator(ctx android.BottomUpMutatorContext) { } func (j *JavaFuzzTest) GenerateAndroidBuildActions(ctx android.ModuleContext) { - j.fuzzPackagedModule = cc.PackageFuzzModule(ctx, j.fuzzPackagedModule, pctx) + j.fuzzPackagedModule = cc.PackageFuzzModule(ctx, j.fuzzPackagedModule) _, sharedDeps := cc.CollectAllSharedDependencies(ctx) for _, dep := range sharedDeps { diff --git a/java/legacy_core_platform_api_usage.go b/java/legacy_core_platform_api_usage.go index 4be7d0470..6128ce3df 100644 --- a/java/legacy_core_platform_api_usage.go +++ b/java/legacy_core_platform_api_usage.go @@ -28,6 +28,9 @@ var legacyCorePlatformApiModules = []string{ "FloralClocks", "framework-jobscheduler", "framework-minus-apex", + // TODO(b/383559945) Remove "framework-minus-apex_jarjar-sharded" once + // we remove this module. + "framework-minus-apex_jarjar-sharded", "framework-minus-apex-headers", "framework-minus-apex-intdefs", "FrameworksCoreTests", diff --git a/java/platform_bootclasspath_test.go b/java/platform_bootclasspath_test.go index 7fa6ddb38..f2768dbe3 100644 --- a/java/platform_bootclasspath_test.go +++ b/java/platform_bootclasspath_test.go @@ -204,7 +204,7 @@ func TestPlatformBootclasspath_ClasspathFragmentPaths(t *testing.T) { p := result.Module("platform-bootclasspath", "android_common").(*platformBootclasspathModule) android.AssertStringEquals(t, "output filepath", "bootclasspath.pb", p.ClasspathFragmentBase.outputFilepath.Base()) - android.AssertPathRelativeToTopEquals(t, "install filepath", "out/soong/target/product/test_device/system/etc/classpaths", p.ClasspathFragmentBase.installDirPath) + android.AssertPathRelativeToTopEquals(t, "install filepath", "out/target/product/test_device/system/etc/classpaths", p.ClasspathFragmentBase.installDirPath) } func TestPlatformBootclasspathModule_AndroidMkEntries(t *testing.T) { diff --git a/java/ravenwood_test.go b/java/ravenwood_test.go index 6394a9ac9..f7fe8e30b 100644 --- a/java/ravenwood_test.go +++ b/java/ravenwood_test.go @@ -100,7 +100,7 @@ var prepareRavenwoodRuntime = android.GroupFixturePreparers( `), ) -var installPathPrefix = "out/soong/host/linux-x86/testcases" +var installPathPrefix = "out/host/linux-x86/testcases" func TestRavenwoodRuntime(t *testing.T) { if runtime.GOOS != "linux" { diff --git a/java/rro_test.go b/java/rro_test.go index 4d58bb498..b94651137 100644 --- a/java/rro_test.go +++ b/java/rro_test.go @@ -216,7 +216,7 @@ func TestOverrideRuntimeResourceOverlay(t *testing.T) { }{ { variantName: "android_common", - apkPath: "out/soong/target/product/test_device/product/overlay/foo_overlay.apk", + apkPath: "out/target/product/test_device/product/overlay/foo_overlay.apk", overrides: nil, targetVariant: "android_common", packageFlag: "", @@ -224,7 +224,7 @@ func TestOverrideRuntimeResourceOverlay(t *testing.T) { }, { variantName: "android_common_bar_overlay", - apkPath: "out/soong/target/product/test_device/product/overlay/bar_overlay.apk", + apkPath: "out/target/product/test_device/product/overlay/bar_overlay.apk", overrides: []string{"foo_overlay"}, targetVariant: "android_common_bar", packageFlag: "com.android.bar.overlay", @@ -283,23 +283,23 @@ func TestRuntimeResourceOverlayPartition(t *testing.T) { }{ { name: "device_specific", - expectedPath: "out/soong/target/product/test_device/odm/overlay", + expectedPath: "out/target/product/test_device/odm/overlay", }, { name: "soc_specific", - expectedPath: "out/soong/target/product/test_device/vendor/overlay", + expectedPath: "out/target/product/test_device/vendor/overlay", }, { name: "system_ext_specific", - expectedPath: "out/soong/target/product/test_device/system_ext/overlay", + expectedPath: "out/target/product/test_device/system_ext/overlay", }, { name: "product_specific", - expectedPath: "out/soong/target/product/test_device/product/overlay", + expectedPath: "out/target/product/test_device/product/overlay", }, { name: "default", - expectedPath: "out/soong/target/product/test_device/product/overlay", + expectedPath: "out/target/product/test_device/product/overlay", }, } for _, testCase := range testCases { diff --git a/java/sdk_library.go b/java/sdk_library.go index 991f84767..a0affe0a5 100644 --- a/java/sdk_library.go +++ b/java/sdk_library.go @@ -1479,7 +1479,6 @@ func (module *SdkLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) ctx.CheckbuildFile(installFilesInfo.CheckbuildTarget) } } - android.SetProvider(ctx, blueprint.SrcsFileProviderKey, blueprint.SrcsFileProviderData{SrcPaths: module.implLibraryModule.uniqueSrcFiles.Strings()}) } // Make the set of components exported by this module available for use elsewhere. diff --git a/java/systemserver_classpath_fragment_test.go b/java/systemserver_classpath_fragment_test.go index ba328e7b1..2a1728b52 100644 --- a/java/systemserver_classpath_fragment_test.go +++ b/java/systemserver_classpath_fragment_test.go @@ -50,7 +50,7 @@ func TestPlatformSystemServerClasspath_ClasspathFragmentPaths(t *testing.T) { p := result.Module("platform-systemserverclasspath", "android_common").(*platformSystemServerClasspathModule) android.AssertStringEquals(t, "output filepath", "systemserverclasspath.pb", p.ClasspathFragmentBase.outputFilepath.Base()) - android.AssertPathRelativeToTopEquals(t, "install filepath", "out/soong/target/product/test_device/system/etc/classpaths", p.ClasspathFragmentBase.installDirPath) + android.AssertPathRelativeToTopEquals(t, "install filepath", "out/target/product/test_device/system/etc/classpaths", p.ClasspathFragmentBase.installDirPath) } func TestPlatformSystemServerClasspathModule_AndroidMkEntries(t *testing.T) { diff --git a/linkerconfig/linkerconfig.go b/linkerconfig/linkerconfig.go index d42287113..7684db288 100644 --- a/linkerconfig/linkerconfig.go +++ b/linkerconfig/linkerconfig.go @@ -76,9 +76,7 @@ func (l *linkerConfig) GenerateAndroidBuildActions(ctx android.ModuleContext) { input := android.PathForModuleSrc(ctx, android.String(l.properties.Src)) output := android.PathForModuleOut(ctx, "linker.config.pb").OutputPath - builder := android.NewRuleBuilder(pctx, ctx) - BuildLinkerConfig(ctx, builder, android.Paths{input}, nil, nil, output) - builder.Build("conv_linker_config", "Generate linker config protobuf "+output.String()) + BuildLinkerConfig(ctx, android.Paths{input}, nil, nil, output) l.outputFilePath = output l.installDirPath = android.PathForModuleInstall(ctx, "etc") @@ -90,10 +88,15 @@ func (l *linkerConfig) GenerateAndroidBuildActions(ctx android.ModuleContext) { ctx.SetOutputFiles(android.Paths{l.outputFilePath}, "") } -func BuildLinkerConfig(ctx android.ModuleContext, builder *android.RuleBuilder, - inputs android.Paths, provideModules []android.Module, requireModules []android.Module, output android.OutputPath) { - +func BuildLinkerConfig( + ctx android.ModuleContext, + inputs android.Paths, + provideModules []android.Module, + requireModules []android.Module, + output android.WritablePath, +) { // First, convert the input json to protobuf format + builder := android.NewRuleBuilder(pctx, ctx) interimOutput := android.PathForModuleOut(ctx, "temp.pb") cmd := builder.Command(). BuiltTool("conv_linker_config"). @@ -157,6 +160,7 @@ func BuildLinkerConfig(ctx android.ModuleContext, builder *android.RuleBuilder, builder.Temporary(interimOutput) builder.DeleteTemporaryFiles() + builder.Build("conv_linker_config_"+output.String(), "Generate linker config protobuf "+output.String()) } // linker_config generates protobuf file from json file. This protobuf file will be used from diff --git a/python/python.go b/python/python.go index d3e5743b5..be9411bbf 100644 --- a/python/python.go +++ b/python/python.go @@ -447,7 +447,6 @@ func (p *PythonLibraryModule) AddDepsOnPythonLauncherAndStdlib(ctx android.Botto // GenerateAndroidBuildActions performs build actions common to all Python modules func (p *PythonLibraryModule) GenerateAndroidBuildActions(ctx android.ModuleContext) { expandedSrcs := android.PathsForModuleSrcExcludes(ctx, p.properties.Srcs, p.properties.Exclude_srcs) - android.SetProvider(ctx, blueprint.SrcsFileProviderKey, blueprint.SrcsFileProviderData{SrcPaths: expandedSrcs.Strings()}) // Keep before any early returns. android.SetProvider(ctx, android.TestOnlyProviderKey, android.TestModuleInformation{ TestOnly: Bool(p.sourceProperties.Test_only), diff --git a/rust/benchmark.go b/rust/benchmark.go index 8c3e5151e..eaa2176a2 100644 --- a/rust/benchmark.go +++ b/rust/benchmark.go @@ -89,7 +89,7 @@ func (benchmark *benchmarkDecorator) autoDep(ctx android.BottomUpMutatorContext) return rlibAutoDep } -func (benchmark *benchmarkDecorator) stdLinkage(ctx *depsContext) RustLinkage { +func (benchmark *benchmarkDecorator) stdLinkage(device bool) RustLinkage { return RlibLinkage } diff --git a/rust/binary.go b/rust/binary.go index cba29a023..d22041b27 100644 --- a/rust/binary.go +++ b/rust/binary.go @@ -165,11 +165,11 @@ func (binary *binaryDecorator) autoDep(ctx android.BottomUpMutatorContext) autoD } } -func (binary *binaryDecorator) stdLinkage(ctx *depsContext) RustLinkage { +func (binary *binaryDecorator) stdLinkage(device bool) RustLinkage { if binary.preferRlib() { return RlibLinkage } - return binary.baseCompiler.stdLinkage(ctx) + return binary.baseCompiler.stdLinkage(device) } func (binary *binaryDecorator) binary() bool { diff --git a/rust/builder.go b/rust/builder.go index a1e17fc3f..e5434efee 100644 --- a/rust/builder.go +++ b/rust/builder.go @@ -30,11 +30,11 @@ var ( rustc = pctx.AndroidStaticRule("rustc", blueprint.RuleParams{ Command: "$envVars $rustcCmd " + - "-C linker=${config.RustLinker} " + - "-C link-args=\"${crtBegin} ${earlyLinkFlags} ${linkFlags} ${crtEnd}\" " + + "-C linker=${RustcLinkerCmd} " + + "-C link-args=\"--android-clang-bin=${config.ClangCmd} ${crtBegin} ${earlyLinkFlags} ${linkFlags} ${crtEnd}\" " + "--emit link -o $out --emit dep-info=$out.d.raw $in ${libFlags} $rustcFlags" + " && grep ^$out: $out.d.raw > $out.d", - CommandDeps: []string{"$rustcCmd"}, + CommandDeps: []string{"$rustcCmd", "${RustcLinkerCmd}", "${config.ClangCmd}"}, // Rustc deps-info writes out make compatible dep files: https://github.com/rust-lang/rust/issues/7633 // Rustc emits unneeded dependency lines for the .d and input .rs files. // Those extra lines cause ninja warning: @@ -102,10 +102,10 @@ var ( `KYTHE_CANONICALIZE_VNAME_PATHS=prefer-relative ` + `$rustExtractor $envVars ` + `$rustcCmd ` + - `-C linker=${config.RustLinker} ` + - `-C link-args="${crtBegin} ${linkFlags} ${crtEnd}" ` + + `-C linker=${RustcLinkerCmd} ` + + `-C link-args="--android-clang-bin=${config.ClangCmd} ${crtBegin} ${linkFlags} ${crtEnd}" ` + `$in ${libFlags} $rustcFlags`, - CommandDeps: []string{"$rustExtractor", "$kytheVnames"}, + CommandDeps: []string{"$rustExtractor", "$kytheVnames", "${RustcLinkerCmd}", "${config.ClangCmd}"}, Rspfile: "${out}.rsp", RspfileContent: "$in", }, @@ -119,6 +119,7 @@ type buildOutput struct { func init() { pctx.HostBinToolVariable("SoongZipCmd", "soong_zip") + pctx.HostBinToolVariable("RustcLinkerCmd", "rustc_linker") cc.TransformRlibstoStaticlib = TransformRlibstoStaticlib } @@ -411,6 +412,7 @@ func transformSrctoCrate(ctx android.ModuleContext, main android.Path, deps Path implicits = append(implicits, deps.SharedLibDeps...) implicits = append(implicits, deps.srcProviderFiles...) implicits = append(implicits, deps.AfdoProfiles...) + implicits = append(implicits, deps.LinkerDeps...) implicits = append(implicits, deps.CrtBegin...) implicits = append(implicits, deps.CrtEnd...) diff --git a/rust/builder_test.go b/rust/builder_test.go index ae5ccde27..b4b022ed9 100644 --- a/rust/builder_test.go +++ b/rust/builder_test.go @@ -85,7 +85,7 @@ func TestCompilationOutputFiles(t *testing.T) { "out/soong/.intermediates/libfizz_buzz/android_arm64_armv8-a_dylib/libfizz_buzz.dylib.so", "out/soong/.intermediates/libfizz_buzz/android_arm64_armv8-a_dylib/libfizz_buzz.dylib.so.clippy", "out/soong/.intermediates/libfizz_buzz/android_arm64_armv8-a_dylib/unstripped/libfizz_buzz.dylib.so", - "out/soong/target/product/test_device/system/lib64/libfizz_buzz.dylib.so", + "out/target/product/test_device/system/lib64/libfizz_buzz.dylib.so", "out/soong/.intermediates/libfizz_buzz/android_arm64_armv8-a_dylib/meta_lic", }, }, @@ -118,7 +118,7 @@ func TestCompilationOutputFiles(t *testing.T) { "out/soong/.intermediates/fizz_buzz/android_arm64_armv8-a/fizz_buzz", "out/soong/.intermediates/fizz_buzz/android_arm64_armv8-a/fizz_buzz.clippy", "out/soong/.intermediates/fizz_buzz/android_arm64_armv8-a/unstripped/fizz_buzz", - "out/soong/target/product/test_device/system/bin/fizz_buzz", + "out/target/product/test_device/system/bin/fizz_buzz", "out/soong/.intermediates/fizz_buzz/android_arm64_armv8-a/meta_lic", }, }, @@ -154,7 +154,7 @@ func TestCompilationOutputFiles(t *testing.T) { "out/soong/.intermediates/librust_ffi/android_arm64_armv8-a_shared/unstripped/librust_ffi.so.toc", "out/soong/.intermediates/librust_ffi/android_arm64_armv8-a_shared/meta_lic", "out/soong/.intermediates/librust_ffi/android_arm64_armv8-a_shared/rustdoc.timestamp", - "out/soong/target/product/test_device/system/lib64/librust_ffi.so", + "out/target/product/test_device/system/lib64/librust_ffi.so", }, }, } diff --git a/rust/compiler.go b/rust/compiler.go index fd869174c..b93019b30 100644 --- a/rust/compiler.go +++ b/rust/compiler.go @@ -30,9 +30,8 @@ import ( type RustLinkage int const ( - DefaultLinkage RustLinkage = iota + DylibLinkage RustLinkage = iota RlibLinkage - DylibLinkage ) type compiler interface { @@ -69,7 +68,7 @@ type compiler interface { Disabled() bool SetDisabled() - stdLinkage(ctx *depsContext) RustLinkage + stdLinkage(device bool) RustLinkage noStdlibs() bool unstrippedOutputFilePath() android.Path @@ -316,11 +315,11 @@ func (compiler *baseCompiler) Aliases() map[string]string { return aliases } -func (compiler *baseCompiler) stdLinkage(ctx *depsContext) RustLinkage { +func (compiler *baseCompiler) stdLinkage(device bool) RustLinkage { // For devices, we always link stdlibs in as dylibs by default. if compiler.preferRlib() { return RlibLinkage - } else if ctx.Device() { + } else if device { return DylibLinkage } else { return RlibLinkage diff --git a/rust/config/global.go b/rust/config/global.go index 7b79fca85..66ffc0b72 100644 --- a/rust/config/global.go +++ b/rust/config/global.go @@ -121,7 +121,7 @@ func init() { pctx.StaticVariable("RustBin", "${RustPath}/bin") pctx.ImportAs("cc_config", "android/soong/cc/config") - pctx.StaticVariable("RustLinker", "${cc_config.ClangBin}/clang++") + pctx.StaticVariable("ClangCmd", "${cc_config.ClangBin}/clang++") pctx.StaticVariable("DeviceGlobalLinkFlags", strings.Join(deviceGlobalLinkFlags, " ")) diff --git a/rust/fuzz.go b/rust/fuzz.go index 1770d2e65..9e8efd754 100644 --- a/rust/fuzz.go +++ b/rust/fuzz.go @@ -121,7 +121,7 @@ func (fuzzer *fuzzDecorator) compile(ctx ModuleContext, flags Flags, deps PathDe return out } -func (fuzzer *fuzzDecorator) stdLinkage(ctx *depsContext) RustLinkage { +func (fuzzer *fuzzDecorator) stdLinkage(device bool) RustLinkage { return RlibLinkage } @@ -130,7 +130,7 @@ func (fuzzer *fuzzDecorator) autoDep(ctx android.BottomUpMutatorContext) autoDep } func (fuzz *fuzzDecorator) install(ctx ModuleContext) { - fuzz.fuzzPackagedModule = cc.PackageFuzzModule(ctx, fuzz.fuzzPackagedModule, pctx) + fuzz.fuzzPackagedModule = cc.PackageFuzzModule(ctx, fuzz.fuzzPackagedModule) installBase := "fuzz" diff --git a/rust/fuzz_test.go b/rust/fuzz_test.go index 6cb8b9319..3598c9970 100644 --- a/rust/fuzz_test.go +++ b/rust/fuzz_test.go @@ -145,6 +145,6 @@ func TestCCFuzzDepBundling(t *testing.T) { t.Errorf("cc_fuzz does not contain the expected bundled transitive shared libs from rust_ffi_static ('libcc_transitive_dep'): %#v", fuzz_static_libtest.FuzzSharedLibraries().String()) } if !strings.Contains(fuzz_staticffi_libtest.FuzzSharedLibraries().String(), ":libcc_transitive_dep.so") { - t.Errorf("cc_fuzz does not contain the expected bundled transitive shared libs from rust_ffi_rlib ('libcc_transitive_dep'): %#v", fuzz_staticffi_libtest.FuzzSharedLibraries().String()) + t.Errorf("cc_fuzz does not contain the expected bundled transitive shared libs from rust_ffi_static ('libcc_transitive_dep'): %#v", fuzz_staticffi_libtest.FuzzSharedLibraries().String()) } } diff --git a/rust/image_test.go b/rust/image_test.go index d84eb10c5..0581fa7f8 100644 --- a/rust/image_test.go +++ b/rust/image_test.go @@ -22,14 +22,13 @@ import ( "android/soong/cc" ) -// Test that cc modules can depend on vendor_available rust_ffi_rlib/rust_ffi_static libraries. +// Test that cc modules can depend on vendor_available rust_ffi_static libraries. func TestVendorLinkage(t *testing.T) { ctx := testRust(t, ` cc_binary { name: "fizz_vendor_available", static_libs: [ "libfoo_vendor", - "libfoo_vendor_static" ], vendor_available: true, } @@ -38,14 +37,8 @@ func TestVendorLinkage(t *testing.T) { static_libs: ["libfoo_vendor"], soc_specific: true, } - rust_ffi_rlib { - name: "libfoo_vendor", - crate_name: "foo", - srcs: ["foo.rs"], - vendor_available: true, - } rust_ffi_static { - name: "libfoo_vendor_static", + name: "libfoo_vendor", crate_name: "foo", srcs: ["foo.rs"], vendor_available: true, @@ -54,8 +47,8 @@ func TestVendorLinkage(t *testing.T) { vendorBinary := ctx.ModuleForTests("fizz_vendor_available", "android_vendor_arm64_armv8-a").Module().(*cc.Module) - if android.InList("libfoo_vendor_static.vendor", vendorBinary.Properties.AndroidMkStaticLibs) { - t.Errorf("vendorBinary should not have a staticlib dependency on libfoo_vendor_static.vendor: %#v", vendorBinary.Properties.AndroidMkStaticLibs) + if android.InList("libfoo_vendor.vendor", vendorBinary.Properties.AndroidMkStaticLibs) { + t.Errorf("vendorBinary should not have a staticlib dependency on libfoo_vendor.vendor: %#v", vendorBinary.Properties.AndroidMkStaticLibs) } } @@ -107,26 +100,19 @@ func TestImageCfgFlag(t *testing.T) { } -// Test that cc modules can link against vendor_ramdisk_available rust_ffi_rlib and rust_ffi_static libraries. +// Test that cc modules can link against vendor_ramdisk_available rust_ffi_static libraries. func TestVendorRamdiskLinkage(t *testing.T) { ctx := testRust(t, ` cc_library_shared { name: "libcc_vendor_ramdisk", static_libs: [ "libfoo_vendor_ramdisk", - "libfoo_static_vendor_ramdisk" ], system_shared_libs: [], vendor_ramdisk_available: true, } - rust_ffi_rlib { - name: "libfoo_vendor_ramdisk", - crate_name: "foo", - srcs: ["foo.rs"], - vendor_ramdisk_available: true, - } rust_ffi_static { - name: "libfoo_static_vendor_ramdisk", + name: "libfoo_vendor_ramdisk", crate_name: "foo", srcs: ["foo.rs"], vendor_ramdisk_available: true, @@ -135,8 +121,8 @@ func TestVendorRamdiskLinkage(t *testing.T) { vendorRamdiskLibrary := ctx.ModuleForTests("libcc_vendor_ramdisk", "android_vendor_ramdisk_arm64_armv8-a_shared").Module().(*cc.Module) - if android.InList("libfoo_static_vendor_ramdisk.vendor_ramdisk", vendorRamdiskLibrary.Properties.AndroidMkStaticLibs) { - t.Errorf("libcc_vendor_ramdisk should not have a dependency on the libfoo_static_vendor_ramdisk static library") + if android.InList("libfoo_vendor_ramdisk.vendor_ramdisk", vendorRamdiskLibrary.Properties.AndroidMkStaticLibs) { + t.Errorf("libcc_vendor_ramdisk should not have a dependency on the libfoo_vendor_ramdisk static library") } } diff --git a/rust/library.go b/rust/library.go index bd3359b6a..14a2b6515 100644 --- a/rust/library.go +++ b/rust/library.go @@ -40,15 +40,10 @@ func init() { android.RegisterModuleType("rust_library_host_rlib", RustLibraryRlibHostFactory) android.RegisterModuleType("rust_ffi", RustFFIFactory) android.RegisterModuleType("rust_ffi_shared", RustFFISharedFactory) - android.RegisterModuleType("rust_ffi_rlib", RustFFIRlibFactory) android.RegisterModuleType("rust_ffi_host", RustFFIHostFactory) android.RegisterModuleType("rust_ffi_host_shared", RustFFISharedHostFactory) - android.RegisterModuleType("rust_ffi_host_rlib", RustFFIRlibHostFactory) - - // TODO: Remove when all instances of rust_ffi_static have been switched to rust_ffi_rlib - // Alias rust_ffi_static to the rust_ffi_rlib factory - android.RegisterModuleType("rust_ffi_static", RustFFIRlibFactory) - android.RegisterModuleType("rust_ffi_host_static", RustFFIRlibHostFactory) + android.RegisterModuleType("rust_ffi_static", RustLibraryRlibFactory) + android.RegisterModuleType("rust_ffi_host_static", RustLibraryRlibHostFactory) } type VariantLibraryProperties struct { @@ -69,6 +64,18 @@ type LibraryCompilerProperties struct { // path to include directories to export to cc_* modules, only relevant for static/shared variants. Export_include_dirs []string `android:"path,arch_variant"` + // Version script to pass to the linker. By default this will replace the + // implicit rustc emitted version script to mirror expected behavior in CC. + // This is only relevant for rust_ffi_shared modules which are exposing a + // versioned C API. + Version_script *string `android:"path,arch_variant"` + + // A version_script formatted text file with additional symbols to export + // for rust shared or dylibs which the rustc compiler does not automatically + // export, e.g. additional symbols from whole_static_libs. Unlike + // Version_script, this is not meant to imply a stable API. + Extra_exported_symbols *string `android:"path,arch_variant"` + // Whether this library is part of the Rust toolchain sysroot. Sysroot *bool @@ -114,8 +121,6 @@ type libraryDecorator struct { includeDirs android.Paths sourceProvider SourceProvider - isFFI bool - // table-of-contents file for cdylib crates to optimize out relinking when possible tocFile android.OptionalPath } @@ -156,8 +161,6 @@ type libraryInterface interface { BuildOnlyShared() toc() android.OptionalPath - - isFFILibrary() bool } func (library *libraryDecorator) nativeCoverage() bool { @@ -262,13 +265,13 @@ func (library *libraryDecorator) autoDep(ctx android.BottomUpMutatorContext) aut } } -func (library *libraryDecorator) stdLinkage(ctx *depsContext) RustLinkage { - if library.static() || library.MutatedProperties.VariantIsStaticStd || (library.rlib() && library.isFFILibrary()) { +func (library *libraryDecorator) stdLinkage(device bool) RustLinkage { + if library.static() || library.MutatedProperties.VariantIsStaticStd { return RlibLinkage } else if library.baseCompiler.preferRlib() { return RlibLinkage } - return DefaultLinkage + return DylibLinkage } var _ compiler = (*libraryDecorator)(nil) @@ -283,8 +286,7 @@ func RustLibraryFactory() android.Module { return module.Init() } -// rust_ffi produces all FFI variants (rust_ffi_shared, rust_ffi_static, and -// rust_ffi_rlib). +// rust_ffi produces all FFI variants (rust_ffi_shared, rust_ffi_static). func RustFFIFactory() android.Module { module, library := NewRustLibrary(android.HostAndDeviceSupported) library.BuildOnlyFFI() @@ -298,7 +300,7 @@ func RustLibraryDylibFactory() android.Module { return module.Init() } -// rust_library_rlib produces an rlib (Rust crate type "rlib"). +// rust_library_rlib and rust_ffi_static produces an rlib (Rust crate type "rlib"). func RustLibraryRlibFactory() android.Module { module, library := NewRustLibrary(android.HostAndDeviceSupported) library.BuildOnlyRlib() @@ -322,7 +324,7 @@ func RustLibraryHostFactory() android.Module { } // rust_ffi_host produces all FFI variants for the host -// (rust_ffi_rlib_host, rust_ffi_static_host, and rust_ffi_shared_host). +// (rust_ffi_static_host and rust_ffi_shared_host). func RustFFIHostFactory() android.Module { module, library := NewRustLibrary(android.HostSupported) library.BuildOnlyFFI() @@ -337,8 +339,8 @@ func RustLibraryDylibHostFactory() android.Module { return module.Init() } -// rust_library_rlib_host produces an rlib for the host (Rust crate -// type "rlib"). +// rust_library_rlib_host and rust_ffi_static_host produces an rlib for the host +// (Rust crate type "rlib"). func RustLibraryRlibHostFactory() android.Module { module, library := NewRustLibrary(android.HostSupported) library.BuildOnlyRlib() @@ -353,33 +355,12 @@ func RustFFISharedHostFactory() android.Module { return module.Init() } -// rust_ffi_rlib_host produces an rlib for the host (Rust crate -// type "rlib"). -func RustFFIRlibHostFactory() android.Module { - module, library := NewRustLibrary(android.HostSupported) - library.BuildOnlyRlib() - - library.isFFI = true - return module.Init() -} - -// rust_ffi_rlib produces an rlib (Rust crate type "rlib"). -func RustFFIRlibFactory() android.Module { - module, library := NewRustLibrary(android.HostAndDeviceSupported) - library.BuildOnlyRlib() - - library.isFFI = true - return module.Init() -} - func (library *libraryDecorator) BuildOnlyFFI() { library.MutatedProperties.BuildDylib = false // we build rlibs for later static ffi linkage. library.MutatedProperties.BuildRlib = true library.MutatedProperties.BuildShared = true library.MutatedProperties.BuildStatic = false - - library.isFFI = true } func (library *libraryDecorator) BuildOnlyRust() { @@ -408,8 +389,6 @@ func (library *libraryDecorator) BuildOnlyStatic() { library.MutatedProperties.BuildDylib = false library.MutatedProperties.BuildShared = false library.MutatedProperties.BuildStatic = true - - library.isFFI = true } func (library *libraryDecorator) BuildOnlyShared() { @@ -417,12 +396,6 @@ func (library *libraryDecorator) BuildOnlyShared() { library.MutatedProperties.BuildDylib = false library.MutatedProperties.BuildStatic = false library.MutatedProperties.BuildShared = true - - library.isFFI = true -} - -func (library *libraryDecorator) isFFILibrary() bool { - return library.isFFI } func NewRustLibrary(hod android.HostOrDeviceSupported) (*Module, *libraryDecorator) { @@ -511,7 +484,9 @@ func (library *libraryDecorator) compilerFlags(ctx ModuleContext, flags Flags) F flags = CommonLibraryCompilerFlags(ctx, flags) - if library.isFFI { + if library.rlib() || library.shared() { + // rlibs collect include dirs as well since they are used to + // produce staticlibs in the final C linkages library.includeDirs = append(library.includeDirs, android.PathsForModuleSrc(ctx, library.Properties.Include_dirs)...) library.includeDirs = append(library.includeDirs, android.PathsForModuleSrc(ctx, library.Properties.Export_include_dirs)...) } @@ -576,7 +551,31 @@ func (library *libraryDecorator) compile(ctx ModuleContext, flags Flags, deps Pa flags.LinkFlags = append(flags.LinkFlags, deps.depLinkFlags...) flags.LinkFlags = append(flags.LinkFlags, deps.linkObjects...) + if String(library.Properties.Version_script) != "" { + if String(library.Properties.Extra_exported_symbols) != "" { + ctx.ModuleErrorf("version_script and extra_exported_symbols cannot both be set.") + } + + if library.shared() { + // "-Wl,--android-version-script" signals to the rustcLinker script + // that the default version script should be removed. + flags.LinkFlags = append(flags.LinkFlags, "-Wl,--android-version-script="+android.PathForModuleSrc(ctx, String(library.Properties.Version_script)).String()) + deps.LinkerDeps = append(deps.LinkerDeps, android.PathForModuleSrc(ctx, String(library.Properties.Version_script))) + } else if !library.static() && !library.rlib() { + // We include rlibs here because rust_ffi produces rlib variants + ctx.PropertyErrorf("version_script", "can only be set for rust_ffi modules") + } + } + + if String(library.Properties.Extra_exported_symbols) != "" { + // Passing a second version script (rustc calculates and emits a + // default version script) will concatenate the first version script. + flags.LinkFlags = append(flags.LinkFlags, "-Wl,--version-script="+android.PathForModuleSrc(ctx, String(library.Properties.Extra_exported_symbols)).String()) + deps.LinkerDeps = append(deps.LinkerDeps, android.PathForModuleSrc(ctx, String(library.Properties.Extra_exported_symbols))) + } + if library.dylib() { + // We need prefer-dynamic for now to avoid linking in the static stdlib. See: // https://github.com/rust-lang/rust/issues/19680 // https://github.com/rust-lang/rust/issues/34909 @@ -821,11 +820,7 @@ func (libstdTransitionMutator) Split(ctx android.BaseModuleContext) []string { // Only create a variant if a library is actually being built. if library, ok := m.compiler.(libraryInterface); ok { if library.rlib() && !library.sysroot() { - if library.isFFILibrary() { - return []string{"rlib-std"} - } else { - return []string{"rlib-std", "dylib-std"} - } + return []string{"rlib-std", "dylib-std"} } } } diff --git a/rust/library_test.go b/rust/library_test.go index 35a420cd5..256cb355c 100644 --- a/rust/library_test.go +++ b/rust/library_test.go @@ -202,9 +202,9 @@ func TestStaticLibraryLinkage(t *testing.T) { func TestNativeDependencyOfRlib(t *testing.T) { ctx := testRust(t, ` - rust_ffi_rlib { - name: "libffi_rlib", - crate_name: "ffi_rlib", + rust_ffi_static { + name: "libffi_static", + crate_name: "ffi_static", rlibs: ["librust_rlib"], srcs: ["foo.rs"], } @@ -227,7 +227,7 @@ func TestNativeDependencyOfRlib(t *testing.T) { rustRlibRlibStd := ctx.ModuleForTests("librust_rlib", "android_arm64_armv8-a_rlib_rlib-std") rustRlibDylibStd := ctx.ModuleForTests("librust_rlib", "android_arm64_armv8-a_rlib_dylib-std") - ffiRlib := ctx.ModuleForTests("libffi_rlib", "android_arm64_armv8-a_rlib_rlib-std") + ffiRlib := ctx.ModuleForTests("libffi_static", "android_arm64_armv8-a_rlib_rlib-std") modules := []android.TestingModule{ rustRlibRlibStd, @@ -412,10 +412,10 @@ func TestLibstdLinkage(t *testing.T) { t.Errorf("Device rust_ffi_shared does not link libstd as an dylib") } if !android.InList("libstd", libbarFFIRlib.Properties.AndroidMkRlibs) { - t.Errorf("Device rust_ffi_rlib does not link libstd as an rlib") + t.Errorf("Device rust_ffi_static does not link libstd as an rlib") } if !android.InList("libfoo.rlib-std", libbarFFIRlib.Properties.AndroidMkRlibs) { - t.Errorf("Device rust_ffi_rlib does not link dependent rustlib rlib-std variant") + t.Errorf("Device rust_ffi_static does not link dependent rustlib rlib-std variant") } if !android.InList("libstd", libbarRlibStd.Properties.AndroidMkRlibs) { t.Errorf("rust_ffi with prefer_rlib does not link libstd as an rlib") @@ -441,3 +441,60 @@ func TestRustFFIExportedIncludes(t *testing.T) { libfooStatic := ctx.ModuleForTests("libfoo", "linux_glibc_x86_64_static").Rule("cc") android.AssertStringDoesContain(t, "cFlags for lib module", libfooStatic.Args["cFlags"], " -Irust_includes ") } + +func TestRustVersionScript(t *testing.T) { + ctx := testRust(t, ` + rust_library { + name: "librs", + srcs: ["bar.rs"], + crate_name: "rs", + extra_exported_symbols: "librs.map.txt", + } + rust_ffi { + name: "libffi", + srcs: ["foo.rs"], + crate_name: "ffi", + version_script: "libffi.map.txt", + } + `) + + //linkFlags + librs := ctx.ModuleForTests("librs", "android_arm64_armv8-a_dylib").Rule("rustc") + libffi := ctx.ModuleForTests("libffi", "android_arm64_armv8-a_shared").Rule("rustc") + + if !strings.Contains(librs.Args["linkFlags"], "-Wl,--version-script=librs.map.txt") { + t.Errorf("missing expected -Wl,--version-script= linker flag for libextended shared lib, linkFlags: %#v", + librs.Args["linkFlags"]) + } + if strings.Contains(librs.Args["linkFlags"], "-Wl,--android-version-script=librs.map.txt") { + t.Errorf("unexpected -Wl,--android-version-script= linker flag for libextended shared lib, linkFlags: %#v", + librs.Args["linkFlags"]) + } + + if !strings.Contains(libffi.Args["linkFlags"], "-Wl,--android-version-script=libffi.map.txt") { + t.Errorf("missing -Wl,--android-version-script= linker flag for libreplaced shared lib, linkFlags: %#v", + libffi.Args["linkFlags"]) + } + if strings.Contains(libffi.Args["linkFlags"], "-Wl,--version-script=libffi.map.txt") { + t.Errorf("unexpected -Wl,--version-script= linker flag for libextended shared lib, linkFlags: %#v", + libffi.Args["linkFlags"]) + } +} + +func TestRustVersionScriptPropertyErrors(t *testing.T) { + testRustError(t, "version_script: can only be set for rust_ffi modules", ` + rust_library { + name: "librs", + srcs: ["bar.rs"], + crate_name: "rs", + version_script: "libbar.map.txt", + }`) + testRustError(t, "version_script and extra_exported_symbols", ` + rust_ffi { + name: "librs", + srcs: ["bar.rs"], + crate_name: "rs", + version_script: "libbar.map.txt", + extra_exported_symbols: "libbar.map.txt", + }`) +} 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 } diff --git a/rust/rust.go b/rust/rust.go index 9586b8ce4..246670ff3 100644 --- a/rust/rust.go +++ b/rust/rust.go @@ -427,6 +427,7 @@ type PathDeps struct { StaticLibs android.Paths ProcMacros RustLibraries AfdoProfiles android.Paths + LinkerDeps android.Paths // depFlags and depLinkFlags are rustc and linker (clang) flags. depFlags []string @@ -594,7 +595,7 @@ func (mod *Module) CcLibraryInterface() bool { if mod.compiler != nil { // use build{Static,Shared}() instead of {static,shared}() here because this might be called before // VariantIs{Static,Shared} is set. - if lib, ok := mod.compiler.(libraryInterface); ok && (lib.buildShared() || lib.buildStatic()) { + if lib, ok := mod.compiler.(libraryInterface); ok && (lib.buildShared() || lib.buildStatic() || lib.buildRlib()) { return true } } @@ -680,15 +681,6 @@ func (mod *Module) BuildRlibVariant() bool { panic(fmt.Errorf("BuildRlibVariant called on non-library module: %q", mod.BaseModuleName())) } -func (mod *Module) IsRustFFI() bool { - if mod.compiler != nil { - if library, ok := mod.compiler.(libraryInterface); ok { - return library.isFFILibrary() - } - } - return false -} - func (mod *Module) BuildSharedVariant() bool { if mod.compiler != nil { if library, ok := mod.compiler.(libraryInterface); ok { @@ -954,7 +946,6 @@ func (mod *Module) GenerateAndroidBuildActions(actx android.ModuleContext) { mod.sourceProvider.setOutputFiles(sourceLib.sourceProvider.Srcs()) } ctx.CheckbuildFile(mod.sourceProvider.Srcs()...) - android.SetProvider(ctx, blueprint.SrcsFileProviderKey, blueprint.SrcsFileProviderData{SrcPaths: mod.sourceProvider.Srcs().Strings()}) } if mod.compiler != nil && !mod.compiler.Disabled() { @@ -1236,6 +1227,8 @@ func (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps { ctx.VisitDirectDeps(func(dep android.Module) { depName := ctx.OtherModuleName(dep) depTag := ctx.OtherModuleDependencyTag(dep) + modStdLinkage := mod.compiler.stdLinkage(ctx.Device()) + if _, exists := skipModuleList[depName]; exists { return } @@ -1264,6 +1257,14 @@ func (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps { depPaths.transitiveImplementationDeps = append(depPaths.transitiveImplementationDeps, info.ImplementationDeps) } + if !rustDep.compiler.noStdlibs() { + rustDepStdLinkage := rustDep.compiler.stdLinkage(ctx.Device()) + if rustDepStdLinkage != modStdLinkage { + ctx.ModuleErrorf("Rust dependency %q has the wrong StdLinkage; expected %#v, got %#v", depName, modStdLinkage, rustDepStdLinkage) + return + } + } + case depTag == rlibDepTag: rlib, ok := rustDep.compiler.(libraryInterface) if !ok || !rlib.rlib() { @@ -1284,6 +1285,14 @@ func (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps { depPaths.transitiveImplementationDeps = append(depPaths.transitiveImplementationDeps, info.ImplementationDeps) } + if !rustDep.compiler.noStdlibs() { + rustDepStdLinkage := rustDep.compiler.stdLinkage(ctx.Device()) + if rustDepStdLinkage != modStdLinkage { + ctx.ModuleErrorf("Rust dependency %q has the wrong StdLinkage; expected %#v, got %#v", depName, modStdLinkage, rustDepStdLinkage) + return + } + } + case depTag == procMacroDepTag: directProcMacroDeps = append(directProcMacroDeps, rustDep) mod.Properties.AndroidMkProcMacroLibs = append(mod.Properties.AndroidMkProcMacroLibs, makeLibName) @@ -1602,7 +1611,7 @@ func (mod *Module) DepsMutator(actx android.BottomUpMutatorContext) { } stdLinkage := "dylib-std" - if mod.compiler.stdLinkage(ctx) == RlibLinkage { + if mod.compiler.stdLinkage(ctx.Device()) == RlibLinkage { stdLinkage = "rlib-std" } @@ -1669,7 +1678,7 @@ func (mod *Module) DepsMutator(actx android.BottomUpMutatorContext) { // stdlibs if deps.Stdlibs != nil { - if mod.compiler.stdLinkage(ctx) == RlibLinkage { + if mod.compiler.stdLinkage(ctx.Device()) == RlibLinkage { for _, lib := range deps.Stdlibs { actx.AddVariationDependencies(append(commonDepVariations, []blueprint.Variation{{Mutator: "rust_libraries", Variation: "rlib"}}...), rlibDepTag, lib) diff --git a/rust/rust_test.go b/rust/rust_test.go index 767508d5f..90c1f6196 100644 --- a/rust/rust_test.go +++ b/rust/rust_test.go @@ -434,21 +434,21 @@ func TestRustAliases(t *testing.T) { func TestRustRlibs(t *testing.T) { ctx := testRust(t, ` - rust_ffi_rlib { + rust_ffi_static { name: "libbar", crate_name: "bar", srcs: ["src/lib.rs"], export_include_dirs: ["bar_includes"] } - rust_ffi_rlib { + rust_ffi_static { name: "libfoo", crate_name: "foo", srcs: ["src/lib.rs"], export_include_dirs: ["foo_includes"] } - rust_ffi_rlib { + rust_ffi_static { name: "libbuzz", crate_name: "buzz", srcs: ["src/lib.rs"], @@ -547,3 +547,31 @@ func assertString(t *testing.T, got, expected string) { t.Errorf("expected %q got %q", expected, got) } } + +func TestStdLinkMismatch(t *testing.T) { + // Test that we catch cases where the std linkage mismatches. This leads to + // a confusing rustc error where a crate is declared missing despite being + // passed in as a rustlib dependency / via the --extern flag. Thus, we want + // to make sure we detect it in Soong. + + // libfoo depends on libbar as an rlib, but does not link libstd as an rlib. + // libbar only links libstd as an rlib (prefer_rlib). + testRustError(t, "wrong StdLinkage", ` + rust_library { + name: "libfoo", + crate_name: "foo", + srcs: [ + "foo.rs", + ], + rlibs: ["libbar"], + } + rust_library { + name: "libbar", + crate_name: "bar", + srcs: [ + "bar.rs", + ], + prefer_rlib: true, + } + `) +} diff --git a/rust/test.go b/rust/test.go index 20ccfb31c..dce5e0391 100644 --- a/rust/test.go +++ b/rust/test.go @@ -238,7 +238,7 @@ func RustTestHostFactory() android.Module { return module.Init() } -func (test *testDecorator) stdLinkage(ctx *depsContext) RustLinkage { +func (test *testDecorator) stdLinkage(device bool) RustLinkage { return RlibLinkage } diff --git a/rust/testing.go b/rust/testing.go index 32cc82354..0ce1b66f5 100644 --- a/rust/testing.go +++ b/rust/testing.go @@ -188,12 +188,10 @@ func registerRequiredBuildComponentsForTest(ctx android.RegistrationContext) { ctx.RegisterModuleType("rust_fuzz_host", RustFuzzHostFactory) ctx.RegisterModuleType("rust_ffi", RustFFIFactory) ctx.RegisterModuleType("rust_ffi_shared", RustFFISharedFactory) - ctx.RegisterModuleType("rust_ffi_rlib", RustFFIRlibFactory) - ctx.RegisterModuleType("rust_ffi_static", RustFFIRlibFactory) + ctx.RegisterModuleType("rust_ffi_static", RustLibraryRlibFactory) ctx.RegisterModuleType("rust_ffi_host", RustFFIHostFactory) ctx.RegisterModuleType("rust_ffi_host_shared", RustFFISharedHostFactory) - ctx.RegisterModuleType("rust_ffi_host_rlib", RustFFIRlibHostFactory) - ctx.RegisterModuleType("rust_ffi_host_static", RustFFIRlibHostFactory) + ctx.RegisterModuleType("rust_ffi_host_static", RustLibraryRlibHostFactory) ctx.RegisterModuleType("rust_proc_macro", ProcMacroFactory) ctx.RegisterModuleType("rust_protobuf", RustProtobufFactory) ctx.RegisterModuleType("rust_protobuf_host", RustProtobufHostFactory) diff --git a/scripts/Android.bp b/scripts/Android.bp index 00b3ca591..d39c84a0f 100644 --- a/scripts/Android.bp +++ b/scripts/Android.bp @@ -319,3 +319,11 @@ python_binary_host { main: "extra_install_zips_file_list.py", srcs: ["extra_install_zips_file_list.py"], } + +python_binary_host { + name: "rustc_linker", + main: "rustc_linker.py", + srcs: [ + "rustc_linker.py", + ], +} diff --git a/scripts/gen_build_prop.py b/scripts/gen_build_prop.py index 47bbf590a..430e6134a 100644 --- a/scripts/gen_build_prop.py +++ b/scripts/gen_build_prop.py @@ -108,7 +108,7 @@ def parse_args(): def generate_common_build_props(args): print("####################################") - print("# from generate_common_build_props") + print("# from generate-common-build-props") print("# These properties identify this partition image.") print("####################################") @@ -243,9 +243,15 @@ def generate_build_info(args): print(f"# end build properties") def write_properties_from_file(file): + # Make and Soong use different intermediate files to build vendor/build.prop. + # Although the sysprop contents are same, the absolute paths of these + # intermediate files are different. + # Print the filename for the intermediate files (files in OUT_DIR). + # This helps with validating mk->soong migration of android partitions. + filename = os.path.basename(file.name) if file.name.startswith(os.environ.get("OUT_DIR")) else file.name print() print("####################################") - print(f"# from {file.name}") + print(f"# from {filename}") print("####################################") print(file.read(), end="") diff --git a/scripts/rustc_linker.py b/scripts/rustc_linker.py new file mode 100755 index 000000000..3f60708e2 --- /dev/null +++ b/scripts/rustc_linker.py @@ -0,0 +1,57 @@ +#!/usr/bin/env python3 +# +# Copyright (C) 2024 The Android Open Source Project +# +# 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. +# + +""" +This script is used as a replacement for the Rust linker to allow fine-grained +control over the what gets emitted to the linker. +""" + +import os +import shutil +import subprocess +import sys +import argparse + +replacementVersionScript = None + +argparser = argparse.ArgumentParser() +argparser.add_argument('--android-clang-bin', required=True) +args = argparser.parse_known_args() +clang_args = [args[0].android_clang_bin] + args[1] + +for i, arg in enumerate(clang_args): + if arg.startswith('-Wl,--android-version-script='): + replacementVersionScript = arg.split("=")[1] + del clang_args[i] + break + +if replacementVersionScript: + versionScriptFound = False + for i, arg in enumerate(clang_args): + if arg.startswith('-Wl,--version-script='): + clang_args[i] ='-Wl,--version-script=' + replacementVersionScript + versionScriptFound = True + break + + if not versionScriptFound: + # If rustc did not emit a version script, just append the arg + clang_args.append('-Wl,--version-script=' + replacementVersionScript) +try: + subprocess.run(clang_args, encoding='utf-8', check=True) +except subprocess.CalledProcessError as e: + sys.exit(-1) + diff --git a/sh/sh_binary.go b/sh/sh_binary.go index 7f5a4261f..60c53177d 100644 --- a/sh/sh_binary.go +++ b/sh/sh_binary.go @@ -314,8 +314,6 @@ func (s *ShBinary) generateAndroidBuildActions(ctx android.ModuleContext) { s.properties.SubName = s.GetSubname(ctx) - android.SetProvider(ctx, blueprint.SrcsFileProviderKey, blueprint.SrcsFileProviderData{SrcPaths: []string{s.sourceFilePath.String()}}) - ctx.SetOutputFiles(android.Paths{s.outputFilePath}, "") } diff --git a/sysprop/sysprop_library.go b/sysprop/sysprop_library.go index 84f20c555..25fbc41d3 100644 --- a/sysprop/sysprop_library.go +++ b/sysprop/sysprop_library.go @@ -346,7 +346,6 @@ func (m *syspropLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) ctx.PropertyErrorf("srcs", "srcs contains non-sysprop file %q", syspropFile.String()) } } - android.SetProvider(ctx, blueprint.SrcsFileProviderKey, blueprint.SrcsFileProviderData{SrcPaths: srcs.Strings()}) if ctx.Failed() { return @@ -680,7 +679,7 @@ func syspropLibraryHook(ctx android.LoadHookContext, m *syspropLibrary) { Sysprop_srcs: m.properties.Srcs, Scope: scope, Check_api: proptools.StringPtr(ctx.ModuleName()), - Installable: proptools.BoolPtr(false), + Installable: m.properties.Installable, Crate_name: m.rustCrateName(), Rustlibs: []string{ "liblog_rust", diff --git a/tradefed_modules/test_module_config_test.go b/tradefed_modules/test_module_config_test.go index efd4a0425..037dcea04 100644 --- a/tradefed_modules/test_module_config_test.go +++ b/tradefed_modules/test_module_config_test.go @@ -77,9 +77,9 @@ func TestModuleConfigAndroidTest(t *testing.T) { // Ensure some entries from base are there, specifically support files for data and helper apps. // Do not use LOCAL_COMPATIBILITY_SUPPORT_FILES, but instead use LOCAL_SOONG_INSTALLED_COMPATIBILITY_SUPPORT_FILES android.AssertStringPathsRelativeToTopEquals(t, "support-files", ctx.Config, - []string{"out/soong/target/product/test_device/testcases/derived_test/arm64/base.apk", - "out/soong/target/product/test_device/testcases/derived_test/HelperApp.apk", - "out/soong/target/product/test_device/testcases/derived_test/data/testfile"}, + []string{"out/target/product/test_device/testcases/derived_test/arm64/base.apk", + "out/target/product/test_device/testcases/derived_test/HelperApp.apk", + "out/target/product/test_device/testcases/derived_test/data/testfile"}, entries.EntryMap["LOCAL_SOONG_INSTALLED_COMPATIBILITY_SUPPORT_FILES"]) android.AssertArrayString(t, "", entries.EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"], []string{}) @@ -97,15 +97,15 @@ func TestModuleConfigAndroidTest(t *testing.T) { convertedActual := make([]string, 5) for i, e := range entries.FooterLinesForTests() { // AssertStringPathsRelativeToTop doesn't replace both instances - convertedActual[i] = strings.Replace(e, ctx.Config.SoongOutDir(), "", 2) + convertedActual[i] = strings.Replace(e, ctx.Config.OutDir(), "", 2) } - android.AssertArrayString(t, fmt.Sprintf("%s", ctx.Config.SoongOutDir()), convertedActual, []string{ + android.AssertArrayString(t, fmt.Sprintf("%s", ctx.Config.OutDir()), []string{ "include $(BUILD_SYSTEM)/soong_app_prebuilt.mk", "/target/product/test_device/testcases/derived_test/arm64/base.apk: /target/product/test_device/testcases/base/arm64/base.apk", "/target/product/test_device/testcases/derived_test/HelperApp.apk: /target/product/test_device/testcases/base/HelperApp.apk", "/target/product/test_device/testcases/derived_test/data/testfile: /target/product/test_device/testcases/base/data/testfile", "", - }) + }, convertedActual) } func TestModuleConfigShTest(t *testing.T) { @@ -151,8 +151,8 @@ func TestModuleConfigShTest(t *testing.T) { // Ensure some entries from base are there, specifically support files for data and helper apps. // Do not use LOCAL_COMPATIBILITY_SUPPORT_FILES, but instead use LOCAL_SOONG_INSTALLED_COMPATIBILITY_SUPPORT_FILES android.AssertStringPathsRelativeToTopEquals(t, "support-files", ctx.Config, - []string{"out/soong/target/product/test_device/testcases/conch/arm64/testdata/data1", - "out/soong/target/product/test_device/testcases/conch/arm64/testdata/sub/data2"}, + []string{"out/target/product/test_device/testcases/conch/arm64/testdata/data1", + "out/target/product/test_device/testcases/conch/arm64/testdata/sub/data2"}, entries.EntryMap["LOCAL_SOONG_INSTALLED_COMPATIBILITY_SUPPORT_FILES"]) android.AssertArrayString(t, "", entries.EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"], []string{}) @@ -171,14 +171,14 @@ func TestModuleConfigShTest(t *testing.T) { convertedActual := make([]string, 4) for i, e := range entries.FooterLinesForTests() { // AssertStringPathsRelativeToTop doesn't replace both instances - convertedActual[i] = strings.Replace(e, ctx.Config.SoongOutDir(), "", 2) + convertedActual[i] = strings.Replace(e, ctx.Config.OutDir(), "", 2) } - android.AssertArrayString(t, fmt.Sprintf("%s", ctx.Config.SoongOutDir()), convertedActual, []string{ + android.AssertArrayString(t, fmt.Sprintf("%s", ctx.Config.OutDir()), []string{ "include $(BUILD_SYSTEM)/soong_cc_rust_prebuilt.mk", "/target/product/test_device/testcases/conch/arm64/testdata/data1: /target/product/test_device/testcases/shell_test/arm64/testdata/data1", "/target/product/test_device/testcases/conch/arm64/testdata/sub/data2: /target/product/test_device/testcases/shell_test/arm64/testdata/sub/data2", "", - }) + }, convertedActual) } @@ -330,9 +330,9 @@ func TestModuleConfigMultipleDerivedTestsWriteDistinctMakeEntries(t *testing.T) entries := android.AndroidMkEntriesForTest(t, ctx.TestContext, derived.Module())[0] // All these should be the same in both derived tests android.AssertStringPathsRelativeToTopEquals(t, "support-files", ctx.Config, - []string{"out/soong/target/product/test_device/testcases/derived_test/arm64/base.apk", - "out/soong/target/product/test_device/testcases/derived_test/HelperApp.apk", - "out/soong/target/product/test_device/testcases/derived_test/data/testfile"}, + []string{"out/target/product/test_device/testcases/derived_test/arm64/base.apk", + "out/target/product/test_device/testcases/derived_test/HelperApp.apk", + "out/target/product/test_device/testcases/derived_test/data/testfile"}, entries.EntryMap["LOCAL_SOONG_INSTALLED_COMPATIBILITY_SUPPORT_FILES"]) // Except this one, which points to the updated tradefed xml file. @@ -346,9 +346,9 @@ func TestModuleConfigMultipleDerivedTestsWriteDistinctMakeEntries(t *testing.T) entries := android.AndroidMkEntriesForTest(t, ctx.TestContext, derived.Module())[0] // All these should be the same in both derived tests android.AssertStringPathsRelativeToTopEquals(t, "support-files", ctx.Config, - []string{"out/soong/target/product/test_device/testcases/another_derived_test/arm64/base.apk", - "out/soong/target/product/test_device/testcases/another_derived_test/HelperApp.apk", - "out/soong/target/product/test_device/testcases/another_derived_test/data/testfile"}, + []string{"out/target/product/test_device/testcases/another_derived_test/arm64/base.apk", + "out/target/product/test_device/testcases/another_derived_test/HelperApp.apk", + "out/target/product/test_device/testcases/another_derived_test/data/testfile"}, entries.EntryMap["LOCAL_SOONG_INSTALLED_COMPATIBILITY_SUPPORT_FILES"]) // Except this one, which points to the updated tradefed xml file. android.AssertStringMatches(t, "", entries.EntryMap["LOCAL_FULL_TEST_CONFIG"][0], diff --git a/ui/execution_metrics/execution_metrics.go b/ui/execution_metrics/execution_metrics.go index 4ea251fa4..db784495d 100644 --- a/ui/execution_metrics/execution_metrics.go +++ b/ui/execution_metrics/execution_metrics.go @@ -204,8 +204,7 @@ func (c *ExecutionMetrics) Dump(path string, args []string) error { if c.MetricsAggregationDir == "" { return nil } - msg := c.GetMetrics() - msg.CommandArgs = args + msg := c.GetMetrics(args) if _, err := os.Stat(filepath.Dir(path)); err != nil { if err = os.MkdirAll(filepath.Dir(path), 0775); err != nil { @@ -219,7 +218,14 @@ func (c *ExecutionMetrics) Dump(path string, args []string) error { return os.WriteFile(path, data, 0644) } -func (c *ExecutionMetrics) GetMetrics() *soong_metrics_proto.AggregatedFileList { +func (c *ExecutionMetrics) GetMetrics(args []string) *soong_metrics_proto.ExecutionMetrics { + return &soong_metrics_proto.ExecutionMetrics{ + CommandArgs: args, + ChangedFiles: c.getChangedFiles(), + } +} + +func (c *ExecutionMetrics) getChangedFiles() *soong_metrics_proto.AggregatedFileList { fl := c.fileList if fl == nil { return nil diff --git a/ui/metrics/metrics_proto/metrics.pb.go b/ui/metrics/metrics_proto/metrics.pb.go index 0aa51b166..8cbc5684e 100644 --- a/ui/metrics/metrics_proto/metrics.pb.go +++ b/ui/metrics/metrics_proto/metrics.pb.go @@ -2080,6 +2080,64 @@ func (x *OptimizedBuildMetrics) GetTargetResult() []*OptimizedBuildMetrics_Targe return nil } +// This is created by soong_ui from SoongExexcutionMetrics files. +type ExecutionMetrics struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The arguments provided on the command line. + CommandArgs []string `protobuf:"bytes,1,rep,name=command_args,json=commandArgs" json:"command_args,omitempty"` + // Changed files detected by the build. + ChangedFiles *AggregatedFileList `protobuf:"bytes,2,opt,name=changed_files,json=changedFiles" json:"changed_files,omitempty"` +} + +func (x *ExecutionMetrics) Reset() { + *x = ExecutionMetrics{} + if protoimpl.UnsafeEnabled { + mi := &file_metrics_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ExecutionMetrics) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExecutionMetrics) ProtoMessage() {} + +func (x *ExecutionMetrics) ProtoReflect() protoreflect.Message { + mi := &file_metrics_proto_msgTypes[19] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ExecutionMetrics.ProtoReflect.Descriptor instead. +func (*ExecutionMetrics) Descriptor() ([]byte, []int) { + return file_metrics_proto_rawDescGZIP(), []int{19} +} + +func (x *ExecutionMetrics) GetCommandArgs() []string { + if x != nil { + return x.CommandArgs + } + return nil +} + +func (x *ExecutionMetrics) GetChangedFiles() *AggregatedFileList { + if x != nil { + return x.ChangedFiles + } + return nil +} + // This is created by soong_ui from the various // android.find_input_delta_proto.FileList metrics provided to it by // find_input_delta. @@ -2088,8 +2146,6 @@ type AggregatedFileList struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // The arguments provided on the command line. - CommandArgs []string `protobuf:"bytes,1,rep,name=command_args,json=commandArgs" json:"command_args,omitempty"` // The (possibly truncated list of) added files. Additions []string `protobuf:"bytes,2,rep,name=additions" json:"additions,omitempty"` // The (possibly truncated list of) changed files. @@ -2105,7 +2161,7 @@ type AggregatedFileList struct { func (x *AggregatedFileList) Reset() { *x = AggregatedFileList{} if protoimpl.UnsafeEnabled { - mi := &file_metrics_proto_msgTypes[19] + mi := &file_metrics_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2118,7 +2174,7 @@ func (x *AggregatedFileList) String() string { func (*AggregatedFileList) ProtoMessage() {} func (x *AggregatedFileList) ProtoReflect() protoreflect.Message { - mi := &file_metrics_proto_msgTypes[19] + mi := &file_metrics_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2131,14 +2187,7 @@ func (x *AggregatedFileList) ProtoReflect() protoreflect.Message { // Deprecated: Use AggregatedFileList.ProtoReflect.Descriptor instead. func (*AggregatedFileList) Descriptor() ([]byte, []int) { - return file_metrics_proto_rawDescGZIP(), []int{19} -} - -func (x *AggregatedFileList) GetCommandArgs() []string { - if x != nil { - return x.CommandArgs - } - return nil + return file_metrics_proto_rawDescGZIP(), []int{20} } func (x *AggregatedFileList) GetAdditions() []string { @@ -2194,7 +2243,7 @@ type FileCount struct { func (x *FileCount) Reset() { *x = FileCount{} if protoimpl.UnsafeEnabled { - mi := &file_metrics_proto_msgTypes[20] + mi := &file_metrics_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2207,7 +2256,7 @@ func (x *FileCount) String() string { func (*FileCount) ProtoMessage() {} func (x *FileCount) ProtoReflect() protoreflect.Message { - mi := &file_metrics_proto_msgTypes[20] + mi := &file_metrics_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2220,7 +2269,7 @@ func (x *FileCount) ProtoReflect() protoreflect.Message { // Deprecated: Use FileCount.ProtoReflect.Descriptor instead. func (*FileCount) Descriptor() ([]byte, []int) { - return file_metrics_proto_rawDescGZIP(), []int{20} + return file_metrics_proto_rawDescGZIP(), []int{21} } func (x *FileCount) GetExtension() string { @@ -2272,7 +2321,7 @@ type OptimizedBuildMetrics_TargetOptimizationResult struct { func (x *OptimizedBuildMetrics_TargetOptimizationResult) Reset() { *x = OptimizedBuildMetrics_TargetOptimizationResult{} if protoimpl.UnsafeEnabled { - mi := &file_metrics_proto_msgTypes[21] + mi := &file_metrics_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2285,7 +2334,7 @@ func (x *OptimizedBuildMetrics_TargetOptimizationResult) String() string { func (*OptimizedBuildMetrics_TargetOptimizationResult) ProtoMessage() {} func (x *OptimizedBuildMetrics_TargetOptimizationResult) ProtoReflect() protoreflect.Message { - mi := &file_metrics_proto_msgTypes[21] + mi := &file_metrics_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2352,7 +2401,7 @@ type OptimizedBuildMetrics_TargetOptimizationResult_OutputArtifact struct { func (x *OptimizedBuildMetrics_TargetOptimizationResult_OutputArtifact) Reset() { *x = OptimizedBuildMetrics_TargetOptimizationResult_OutputArtifact{} if protoimpl.UnsafeEnabled { - mi := &file_metrics_proto_msgTypes[22] + mi := &file_metrics_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2365,7 +2414,7 @@ func (x *OptimizedBuildMetrics_TargetOptimizationResult_OutputArtifact) String() func (*OptimizedBuildMetrics_TargetOptimizationResult_OutputArtifact) ProtoMessage() {} func (x *OptimizedBuildMetrics_TargetOptimizationResult_OutputArtifact) ProtoReflect() protoreflect.Message { - mi := &file_metrics_proto_msgTypes[22] + mi := &file_metrics_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2808,33 +2857,40 @@ var file_metrics_proto_rawDesc = []byte{ 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x69, 0x6e, - 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x22, 0xe6, 0x01, - 0x0a, 0x12, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, - 0x4c, 0x69, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x5f, - 0x61, 0x72, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x41, 0x72, 0x67, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x64, 0x64, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, - 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1f, 0x0a, - 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x12, 0x36, - 0x0a, 0x06, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, - 0x2e, 0x73, 0x6f, 0x6f, 0x6e, 0x67, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x6d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x06, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x22, 0x8b, 0x01, 0x0a, 0x09, 0x46, 0x69, 0x6c, 0x65, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0x24, 0x0a, 0x0d, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x65, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x28, 0x5a, 0x26, 0x61, 0x6e, 0x64, 0x72, 0x6f, 0x69, 0x64, 0x2f, - 0x73, 0x6f, 0x6f, 0x6e, 0x67, 0x2f, 0x75, 0x69, 0x2f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x2f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x22, 0x83, 0x01, + 0x0a, 0x10, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x5f, 0x61, 0x72, + 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x41, 0x72, 0x67, 0x73, 0x12, 0x4c, 0x0a, 0x0d, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, + 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x73, + 0x6f, 0x6f, 0x6e, 0x67, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x46, 0x69, 0x6c, + 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x0c, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x46, 0x69, + 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, 0x0a, 0x12, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, + 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x64, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, + 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x44, 0x65, 0x6c, 0x74, + 0x61, 0x12, 0x36, 0x0a, 0x06, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1e, 0x2e, 0x73, 0x6f, 0x6f, 0x6e, 0x67, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, + 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x52, 0x06, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x22, + 0x8b, 0x01, 0x0a, 0x09, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1c, 0x0a, + 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x61, + 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, + 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x6d, 0x6f, 0x64, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x0d, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x28, 0x5a, + 0x26, 0x61, 0x6e, 0x64, 0x72, 0x6f, 0x69, 0x64, 0x2f, 0x73, 0x6f, 0x6f, 0x6e, 0x67, 0x2f, 0x75, + 0x69, 0x2f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x2f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, } var ( @@ -2850,7 +2906,7 @@ func file_metrics_proto_rawDescGZIP() []byte { } var file_metrics_proto_enumTypes = make([]protoimpl.EnumInfo, 5) -var file_metrics_proto_msgTypes = make([]protoimpl.MessageInfo, 23) +var file_metrics_proto_msgTypes = make([]protoimpl.MessageInfo, 24) var file_metrics_proto_goTypes = []interface{}{ (MetricsBase_BuildVariant)(0), // 0: soong_build_metrics.MetricsBase.BuildVariant (MetricsBase_Arch)(0), // 1: soong_build_metrics.MetricsBase.Arch @@ -2876,10 +2932,11 @@ var file_metrics_proto_goTypes = []interface{}{ (*CriticalPathInfo)(nil), // 21: soong_build_metrics.CriticalPathInfo (*JobInfo)(nil), // 22: soong_build_metrics.JobInfo (*OptimizedBuildMetrics)(nil), // 23: soong_build_metrics.OptimizedBuildMetrics - (*AggregatedFileList)(nil), // 24: soong_build_metrics.AggregatedFileList - (*FileCount)(nil), // 25: soong_build_metrics.FileCount - (*OptimizedBuildMetrics_TargetOptimizationResult)(nil), // 26: soong_build_metrics.OptimizedBuildMetrics.TargetOptimizationResult - (*OptimizedBuildMetrics_TargetOptimizationResult_OutputArtifact)(nil), // 27: soong_build_metrics.OptimizedBuildMetrics.TargetOptimizationResult.OutputArtifact + (*ExecutionMetrics)(nil), // 24: soong_build_metrics.ExecutionMetrics + (*AggregatedFileList)(nil), // 25: soong_build_metrics.AggregatedFileList + (*FileCount)(nil), // 26: soong_build_metrics.FileCount + (*OptimizedBuildMetrics_TargetOptimizationResult)(nil), // 27: soong_build_metrics.OptimizedBuildMetrics.TargetOptimizationResult + (*OptimizedBuildMetrics_TargetOptimizationResult_OutputArtifact)(nil), // 28: soong_build_metrics.OptimizedBuildMetrics.TargetOptimizationResult.OutputArtifact } var file_metrics_proto_depIdxs = []int32{ 0, // 0: soong_build_metrics.MetricsBase.target_build_variant:type_name -> soong_build_metrics.MetricsBase.BuildVariant @@ -2915,15 +2972,16 @@ var file_metrics_proto_depIdxs = []int32{ 22, // 30: soong_build_metrics.CriticalPathInfo.long_running_jobs:type_name -> soong_build_metrics.JobInfo 10, // 31: soong_build_metrics.OptimizedBuildMetrics.analysis_perf:type_name -> soong_build_metrics.PerfInfo 10, // 32: soong_build_metrics.OptimizedBuildMetrics.packaging_perf:type_name -> soong_build_metrics.PerfInfo - 26, // 33: soong_build_metrics.OptimizedBuildMetrics.target_result:type_name -> soong_build_metrics.OptimizedBuildMetrics.TargetOptimizationResult - 25, // 34: soong_build_metrics.AggregatedFileList.counts:type_name -> soong_build_metrics.FileCount - 10, // 35: soong_build_metrics.OptimizedBuildMetrics.TargetOptimizationResult.packaging_perf:type_name -> soong_build_metrics.PerfInfo - 27, // 36: soong_build_metrics.OptimizedBuildMetrics.TargetOptimizationResult.output_artifact:type_name -> soong_build_metrics.OptimizedBuildMetrics.TargetOptimizationResult.OutputArtifact - 37, // [37:37] is the sub-list for method output_type - 37, // [37:37] is the sub-list for method input_type - 37, // [37:37] is the sub-list for extension type_name - 37, // [37:37] is the sub-list for extension extendee - 0, // [0:37] is the sub-list for field type_name + 27, // 33: soong_build_metrics.OptimizedBuildMetrics.target_result:type_name -> soong_build_metrics.OptimizedBuildMetrics.TargetOptimizationResult + 25, // 34: soong_build_metrics.ExecutionMetrics.changed_files:type_name -> soong_build_metrics.AggregatedFileList + 26, // 35: soong_build_metrics.AggregatedFileList.counts:type_name -> soong_build_metrics.FileCount + 10, // 36: soong_build_metrics.OptimizedBuildMetrics.TargetOptimizationResult.packaging_perf:type_name -> soong_build_metrics.PerfInfo + 28, // 37: soong_build_metrics.OptimizedBuildMetrics.TargetOptimizationResult.output_artifact:type_name -> soong_build_metrics.OptimizedBuildMetrics.TargetOptimizationResult.OutputArtifact + 38, // [38:38] is the sub-list for method output_type + 38, // [38:38] is the sub-list for method input_type + 38, // [38:38] is the sub-list for extension type_name + 38, // [38:38] is the sub-list for extension extendee + 0, // [0:38] is the sub-list for field type_name } func init() { file_metrics_proto_init() } @@ -3161,7 +3219,7 @@ func file_metrics_proto_init() { } } file_metrics_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AggregatedFileList); i { + switch v := v.(*ExecutionMetrics); i { case 0: return &v.state case 1: @@ -3173,7 +3231,7 @@ func file_metrics_proto_init() { } } file_metrics_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FileCount); i { + switch v := v.(*AggregatedFileList); i { case 0: return &v.state case 1: @@ -3185,7 +3243,7 @@ func file_metrics_proto_init() { } } file_metrics_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OptimizedBuildMetrics_TargetOptimizationResult); i { + switch v := v.(*FileCount); i { case 0: return &v.state case 1: @@ -3197,6 +3255,18 @@ func file_metrics_proto_init() { } } file_metrics_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OptimizedBuildMetrics_TargetOptimizationResult); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_metrics_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*OptimizedBuildMetrics_TargetOptimizationResult_OutputArtifact); i { case 0: return &v.state @@ -3215,7 +3285,7 @@ func file_metrics_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_metrics_proto_rawDesc, NumEnums: 5, - NumMessages: 23, + NumMessages: 24, NumExtensions: 0, NumServices: 0, }, diff --git a/ui/metrics/metrics_proto/metrics.proto b/ui/metrics/metrics_proto/metrics.proto index 8437b65ae..69067ab9e 100644 --- a/ui/metrics/metrics_proto/metrics.proto +++ b/ui/metrics/metrics_proto/metrics.proto @@ -452,13 +452,19 @@ message OptimizedBuildMetrics { } } +// This is created by soong_ui from SoongExexcutionMetrics files. +message ExecutionMetrics { + // The arguments provided on the command line. + repeated string command_args = 1; + + // Changed files detected by the build. + optional AggregatedFileList changed_files = 2; +} + // This is created by soong_ui from the various // android.find_input_delta_proto.FileList metrics provided to it by // find_input_delta. message AggregatedFileList { - // The arguments provided on the command line. - repeated string command_args = 1; - // The (possibly truncated list of) added files. repeated string additions = 2; @@ -473,6 +479,8 @@ message AggregatedFileList { // Counts by extension. repeated FileCount counts = 6; + + reserved 1; } message FileCount { diff --git a/xml/xml_test.go b/xml/xml_test.go index a59a29318..9f28315b7 100644 --- a/xml/xml_test.go +++ b/xml/xml_test.go @@ -80,5 +80,5 @@ func TestPrebuiltEtcXml(t *testing.T) { } m := result.ModuleForTests("foo.xml", "android_arm64_armv8-a").Module().(*prebuiltEtcXml) - android.AssertPathRelativeToTopEquals(t, "installDir", "out/soong/target/product/test_device/system/etc", m.InstallDirPath()) + android.AssertPathRelativeToTopEquals(t, "installDir", "out/target/product/test_device/system/etc", m.InstallDirPath()) } |