diff options
author | 2025-01-10 11:19:03 -0800 | |
---|---|---|
committer | 2025-01-10 11:19:03 -0800 | |
commit | 6aca2bb0198b851b1a7bbbfad2f746c4b8ca82f0 (patch) | |
tree | 85e90c0833b5fd29f011ad9ddc3a81aaa9d6f3a7 | |
parent | 8bf5dd84f87665c85bd0db273ca8d1c434da7b0a (diff) | |
parent | 8a8d5b4b1c714707faf2b9456099ac95fad74b7a (diff) |
Merge changes Ie3b6d1f8,Id465f293 into main
* changes:
Convert CollectAllSharedDependencies to use ModuleProxy.
Convert depsToPaths to use ModuleProxy for both cc and rust.
-rw-r--r-- | android/module.go | 39 | ||||
-rw-r--r-- | android/prebuilt.go | 2 | ||||
-rw-r--r-- | apex/apex.go | 6 | ||||
-rw-r--r-- | cc/cc.go | 217 | ||||
-rw-r--r-- | cc/cmake_snapshot.go | 2 | ||||
-rw-r--r-- | cc/fuzz.go | 45 | ||||
-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 |
11 files changed, 350 insertions, 169 deletions
diff --git a/android/module.go b/android/module.go index 2f505aa30..e4a590457 100644 --- a/android/module.go +++ b/android/module.go @@ -1867,12 +1867,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 @@ -1884,11 +1886,11 @@ type CommonModuleInfo struct { var CommonModuleInfoKey = blueprint.NewProvider[CommonModuleInfo]() -type PrebuiltModuleProviderData struct { - // Empty for now +type PrebuiltModuleInfo struct { + SourceExists bool } -var PrebuiltModuleProviderKey = blueprint.NewProvider[PrebuiltModuleProviderData]() +var PrebuiltModuleInfoProvider = blueprint.NewProvider[PrebuiltModuleInfo]() type HostToolProviderData struct { HostToolPath OptionalPath @@ -1896,6 +1898,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, @@ -2146,7 +2162,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, @@ -2172,10 +2188,13 @@ 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 { - SetProvider(ctx, PrebuiltModuleProviderKey, PrebuiltModuleProviderData{}) + SetProvider(ctx, PrebuiltModuleInfoProvider, PrebuiltModuleInfo{ + SourceExists: p.Prebuilt().SourceExists(), + }) } if h, ok := m.module.(HostToolProvider); ok { SetProvider(ctx, HostToolProviderKey, HostToolProviderData{ @@ -2185,6 +2204,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/android/prebuilt.go b/android/prebuilt.go index 0ac67b3f4..bf2717865 100644 --- a/android/prebuilt.go +++ b/android/prebuilt.go @@ -384,7 +384,7 @@ func PrebuiltGetPreferred(ctx BaseModuleContext, module Module) Module { if !OtherModuleProviderOrDefault(ctx, module, CommonModuleInfoKey).ReplacedByPrebuilt { return module } - if _, ok := OtherModuleProvider(ctx, module, PrebuiltModuleProviderKey); ok { + if _, ok := OtherModuleProvider(ctx, module, PrebuiltModuleInfoProvider); ok { // If we're given a prebuilt then assume there's no source module around. return module } diff --git a/apex/apex.go b/apex/apex.go index d1d3d97d0..d39a17fe7 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,14 +78,14 @@ 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 TestBinaryInfo *TestBinaryInfo BenchmarkDecoratorInfo *BenchmarkDecoratorInfo ObjectLinkerInfo *ObjectLinkerInfo + StubDecoratorInfo *StubDecoratorInfo } type BinaryDecoratorInfo struct{} @@ -95,34 +94,71 @@ type LibraryDecoratorInfo struct { InjectBsslHash bool } -type LibraryInfo struct { - StubsVersion string +type SnapshotInfo struct { + SnapshotAndroidMkSuffix string } type TestBinaryInfo struct { Gtest bool } type BenchmarkDecoratorInfo struct{} + +type StubDecoratorInfo struct{} + type ObjectLinkerInfo struct{} +type LibraryInfo struct { + BuildStubs bool +} + // Common info about the cc module. type CcInfo struct { - HasStubsVariants bool IsPrebuilt bool CmakeSnapshotSupported bool CompilerInfo *CompilerInfo LinkerInfo *LinkerInfo + SnapshotInfo *SnapshotInfo LibraryInfo *LibraryInfo } -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 + CcLibrary bool + 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 + Installable *bool +} + +var LinkableInfoProvider = blueprint.NewProvider[*LinkableInfo]() func init() { RegisterCCBuildComponents(android.InitRegistrationContext) @@ -2182,12 +2218,21 @@ 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.Shared = library.shared() + 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 +2256,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: @@ -2232,14 +2276,22 @@ func (c *Module) GenerateAndroidBuildActions(actx android.ModuleContext) { ccInfo.LinkerInfo.BenchmarkDecoratorInfo = &BenchmarkDecoratorInfo{} case *objectLinker: ccInfo.LinkerInfo.ObjectLinkerInfo = &ObjectLinkerInfo{} + case *stubDecorator: + ccInfo.LinkerInfo.StubDecoratorInfo = &StubDecoratorInfo{} + } + + if s, ok := c.linker.(SnapshotInterface); ok { + ccInfo.SnapshotInfo = &SnapshotInfo{ + SnapshotAndroidMkSuffix: s.SnapshotAndroidMkSuffix(), + } } } if c.library != nil { ccInfo.LibraryInfo = &LibraryInfo{ - StubsVersion: c.library.stubsVersion(), + BuildStubs: c.library.buildStubs(), } } - android.SetProvider(ctx, CcInfoProvider, ccInfo) + android.SetProvider(ctx, CcInfoProvider, &ccInfo) c.setOutputFiles(ctx) @@ -2248,6 +2300,31 @@ 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(), + CcLibrary: mod.CcLibrary(), + 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(), + Installable: mod.Installable(), + } +} + func setOutputFilesIfNotEmpty(ctx ModuleContext, files android.Paths, tag string) { if len(files) > 0 { ctx.SetOutputFiles(files, tag) @@ -3073,7 +3150,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 +3159,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 +3182,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 +3228,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 +3260,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 +3338,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 +3416,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 +3425,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 +3479,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 +3490,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 +3506,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 +3560,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 +3572,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 +3651,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/fuzz.go b/cc/fuzz.go index 911a81c18..056b0dafe 100644 --- a/cc/fuzz.go +++ b/cc/fuzz.go @@ -211,29 +211,30 @@ func (fuzz *fuzzBinary) moduleInfoJSON(ctx ModuleContext, moduleInfoJSON *androi moduleInfoJSON.Class = []string{"EXECUTABLES"} } -// IsValidSharedDependency takes a module and determines if it is a unique shared library +// isValidSharedDependency takes a module and determines if it is a unique shared library // that should be installed in the fuzz target output directories. This function // returns true, unless: // - The module is not an installable shared library, or // - The module is a header or stub, or // - The module is a prebuilt and its source is available, or // - The module is a versioned member of an SDK snapshot. -func IsValidSharedDependency(dependency android.Module) bool { +func isValidSharedDependency(ctx android.ModuleContext, dependency android.ModuleProxy) bool { // TODO(b/144090547): We should be parsing these modules using // ModuleDependencyTag instead of the current brute-force checking. - linkable, ok := dependency.(LinkableInterface) - if !ok || !linkable.CcLibraryInterface() { + linkable, ok := android.OtherModuleProvider(ctx, dependency, LinkableInfoProvider) + if !ok || !linkable.CcLibraryInterface { // Discard non-linkables. return false } - if !linkable.Shared() { + if !linkable.Shared { // Discard static libs. return false } - if lib := moduleLibraryInterface(dependency); lib != nil && lib.buildStubs() && linkable.CcLibrary() { + ccInfo, hasCcInfo := android.OtherModuleProvider(ctx, dependency, CcInfoProvider) + if hasCcInfo && ccInfo.LibraryInfo != nil && ccInfo.LibraryInfo.BuildStubs && linkable.CcLibrary { // Discard stubs libs (only CCLibrary variants). Prebuilt libraries should not // be excluded on the basis of they're not CCLibrary()'s. return false @@ -242,13 +243,13 @@ func IsValidSharedDependency(dependency android.Module) bool { // We discarded module stubs libraries above, but the LLNDK prebuilts stubs // libraries must be handled differently - by looking for the stubDecorator. // Discard LLNDK prebuilts stubs as well. - if ccLibrary, isCcLibrary := dependency.(*Module); isCcLibrary { - if _, isLLndkStubLibrary := ccLibrary.linker.(*stubDecorator); isLLndkStubLibrary { + if hasCcInfo { + if ccInfo.LinkerInfo.StubDecoratorInfo != nil { return false } // Discard installable:false libraries because they are expected to be absent // in runtime. - if !proptools.BoolDefault(ccLibrary.Installable(), true) { + if !proptools.BoolDefault(linkable.Installable, true) { return false } } @@ -256,7 +257,7 @@ func IsValidSharedDependency(dependency android.Module) bool { // If the same library is present both as source and a prebuilt we must pick // only one to avoid a conflict. Always prefer the source since the prebuilt // probably won't be built with sanitizers enabled. - if prebuilt := android.GetEmbeddedPrebuilt(dependency); prebuilt != nil && prebuilt.SourceExists() { + if prebuilt, ok := android.OtherModuleProvider(ctx, dependency, android.PrebuiltModuleInfoProvider); ok && prebuilt.SourceExists { return false } @@ -607,17 +608,17 @@ func GetSharedLibsToZip(sharedLibraries android.RuleBuilderInstalls, module Link // VisitDirectDeps is used first to avoid incorrectly using the core libraries (sanitizer // runtimes, libc, libdl, etc.) from a dependency. This may cause issues when dependencies // have explicit sanitizer tags, as we may get a dependency on an unsanitized libc, etc. -func CollectAllSharedDependencies(ctx android.ModuleContext) (android.RuleBuilderInstalls, []android.Module) { +func CollectAllSharedDependencies(ctx android.ModuleContext) (android.RuleBuilderInstalls, []android.ModuleProxy) { seen := make(map[string]bool) recursed := make(map[string]bool) - deps := []android.Module{} + deps := []android.ModuleProxy{} var sharedLibraries android.RuleBuilderInstalls // Enumerate the first level of dependencies, as we discard all non-library // modules in the BFS loop below. - ctx.VisitDirectDeps(func(dep android.Module) { - if !IsValidSharedDependency(dep) { + ctx.VisitDirectDepsProxy(func(dep android.ModuleProxy) { + if !isValidSharedDependency(ctx, dep) { return } sharedLibraryInfo, hasSharedLibraryInfo := android.OtherModuleProvider(ctx, dep, SharedLibraryInfoProvider) @@ -635,19 +636,21 @@ func CollectAllSharedDependencies(ctx android.ModuleContext) (android.RuleBuilde sharedLibraries = append(sharedLibraries, ruleBuilderInstall) }) - ctx.WalkDeps(func(child, parent android.Module) bool { + ctx.WalkDepsProxy(func(child, _ android.ModuleProxy) 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_static) - if rustmod, ok := child.(LinkableInterface); ok && rustmod.RustLibraryInterface() && !rustmod.Shared() { - if recursed[ctx.OtherModuleName(child)] { - return false + if info, ok := android.OtherModuleProvider(ctx, child, LinkableInfoProvider); ok { + if info.RustLibraryInterface && !info.Shared { + if recursed[ctx.OtherModuleName(child)] { + return false + } + recursed[ctx.OtherModuleName(child)] = true + return true } - recursed[ctx.OtherModuleName(child)] = true - return true } - if !IsValidSharedDependency(child) { + if !isValidSharedDependency(ctx, child) { return false } sharedLibraryInfo, hasSharedLibraryInfo := android.OtherModuleProvider(ctx, child, SharedLibraryInfoProvider) diff --git a/cc/library.go b/cc/library.go index 8262d8bb1..05661828b 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...) } |