diff options
author | 2024-12-20 23:31:32 +0000 | |
---|---|---|
committer | 2025-01-08 23:28:12 +0000 | |
commit | 8024b92aa2edf9a2c0dcab4dc40a081b002146da (patch) | |
tree | f564bb72582ea466cebc57054465d820a1ac6e95 | |
parent | 63ee59d96214105d5a0b134ab06671745c5ed8ea (diff) |
Convert depsToPaths to use ModuleProxy for both cc and rust.
Bug: 377723687
Test: Unit tests and compare the ninja and mk files generated.
Change-Id: Id465f293c3615fc803b34c990f19b4386ebece1c
-rw-r--r-- | android/module.go | 29 | ||||
-rw-r--r-- | apex/apex.go | 6 | ||||
-rw-r--r-- | cc/cc.go | 204 | ||||
-rw-r--r-- | cc/cmake_snapshot.go | 2 | ||||
-rw-r--r-- | cc/library.go | 7 | ||||
-rw-r--r-- | cc/ndk_library.go | 5 | ||||
-rw-r--r-- | cc/tidy.go | 2 | ||||
-rw-r--r-- | genrule/genrule.go | 4 | ||||
-rw-r--r-- | rust/rust.go | 190 |
9 files changed, 302 insertions, 147 deletions
diff --git a/android/module.go b/android/module.go index b8f2cae2e..287ac599e 100644 --- a/android/module.go +++ b/android/module.go @@ -1868,12 +1868,14 @@ type CommonModuleInfo struct { // Whether the module has been replaced by a prebuilt ReplacedByPrebuilt bool // The Target of artifacts that this module variant is responsible for creating. - CompileTarget Target + Target Target SkipAndroidMkProcessing bool BaseModuleName string CanHaveApexVariants bool MinSdkVersion string NotAvailableForPlatform bool + // There some subtle differences between this one and the one above. + NotInPlatform 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 @@ -1897,6 +1899,20 @@ type HostToolProviderData struct { var HostToolProviderKey = blueprint.NewProvider[HostToolProviderData]() +type SourceFileGenerator interface { + GeneratedSourceFiles() Paths + GeneratedHeaderDirs() Paths + GeneratedDeps() Paths +} + +type GeneratedSourceInfo struct { + GeneratedSourceFiles Paths + GeneratedHeaderDirs Paths + GeneratedDeps Paths +} + +var GeneratedSourceInfoProvider = blueprint.NewProvider[GeneratedSourceInfo]() + func (m *ModuleBase) GenerateBuildActions(blueprintCtx blueprint.ModuleContext) { ctx := &moduleContext{ module: m.module, @@ -2147,7 +2163,7 @@ func (m *ModuleBase) GenerateBuildActions(blueprintCtx blueprint.ModuleContext) commonData := CommonModuleInfo{ ReplacedByPrebuilt: m.commonProperties.ReplacedByPrebuilt, - CompileTarget: m.commonProperties.CompileTarget, + Target: m.commonProperties.CompileTarget, SkipAndroidMkProcessing: shouldSkipAndroidMkProcessing(ctx, m), BaseModuleName: m.BaseModuleName(), UninstallableApexPlatformVariant: m.commonProperties.UninstallableApexPlatformVariant, @@ -2173,6 +2189,7 @@ func (m *ModuleBase) GenerateBuildActions(blueprintCtx blueprint.ModuleContext) if am, ok := m.module.(ApexModule); ok { commonData.CanHaveApexVariants = am.CanHaveApexVariants() commonData.NotAvailableForPlatform = am.NotAvailableForPlatform() + commonData.NotInPlatform = am.NotInPlatform() } SetProvider(ctx, CommonModuleInfoKey, commonData) if p, ok := m.module.(PrebuiltInterface); ok && p.Prebuilt() != nil { @@ -2186,6 +2203,14 @@ func (m *ModuleBase) GenerateBuildActions(blueprintCtx blueprint.ModuleContext) if p, ok := m.module.(AndroidMkProviderInfoProducer); ok && !commonData.SkipAndroidMkProcessing { SetProvider(ctx, AndroidMkInfoProvider, p.PrepareAndroidMKProviderInfo(ctx.Config())) } + + if s, ok := m.module.(SourceFileGenerator); ok { + SetProvider(ctx, GeneratedSourceInfoProvider, GeneratedSourceInfo{ + GeneratedSourceFiles: s.GeneratedSourceFiles(), + GeneratedHeaderDirs: s.GeneratedHeaderDirs(), + GeneratedDeps: s.GeneratedDeps(), + }) + } } func SetJarJarPrefixHandler(handler func(ModuleContext)) { diff --git a/apex/apex.go b/apex/apex.go index 773439152..58960aca6 100644 --- a/apex/apex.go +++ b/apex/apex.go @@ -2588,7 +2588,7 @@ func (a *apexBundle) checkStaticLinkingToStubLibraries(ctx android.ModuleContext }) a.WalkPayloadDepsProxy(ctx, func(ctx android.BaseModuleContext, from, to android.ModuleProxy, externalDep bool) bool { - if ccInfo, ok := android.OtherModuleProvider(ctx, to, cc.CcInfoProvider); ok { + if info, ok := android.OtherModuleProvider(ctx, to, cc.LinkableInfoProvider); ok { // If `to` is not actually in the same APEX as `from` then it does not need // apex_available and neither do any of its dependencies. if externalDep { @@ -2609,7 +2609,7 @@ func (a *apexBundle) checkStaticLinkingToStubLibraries(ctx android.ModuleContext return false } - isStubLibraryFromOtherApex := ccInfo.HasStubsVariants && !librariesDirectlyInApex[toName] + isStubLibraryFromOtherApex := info.HasStubsVariants && !librariesDirectlyInApex[toName] if isStubLibraryFromOtherApex && !externalDep { ctx.ModuleErrorf("%q required by %q is a native library providing stub. "+ "It shouldn't be included in this APEX via static linking. Dependency path: %s", to.String(), fromName, ctx.GetPathString(false)) @@ -2740,7 +2740,7 @@ func (a *apexBundle) checkStaticExecutables(ctx android.ModuleContext) { return } - if android.OtherModuleProviderOrDefault(ctx, module, cc.LinkableInfoKey).StaticExecutable { + if android.OtherModuleProviderOrDefault(ctx, module, cc.LinkableInfoProvider).StaticExecutable { apex := a.ApexVariationName() exec := ctx.OtherModuleName(module) if isStaticExecutableAllowed(apex, exec) { @@ -34,7 +34,6 @@ import ( "android/soong/android" "android/soong/cc/config" "android/soong/fuzz" - "android/soong/genrule" ) type CcMakeVarsInfo struct { @@ -79,8 +78,7 @@ type LinkerInfo struct { // 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 + HeaderLibs proptools.Configurable[[]string] BinaryDecoratorInfo *BinaryDecoratorInfo LibraryDecoratorInfo *LibraryDecoratorInfo @@ -95,8 +93,8 @@ type LibraryDecoratorInfo struct { InjectBsslHash bool } -type LibraryInfo struct { - StubsVersion string +type SnapshotInfo struct { + SnapshotAndroidMkSuffix string } type TestBinaryInfo struct { @@ -107,22 +105,49 @@ type ObjectLinkerInfo struct{} // Common info about the cc module. type CcInfo struct { - HasStubsVariants bool IsPrebuilt bool CmakeSnapshotSupported bool CompilerInfo *CompilerInfo LinkerInfo *LinkerInfo - LibraryInfo *LibraryInfo + SnapshotInfo *SnapshotInfo } -var CcInfoProvider = blueprint.NewProvider[CcInfo]() +var CcInfoProvider = blueprint.NewProvider[*CcInfo]() type LinkableInfo struct { // StaticExecutable returns true if this is a binary module with "static_executable: true". - StaticExecutable bool -} - -var LinkableInfoKey = blueprint.NewProvider[LinkableInfo]() + StaticExecutable bool + Static bool + Shared bool + HasStubsVariants bool + StubsVersion string + IsStubs bool + UnstrippedOutputFile android.Path + OutputFile android.OptionalPath + CoverageFiles android.Paths + SAbiDumpFiles android.Paths + CcLibraryInterface bool + RustLibraryInterface bool + // CrateName returns the crateName for a Rust library + CrateName string + // DepFlags returns a slice of Rustc string flags + ExportedCrateLinkDirs []string + // This can be different from the one on CommonModuleInfo + BaseModuleName string + HasNonSystemVariants bool + IsLlndk bool + InVendorOrProduct bool + // SubName returns the modules SubName, used for image and NDK/SDK variations. + SubName string + InRamdisk bool + OnlyInRamdisk bool + InVendorRamdisk bool + OnlyInVendorRamdisk bool + InRecovery bool + OnlyInRecovery bool +} + +var LinkableInfoProvider = blueprint.NewProvider[*LinkableInfo]() func init() { RegisterCCBuildComponents(android.InitRegistrationContext) @@ -2182,12 +2207,20 @@ func (c *Module) GenerateAndroidBuildActions(actx android.ModuleContext) { android.SetProvider(ctx, CcObjectInfoProvider, ccObjectInfo) } - android.SetProvider(ctx, LinkableInfoKey, LinkableInfo{ - StaticExecutable: c.StaticExecutable(), - }) + linkableInfo := CreateCommonLinkableInfo(c) + if lib, ok := c.linker.(versionedInterface); ok { + linkableInfo.StubsVersion = lib.stubsVersion() + } + if c.linker != nil { + if library, ok := c.linker.(libraryInterface); ok { + linkableInfo.Static = library.static() + linkableInfo.CoverageFiles = library.objs().coverageFiles + linkableInfo.SAbiDumpFiles = library.objs().sAbiDumpFiles + } + } + android.SetProvider(ctx, LinkableInfoProvider, linkableInfo) ccInfo := CcInfo{ - HasStubsVariants: c.HasStubsVariants(), IsPrebuilt: c.IsPrebuilt(), CmakeSnapshotSupported: proptools.Bool(c.Properties.Cmake_snapshot_supported), } @@ -2211,11 +2244,10 @@ func (c *Module) GenerateAndroidBuildActions(actx android.ModuleContext) { } 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(), + 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, } switch decorator := c.linker.(type) { case *binaryDecorator: @@ -2233,13 +2265,14 @@ func (c *Module) GenerateAndroidBuildActions(actx android.ModuleContext) { case *objectLinker: ccInfo.LinkerInfo.ObjectLinkerInfo = &ObjectLinkerInfo{} } - } - if c.library != nil { - ccInfo.LibraryInfo = &LibraryInfo{ - StubsVersion: c.library.stubsVersion(), + + if s, ok := c.linker.(SnapshotInterface); ok { + ccInfo.SnapshotInfo = &SnapshotInfo{ + SnapshotAndroidMkSuffix: s.SnapshotAndroidMkSuffix(), + } } } - android.SetProvider(ctx, CcInfoProvider, ccInfo) + android.SetProvider(ctx, CcInfoProvider, &ccInfo) c.setOutputFiles(ctx) @@ -2248,6 +2281,29 @@ func (c *Module) GenerateAndroidBuildActions(actx android.ModuleContext) { } } +func CreateCommonLinkableInfo(mod LinkableInterface) *LinkableInfo { + return &LinkableInfo{ + StaticExecutable: mod.StaticExecutable(), + HasStubsVariants: mod.HasStubsVariants(), + OutputFile: mod.OutputFile(), + UnstrippedOutputFile: mod.UnstrippedOutputFile(), + IsStubs: mod.IsStubs(), + CcLibraryInterface: mod.CcLibraryInterface(), + RustLibraryInterface: mod.RustLibraryInterface(), + BaseModuleName: mod.BaseModuleName(), + IsLlndk: mod.IsLlndk(), + HasNonSystemVariants: mod.HasNonSystemVariants(), + SubName: mod.SubName(), + InVendorOrProduct: mod.InVendorOrProduct(), + InRamdisk: mod.InRamdisk(), + OnlyInRamdisk: mod.OnlyInRamdisk(), + InVendorRamdisk: mod.InVendorRamdisk(), + OnlyInVendorRamdisk: mod.OnlyInVendorRamdisk(), + InRecovery: mod.InRecovery(), + OnlyInRecovery: mod.OnlyInRecovery(), + } +} + func setOutputFilesIfNotEmpty(ctx ModuleContext, files android.Paths, tag string) { if len(files) > 0 { ctx.SetOutputFiles(files, tag) @@ -3073,7 +3129,7 @@ func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps { skipModuleList := map[string]bool{} - ctx.VisitDirectDeps(func(dep android.Module) { + ctx.VisitDirectDepsProxy(func(dep android.ModuleProxy) { depName := ctx.OtherModuleName(dep) depTag := ctx.OtherModuleDependencyTag(dep) @@ -3082,8 +3138,17 @@ func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps { return } + var ccInfo *CcInfo + v, hasCcInfo := android.OtherModuleProvider(ctx, dep, CcInfoProvider) + if hasCcInfo { + ccInfo = v + } + linkableInfo, hasLinkableInfo := android.OtherModuleProvider(ctx, dep, LinkableInfoProvider) if depTag == android.DarwinUniversalVariantTag { - depPaths.DarwinSecondArchOutput = dep.(*Module).OutputFile() + if !hasCcInfo { + panic(fmt.Errorf("dep is not a cc module: %s", dep.String())) + } + depPaths.DarwinSecondArchOutput = linkableInfo.OutputFile return } @@ -3096,34 +3161,32 @@ func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps { } } - ccDep, ok := dep.(LinkableInterface) - if !ok { - + if !hasLinkableInfo { // handling for a few module types that aren't cc Module but that are also supported + genRule, ok := android.OtherModuleProvider(ctx, dep, android.GeneratedSourceInfoProvider) switch depTag { case genSourceDepTag: - if genRule, ok := dep.(genrule.SourceFileGenerator); ok { + if ok { depPaths.GeneratedSources = append(depPaths.GeneratedSources, - genRule.GeneratedSourceFiles()...) + genRule.GeneratedSourceFiles...) } else { ctx.ModuleErrorf("module %q is not a gensrcs or genrule", depName) } // Support exported headers from a generated_sources dependency fallthrough case genHeaderDepTag, genHeaderExportDepTag: - if genRule, ok := dep.(genrule.SourceFileGenerator); ok { + if ok { depPaths.GeneratedDeps = append(depPaths.GeneratedDeps, - genRule.GeneratedDeps()...) - dirs := genRule.GeneratedHeaderDirs() + genRule.GeneratedDeps...) + dirs := genRule.GeneratedHeaderDirs depPaths.IncludeDirs = append(depPaths.IncludeDirs, dirs...) if depTag == genHeaderExportDepTag { depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, dirs...) depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders, - genRule.GeneratedSourceFiles()...) - depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, genRule.GeneratedDeps()...) + genRule.GeneratedSourceFiles...) + depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, genRule.GeneratedDeps...) // Add these re-exported flags to help header-abi-dumper to infer the abi exported by a library. c.sabi.Properties.ReexportedIncludes = append(c.sabi.Properties.ReexportedIncludes, dirs.Strings()...) - } } else { ctx.ModuleErrorf("module %q is not a genrule", depName) @@ -3144,13 +3207,14 @@ func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps { return } - if dep.Target().Os != ctx.Os() { + commonInfo := android.OtherModuleProviderOrDefault(ctx, dep, android.CommonModuleInfoKey) + if commonInfo.Target.Os != ctx.Os() { ctx.ModuleErrorf("OS mismatch between %q (%s) and %q (%s)", ctx.ModuleName(), ctx.Os().Name, depName, dep.Target().Os.Name) return } - if dep.Target().Arch.ArchType != ctx.Arch().ArchType { + if commonInfo.Target.Arch.ArchType != ctx.Arch().ArchType { ctx.ModuleErrorf("Arch mismatch between %q(%v) and %q(%v)", - ctx.ModuleName(), ctx.Arch().ArchType, depName, dep.Target().Arch.ArchType) + ctx.ModuleName(), ctx.Arch().ArchType, depName, commonInfo.Target.Arch.ArchType) return } @@ -3175,7 +3239,7 @@ func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps { depPaths.LlndkSystemIncludeDirs = append(depPaths.LlndkSystemIncludeDirs, depExporterInfo.SystemIncludeDirs...) } - linkFile := ccDep.OutputFile() + linkFile := linkableInfo.OutputFile if libDepTag, ok := depTag.(libraryDependencyTag); ok { // Only use static unwinder for legacy (min_sdk_version = 29) apexes (b/144430859) @@ -3253,8 +3317,8 @@ func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps { } case libDepTag.static(): - if ccDep.RustLibraryInterface() { - rlibDep := RustRlibDep{LibPath: linkFile.Path(), CrateName: ccDep.CrateName(), LinkDirs: ccDep.ExportedCrateLinkDirs()} + if linkableInfo.RustLibraryInterface { + rlibDep := RustRlibDep{LibPath: linkFile.Path(), CrateName: linkableInfo.CrateName, LinkDirs: linkableInfo.ExportedCrateLinkDirs} depPaths.RustRlibDeps = append(depPaths.RustRlibDeps, rlibDep) depPaths.IncludeDirs = append(depPaths.IncludeDirs, depExporterInfo.IncludeDirs...) if libDepTag.wholeStatic { @@ -3331,8 +3395,8 @@ func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps { } } - if libDepTag.static() && !libDepTag.wholeStatic && !ccDep.RustLibraryInterface() { - if !ccDep.CcLibraryInterface() || !ccDep.Static() { + if libDepTag.static() && !libDepTag.wholeStatic && !linkableInfo.RustLibraryInterface { + if !linkableInfo.CcLibraryInterface || !linkableInfo.Static { ctx.ModuleErrorf("module %q not a static library", depName) return } @@ -3340,16 +3404,15 @@ func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps { // When combining coverage files for shared libraries and executables, coverage files // in static libraries act as if they were whole static libraries. The same goes for // source based Abi dump files. - if c, ok := ccDep.(*Module); ok { - staticLib := c.linker.(libraryInterface) + if hasCcInfo { depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles, - staticLib.objs().coverageFiles...) + linkableInfo.CoverageFiles...) depPaths.StaticLibObjs.sAbiDumpFiles = append(depPaths.StaticLibObjs.sAbiDumpFiles, - staticLib.objs().sAbiDumpFiles...) + linkableInfo.SAbiDumpFiles...) } else { // Handle non-CC modules here depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles, - ccDep.CoverageFiles()...) + linkableInfo.CoverageFiles...) } } @@ -3395,7 +3458,7 @@ func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps { c.sabi.Properties.ReexportedSystemIncludes, depExporterInfo.SystemIncludeDirs.Strings()...) } - makeLibName := MakeLibName(ctx, c, ccDep, ccDep.BaseModuleName()) + libDepTag.makeSuffix + makeLibName := MakeLibName(ccInfo, linkableInfo, &commonInfo, linkableInfo.BaseModuleName) + libDepTag.makeSuffix switch { case libDepTag.header(): c.Properties.AndroidMkHeaderLibs = append( @@ -3406,7 +3469,7 @@ func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps { c.Properties.AndroidMkSharedLibs = append( c.Properties.AndroidMkSharedLibs, makeLibName) case libDepTag.static(): - if !ccDep.RustLibraryInterface() { + if !linkableInfo.RustLibraryInterface { if libDepTag.wholeStatic { c.Properties.AndroidMkWholeStaticLibs = append( c.Properties.AndroidMkWholeStaticLibs, makeLibName) @@ -3422,7 +3485,7 @@ func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps { switch depTag { case runtimeDepTag: c.Properties.AndroidMkRuntimeLibs = append( - c.Properties.AndroidMkRuntimeLibs, MakeLibName(ctx, c, ccDep, ccDep.BaseModuleName())+libDepTag.makeSuffix) + c.Properties.AndroidMkRuntimeLibs, MakeLibName(ccInfo, linkableInfo, &commonInfo, linkableInfo.BaseModuleName)+libDepTag.makeSuffix) case objDepTag: depPaths.Objs.objFiles = append(depPaths.Objs.objFiles, linkFile.Path()) case CrtBeginDepTag: @@ -3476,7 +3539,7 @@ func ShouldUseStubForApex(ctx android.ModuleContext, parent, dep android.Module) useStubs := false - if lib := moduleLibraryInterface(dep); lib.buildStubs() && inVendorOrProduct { // LLNDK + if android.OtherModuleProviderOrDefault(ctx, dep, LinkableInfoProvider).IsStubs && inVendorOrProduct { // LLNDK if !apexInfo.IsForPlatform() { // For platform libraries, use current version of LLNDK // If this is for use_vendor apex we will apply the same rules @@ -3488,7 +3551,7 @@ func ShouldUseStubForApex(ctx android.ModuleContext, parent, dep android.Module) // platform APIs, use stubs only when it is from an APEX (and not from // platform) However, for host, ramdisk, vendor_ramdisk, recovery or // bootstrap modules, always link to non-stub variant - isNotInPlatform := dep.(android.ApexModule).NotInPlatform() + isNotInPlatform := android.OtherModuleProviderOrDefault(ctx, dep, android.CommonModuleInfoKey).NotInPlatform useStubs = isNotInPlatform && !bootstrap } else { @@ -3567,32 +3630,29 @@ func BaseLibName(depName string) string { return libName } -func MakeLibName(ctx android.ModuleContext, c LinkableInterface, ccDep LinkableInterface, depName string) string { +func MakeLibName(ccInfo *CcInfo, linkableInfo *LinkableInfo, commonInfo *android.CommonModuleInfo, depName string) string { libName := BaseLibName(depName) - ccDepModule, _ := ccDep.(*Module) - isLLndk := ccDepModule != nil && ccDepModule.IsLlndk() - nonSystemVariantsExist := ccDep.HasNonSystemVariants() || isLLndk + isLLndk := ccInfo != nil && linkableInfo.IsLlndk + nonSystemVariantsExist := linkableInfo.HasNonSystemVariants || isLLndk - if ccDepModule != nil { + if ccInfo != nil { // Use base module name for snapshots when exporting to Makefile. - if snapshotPrebuilt, ok := ccDepModule.linker.(SnapshotInterface); ok { - baseName := ccDepModule.BaseModuleName() - - return baseName + snapshotPrebuilt.SnapshotAndroidMkSuffix() + if ccInfo.SnapshotInfo != nil { + return linkableInfo.BaseModuleName + ccInfo.SnapshotInfo.SnapshotAndroidMkSuffix } } - if ccDep.InVendorOrProduct() && nonSystemVariantsExist { + if linkableInfo.InVendorOrProduct && nonSystemVariantsExist { // The vendor and product modules in Make will have been renamed to not conflict with the // core module, so update the dependency name here accordingly. - return libName + ccDep.SubName() - } else if ccDep.InRamdisk() && !ccDep.OnlyInRamdisk() { + return libName + linkableInfo.SubName + } else if linkableInfo.InRamdisk && !linkableInfo.OnlyInRamdisk { return libName + RamdiskSuffix - } else if ccDep.InVendorRamdisk() && !ccDep.OnlyInVendorRamdisk() { + } else if linkableInfo.InVendorRamdisk && !linkableInfo.OnlyInVendorRamdisk { return libName + VendorRamdiskSuffix - } else if ccDep.InRecovery() && !ccDep.OnlyInRecovery() { + } else if linkableInfo.InRecovery && !linkableInfo.OnlyInRecovery { return libName + RecoverySuffix - } else if ccDep.Target().NativeBridge == android.NativeBridgeEnabled { + } else if commonInfo.Target.NativeBridge == android.NativeBridgeEnabled { return libName + NativeBridgeSuffix } else { return libName diff --git a/cc/cmake_snapshot.go b/cc/cmake_snapshot.go index a40b863f9..71fbcceda 100644 --- a/cc/cmake_snapshot.go +++ b/cc/cmake_snapshot.go @@ -393,7 +393,7 @@ func (m *CmakeSnapshot) GenerateAndroidBuildActions(ctx android.ModuleContext) { }{ &ctx, dep, - &ccInfo, + ccInfo, m, &pprop, }) diff --git a/cc/library.go b/cc/library.go index 5c2cb5db2..de09d530f 100644 --- a/cc/library.go +++ b/cc/library.go @@ -1225,12 +1225,11 @@ 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)) + if _, ok = android.OtherModuleProvider(ctx, stub, CcInfoProvider); !ok { + panic(fmt.Errorf("stub is not a cc module %s", stub)) } stubsInfo = append(stubsInfo, SharedStubLibrary{ - Version: ccInfo.LibraryInfo.StubsVersion, + Version: android.OtherModuleProviderOrDefault(ctx, stub, LinkableInfoProvider).StubsVersion, SharedLibraryInfo: stubInfo, FlagExporterInfo: flagInfo, }) diff --git a/cc/ndk_library.go b/cc/ndk_library.go index 197a4b252..27a9f66c1 100644 --- a/cc/ndk_library.go +++ b/cc/ndk_library.go @@ -302,12 +302,11 @@ func (this *stubDecorator) findImplementationLibrary(ctx ModuleContext) android. ctx.ModuleErrorf("Could not find implementation for stub: ") return nil } - info, ok := android.OtherModuleProvider(ctx, *dep, CcInfoProvider) - if !ok { + if _, ok := android.OtherModuleProvider(ctx, *dep, CcInfoProvider); !ok { ctx.ModuleErrorf("Implementation for stub is not correct module type") return nil } - output := info.LinkerInfo.UnstrippedOutputFile + output := android.OtherModuleProviderOrDefault(ctx, *dep, LinkableInfoProvider).UnstrippedOutputFile if output == nil { ctx.ModuleErrorf("implementation module (%s) has no output", *dep) return nil diff --git a/cc/tidy.go b/cc/tidy.go index 18e6f3575..23736585a 100644 --- a/cc/tidy.go +++ b/cc/tidy.go @@ -220,7 +220,7 @@ func collectTidyObjModuleTargets(ctx android.SingletonContext, module android.Mo // (1) Collect all obj/tidy files into OS-specific groups. ctx.VisitAllModuleVariantProxies(module, func(variant android.ModuleProxy) { - osName := android.OtherModuleProviderOrDefault(ctx, variant, android.CommonModuleInfoKey).CompileTarget.Os.Name + osName := android.OtherModuleProviderOrDefault(ctx, variant, android.CommonModuleInfoKey).Target.Os.Name info := android.OtherModuleProviderOrDefault(ctx, variant, CcObjectInfoProvider) addToOSGroup(osName, info.ObjFiles, allObjFileGroups, subsetObjFileGroups) addToOSGroup(osName, info.TidyFiles, allTidyFileGroups, subsetTidyFileGroups) diff --git a/genrule/genrule.go b/genrule/genrule.go index 6137c707a..9a8524bc7 100644 --- a/genrule/genrule.go +++ b/genrule/genrule.go @@ -88,9 +88,7 @@ func init() { } type SourceFileGenerator interface { - GeneratedSourceFiles() android.Paths - GeneratedHeaderDirs() android.Paths - GeneratedDeps() android.Paths + android.SourceFileGenerator } // Alias for android.HostToolProvider diff --git a/rust/rust.go b/rust/rust.go index 246670ff3..ba6e29383 100644 --- a/rust/rust.go +++ b/rust/rust.go @@ -34,6 +34,35 @@ import ( var pctx = android.NewPackageContext("android/soong/rust") +type LibraryInfo struct { + Rlib bool + Dylib bool +} + +type CompilerInfo struct { + StdLinkageForDevice RustLinkage + StdLinkageForNonDevice RustLinkage + NoStdlibs bool + LibraryInfo *LibraryInfo +} + +type ProtobufDecoratorInfo struct{} + +type SourceProviderInfo struct { + ProtobufDecoratorInfo *ProtobufDecoratorInfo +} + +type RustInfo struct { + AndroidMkSuffix string + RustSubName string + TransitiveAndroidMkSharedLibs depset.DepSet[string] + CompilerInfo *CompilerInfo + SnapshotInfo *cc.SnapshotInfo + SourceProviderInfo *SourceProviderInfo +} + +var RustInfoProvider = blueprint.NewProvider[*RustInfo]() + func init() { android.RegisterModuleType("rust_defaults", defaultsFactory) android.PreDepsMutators(registerPreDepsMutators) @@ -996,9 +1025,44 @@ func (mod *Module) GenerateAndroidBuildActions(actx android.ModuleContext) { ctx.Phony("rust", ctx.RustModule().OutputFile().Path()) } - android.SetProvider(ctx, cc.LinkableInfoKey, cc.LinkableInfo{ - StaticExecutable: mod.StaticExecutable(), - }) + linkableInfo := cc.CreateCommonLinkableInfo(mod) + linkableInfo.Static = mod.Static() + linkableInfo.Shared = mod.Shared() + linkableInfo.CrateName = mod.CrateName() + linkableInfo.ExportedCrateLinkDirs = mod.ExportedCrateLinkDirs() + android.SetProvider(ctx, cc.LinkableInfoProvider, linkableInfo) + + rustInfo := &RustInfo{ + AndroidMkSuffix: mod.AndroidMkSuffix(), + RustSubName: mod.Properties.RustSubName, + TransitiveAndroidMkSharedLibs: mod.transitiveAndroidMkSharedLibs, + } + if mod.compiler != nil { + rustInfo.CompilerInfo = &CompilerInfo{ + NoStdlibs: mod.compiler.noStdlibs(), + StdLinkageForDevice: mod.compiler.stdLinkage(true), + StdLinkageForNonDevice: mod.compiler.stdLinkage(false), + } + if lib, ok := mod.compiler.(libraryInterface); ok { + rustInfo.CompilerInfo.LibraryInfo = &LibraryInfo{ + Dylib: lib.dylib(), + Rlib: lib.rlib(), + } + } + if lib, ok := mod.compiler.(cc.SnapshotInterface); ok { + rustInfo.SnapshotInfo = &cc.SnapshotInfo{ + SnapshotAndroidMkSuffix: lib.SnapshotAndroidMkSuffix(), + } + } + } + if mod.sourceProvider != nil { + if _, ok := mod.sourceProvider.(*protobufDecorator); ok { + rustInfo.SourceProviderInfo = &SourceProviderInfo{ + ProtobufDecoratorInfo: &ProtobufDecoratorInfo{}, + } + } + } + android.SetProvider(ctx, RustInfoProvider, rustInfo) mod.setOutputFiles(ctx) @@ -1175,21 +1239,21 @@ func (mod *Module) Symlinks() []string { return nil } -func rustMakeLibName(ctx android.ModuleContext, c cc.LinkableInterface, dep cc.LinkableInterface, depName string) string { - if rustDep, ok := dep.(*Module); ok { +func rustMakeLibName(rustInfo *RustInfo, linkableInfo *cc.LinkableInfo, commonInfo *android.CommonModuleInfo, depName string) string { + if rustInfo != nil { // Use base module name for snapshots when exporting to Makefile. - if snapshotPrebuilt, ok := rustDep.compiler.(cc.SnapshotInterface); ok { - baseName := rustDep.BaseModuleName() - return baseName + snapshotPrebuilt.SnapshotAndroidMkSuffix() + rustDep.AndroidMkSuffix() + if rustInfo.SnapshotInfo != nil { + baseName := linkableInfo.BaseModuleName + return baseName + rustInfo.SnapshotInfo.SnapshotAndroidMkSuffix + rustInfo.AndroidMkSuffix } } - return cc.MakeLibName(ctx, c, dep, depName) + return cc.MakeLibName(nil, linkableInfo, commonInfo, depName) } -func collectIncludedProtos(mod *Module, dep *Module) { +func collectIncludedProtos(mod *Module, rustInfo *RustInfo, linkableInfo *cc.LinkableInfo) { if protoMod, ok := mod.sourceProvider.(*protobufDecorator); ok { - if _, ok := dep.sourceProvider.(*protobufDecorator); ok { - protoMod.additionalCrates = append(protoMod.additionalCrates, dep.CrateName()) + if rustInfo.SourceProviderInfo.ProtobufDecoratorInfo != nil { + protoMod.additionalCrates = append(protoMod.additionalCrates, linkableInfo.CrateName) } } } @@ -1197,13 +1261,13 @@ func collectIncludedProtos(mod *Module, dep *Module) { func (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps { var depPaths PathDeps - directRlibDeps := []*Module{} - directDylibDeps := []*Module{} - directProcMacroDeps := []*Module{} + directRlibDeps := []*cc.LinkableInfo{} + directDylibDeps := []*cc.LinkableInfo{} + directProcMacroDeps := []*cc.LinkableInfo{} directSharedLibDeps := []cc.SharedLibraryInfo{} - directStaticLibDeps := [](cc.LinkableInterface){} - directSrcProvidersDeps := []*Module{} - directSrcDeps := [](android.SourceFileProducer){} + directStaticLibDeps := [](*cc.LinkableInfo){} + directSrcProvidersDeps := []*android.ModuleProxy{} + directSrcDeps := []android.SourceFilesInfo{} // For the dependency from platform to apex, use the latest stubs mod.apexSdkVersion = android.FutureApiLevel @@ -1224,7 +1288,7 @@ func (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps { var transitiveAndroidMkSharedLibs []depset.DepSet[string] var directAndroidMkSharedLibs []string - ctx.VisitDirectDeps(func(dep android.Module) { + ctx.VisitDirectDepsProxy(func(dep android.ModuleProxy) { depName := ctx.OtherModuleName(dep) depTag := ctx.OtherModuleDependencyTag(dep) modStdLinkage := mod.compiler.stdLinkage(ctx.Device()) @@ -1237,18 +1301,22 @@ func (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps { return } - if rustDep, ok := dep.(*Module); ok && !rustDep.Static() && !rustDep.Shared() { + rustInfo, hasRustInfo := android.OtherModuleProvider(ctx, dep, RustInfoProvider) + ccInfo, _ := android.OtherModuleProvider(ctx, dep, cc.CcInfoProvider) + linkableInfo, hasLinkableInfo := android.OtherModuleProvider(ctx, dep, cc.LinkableInfoProvider) + commonInfo := android.OtherModuleProviderOrDefault(ctx, dep, android.CommonModuleInfoKey) + if hasRustInfo && !linkableInfo.Static && !linkableInfo.Shared { //Handle Rust Modules - makeLibName := rustMakeLibName(ctx, mod, rustDep, depName+rustDep.Properties.RustSubName) + makeLibName := rustMakeLibName(rustInfo, linkableInfo, &commonInfo, depName+rustInfo.RustSubName) switch { case depTag == dylibDepTag: - dylib, ok := rustDep.compiler.(libraryInterface) - if !ok || !dylib.dylib() { + dylib := rustInfo.CompilerInfo.LibraryInfo + if dylib == nil || !dylib.Dylib { ctx.ModuleErrorf("mod %q not an dylib library", depName) return } - directDylibDeps = append(directDylibDeps, rustDep) + directDylibDeps = append(directDylibDeps, linkableInfo) mod.Properties.AndroidMkDylibs = append(mod.Properties.AndroidMkDylibs, makeLibName) mod.Properties.SnapshotDylibs = append(mod.Properties.SnapshotDylibs, cc.BaseLibName(depName)) @@ -1257,8 +1325,11 @@ 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 !rustInfo.CompilerInfo.NoStdlibs { + rustDepStdLinkage := rustInfo.CompilerInfo.StdLinkageForNonDevice + if ctx.Device() { + rustDepStdLinkage = rustInfo.CompilerInfo.StdLinkageForDevice + } if rustDepStdLinkage != modStdLinkage { ctx.ModuleErrorf("Rust dependency %q has the wrong StdLinkage; expected %#v, got %#v", depName, modStdLinkage, rustDepStdLinkage) return @@ -1266,27 +1337,30 @@ func (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps { } case depTag == rlibDepTag: - rlib, ok := rustDep.compiler.(libraryInterface) - if !ok || !rlib.rlib() { + rlib := rustInfo.CompilerInfo.LibraryInfo + if rlib == nil || !rlib.Rlib { ctx.ModuleErrorf("mod %q not an rlib library", makeLibName) return } - directRlibDeps = append(directRlibDeps, rustDep) + directRlibDeps = append(directRlibDeps, linkableInfo) mod.Properties.AndroidMkRlibs = append(mod.Properties.AndroidMkRlibs, makeLibName) mod.Properties.SnapshotRlibs = append(mod.Properties.SnapshotRlibs, cc.BaseLibName(depName)) // rust_ffi rlibs may export include dirs, so collect those here. exportedInfo, _ := android.OtherModuleProvider(ctx, dep, cc.FlagExporterInfoProvider) depPaths.depIncludePaths = append(depPaths.depIncludePaths, exportedInfo.IncludeDirs...) - depPaths.exportedLinkDirs = append(depPaths.exportedLinkDirs, linkPathFromFilePath(rustDep.OutputFile().Path())) + depPaths.exportedLinkDirs = append(depPaths.exportedLinkDirs, linkPathFromFilePath(linkableInfo.OutputFile.Path())) // rlibs are not installed, so don't add the output file to directImplementationDeps if info, ok := android.OtherModuleProvider(ctx, dep, cc.ImplementationDepInfoProvider); ok { depPaths.transitiveImplementationDeps = append(depPaths.transitiveImplementationDeps, info.ImplementationDeps) } - if !rustDep.compiler.noStdlibs() { - rustDepStdLinkage := rustDep.compiler.stdLinkage(ctx.Device()) + if !rustInfo.CompilerInfo.NoStdlibs { + rustDepStdLinkage := rustInfo.CompilerInfo.StdLinkageForNonDevice + if ctx.Device() { + rustDepStdLinkage = rustInfo.CompilerInfo.StdLinkageForDevice + } if rustDepStdLinkage != modStdLinkage { ctx.ModuleErrorf("Rust dependency %q has the wrong StdLinkage; expected %#v, got %#v", depName, modStdLinkage, rustDepStdLinkage) return @@ -1294,14 +1368,14 @@ func (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps { } case depTag == procMacroDepTag: - directProcMacroDeps = append(directProcMacroDeps, rustDep) + directProcMacroDeps = append(directProcMacroDeps, linkableInfo) mod.Properties.AndroidMkProcMacroLibs = append(mod.Properties.AndroidMkProcMacroLibs, makeLibName) // proc_macro link dirs need to be exported, so collect those here. - depPaths.exportedLinkDirs = append(depPaths.exportedLinkDirs, linkPathFromFilePath(rustDep.OutputFile().Path())) + depPaths.exportedLinkDirs = append(depPaths.exportedLinkDirs, linkPathFromFilePath(linkableInfo.OutputFile.Path())) case depTag == sourceDepTag: if _, ok := mod.sourceProvider.(*protobufDecorator); ok { - collectIncludedProtos(mod, rustDep) + collectIncludedProtos(mod, rustInfo, linkableInfo) } case cc.IsStaticDepTag(depTag): // Rust FFI rlibs should not be declared in a Rust modules @@ -1314,7 +1388,7 @@ func (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps { } - transitiveAndroidMkSharedLibs = append(transitiveAndroidMkSharedLibs, rustDep.transitiveAndroidMkSharedLibs) + transitiveAndroidMkSharedLibs = append(transitiveAndroidMkSharedLibs, rustInfo.TransitiveAndroidMkSharedLibs) if android.IsSourceDepTagWithOutputTag(depTag, "") { // Since these deps are added in path_properties.go via AddDependencies, we need to ensure the correct @@ -1326,14 +1400,14 @@ func (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps { helper = "device module defined?" } - if dep.Target().Os != ctx.Os() { + if commonInfo.Target.Os != ctx.Os() { ctx.ModuleErrorf("OS mismatch on dependency %q (%s)", dep.Name(), helper) return - } else if dep.Target().Arch.ArchType != ctx.Arch().ArchType { + } else if commonInfo.Target.Arch.ArchType != ctx.Arch().ArchType { ctx.ModuleErrorf("Arch mismatch on dependency %q (%s)", dep.Name(), helper) return } - directSrcProvidersDeps = append(directSrcProvidersDeps, rustDep) + directSrcProvidersDeps = append(directSrcProvidersDeps, &dep) } exportedInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider) @@ -1345,7 +1419,7 @@ func (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps { } if depTag == dylibDepTag || depTag == rlibDepTag || depTag == procMacroDepTag { - linkFile := rustDep.UnstrippedOutputFile() + linkFile := linkableInfo.UnstrippedOutputFile linkDir := linkPathFromFilePath(linkFile) if lib, ok := mod.compiler.(exportedFlagsProducer); ok { lib.exportLinkDirs(linkDir) @@ -1354,26 +1428,26 @@ func (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps { if depTag == sourceDepTag { if _, ok := mod.sourceProvider.(*protobufDecorator); ok && mod.Source() { - if _, ok := rustDep.sourceProvider.(*protobufDecorator); ok { + if rustInfo.SourceProviderInfo.ProtobufDecoratorInfo != nil { exportedInfo, _ := android.OtherModuleProvider(ctx, dep, cc.FlagExporterInfoProvider) depPaths.depIncludePaths = append(depPaths.depIncludePaths, exportedInfo.IncludeDirs...) } } } - } else if ccDep, ok := dep.(cc.LinkableInterface); ok { + } else if hasLinkableInfo { //Handle C dependencies - makeLibName := cc.MakeLibName(ctx, mod, ccDep, depName) - if _, ok := ccDep.(*Module); !ok { - if ccDep.Module().Target().Os != ctx.Os() { + makeLibName := cc.MakeLibName(ccInfo, linkableInfo, &commonInfo, depName) + if !hasRustInfo { + if commonInfo.Target.Os != ctx.Os() { ctx.ModuleErrorf("OS mismatch between %q and %q", ctx.ModuleName(), depName) return } - if ccDep.Module().Target().Arch.ArchType != ctx.Arch().ArchType { + if commonInfo.Target.Arch.ArchType != ctx.Arch().ArchType { ctx.ModuleErrorf("Arch mismatch between %q and %q", ctx.ModuleName(), depName) return } } - linkObject := ccDep.OutputFile() + linkObject := linkableInfo.OutputFile if !linkObject.Valid() { if !ctx.Config().AllowMissingDependencies() { ctx.ModuleErrorf("Invalid output file when adding dep %q to %q", depName, ctx.ModuleName()) @@ -1413,7 +1487,7 @@ func (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps { depPaths.depSystemIncludePaths = append(depPaths.depSystemIncludePaths, exportedInfo.SystemIncludeDirs...) depPaths.depClangFlags = append(depPaths.depClangFlags, exportedInfo.Flags...) depPaths.depGeneratedHeaders = append(depPaths.depGeneratedHeaders, exportedInfo.GeneratedHeaders...) - directStaticLibDeps = append(directStaticLibDeps, ccDep) + directStaticLibDeps = append(directStaticLibDeps, linkableInfo) // Record baseLibName for snapshots. mod.Properties.SnapshotStaticLibs = append(mod.Properties.SnapshotStaticLibs, cc.BaseLibName(depName)) @@ -1484,7 +1558,7 @@ func (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps { } } - if srcDep, ok := dep.(android.SourceFileProducer); ok { + if srcDep, ok := android.OtherModuleProvider(ctx, dep, android.SourceFilesInfoKey); ok { if android.IsSourceDepTagWithOutputTag(depTag, "") { // These are usually genrules which don't have per-target variants. directSrcDeps = append(directSrcDeps, srcDep) @@ -1497,32 +1571,32 @@ func (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps { var rlibDepFiles RustLibraries aliases := mod.compiler.Aliases() for _, dep := range directRlibDeps { - crateName := dep.CrateName() + crateName := dep.CrateName if alias, aliased := aliases[crateName]; aliased { crateName = alias } - rlibDepFiles = append(rlibDepFiles, RustLibrary{Path: dep.UnstrippedOutputFile(), CrateName: crateName}) + rlibDepFiles = append(rlibDepFiles, RustLibrary{Path: dep.UnstrippedOutputFile, CrateName: crateName}) } var dylibDepFiles RustLibraries for _, dep := range directDylibDeps { - crateName := dep.CrateName() + crateName := dep.CrateName if alias, aliased := aliases[crateName]; aliased { crateName = alias } - dylibDepFiles = append(dylibDepFiles, RustLibrary{Path: dep.UnstrippedOutputFile(), CrateName: crateName}) + dylibDepFiles = append(dylibDepFiles, RustLibrary{Path: dep.UnstrippedOutputFile, CrateName: crateName}) } var procMacroDepFiles RustLibraries for _, dep := range directProcMacroDeps { - crateName := dep.CrateName() + crateName := dep.CrateName if alias, aliased := aliases[crateName]; aliased { crateName = alias } - procMacroDepFiles = append(procMacroDepFiles, RustLibrary{Path: dep.UnstrippedOutputFile(), CrateName: crateName}) + procMacroDepFiles = append(procMacroDepFiles, RustLibrary{Path: dep.UnstrippedOutputFile, CrateName: crateName}) } var staticLibDepFiles android.Paths for _, dep := range directStaticLibDeps { - staticLibDepFiles = append(staticLibDepFiles, dep.OutputFile().Path()) + staticLibDepFiles = append(staticLibDepFiles, dep.OutputFile.Path()) } var sharedLibFiles android.Paths @@ -1538,11 +1612,11 @@ func (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps { var srcProviderDepFiles android.Paths for _, dep := range directSrcProvidersDeps { - srcs := android.OutputFilesForModule(ctx, dep, "") + srcs := android.OutputFilesForModule(ctx, *dep, "") srcProviderDepFiles = append(srcProviderDepFiles, srcs...) } for _, dep := range directSrcDeps { - srcs := dep.Srcs() + srcs := dep.Srcs srcProviderDepFiles = append(srcProviderDepFiles, srcs...) } |