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
diff --git a/cc/cc.go b/cc/cc.go
index c9d2926..16471c9 100644
--- a/cc/cc.go
+++ b/cc/cc.go
@@ -34,7 +34,6 @@
"android/soong/android"
"android/soong/cc/config"
"android/soong/fuzz"
- "android/soong/genrule"
)
type CcMakeVarsInfo struct {
@@ -79,8 +78,7 @@
// 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 @@
InjectBsslHash bool
}
-type LibraryInfo struct {
- StubsVersion string
+type SnapshotInfo struct {
+ SnapshotAndroidMkSuffix string
}
type TestBinaryInfo struct {
@@ -107,22 +105,49 @@
// 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
+ 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 LinkableInfoKey = blueprint.NewProvider[LinkableInfo]()
+var LinkableInfoProvider = blueprint.NewProvider[*LinkableInfo]()
func init() {
RegisterCCBuildComponents(android.InitRegistrationContext)
@@ -2182,12 +2207,20 @@
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 @@
}
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 @@
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 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 @@
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 @@
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 @@
}
}
- 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 @@
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 @@
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 @@
}
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 @@
}
}
- 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 @@
// 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 @@
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 @@
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 @@
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 @@
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 @@
// 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 @@
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 a40b863..71fbcce 100644
--- a/cc/cmake_snapshot.go
+++ b/cc/cmake_snapshot.go
@@ -393,7 +393,7 @@
}{
&ctx,
dep,
- &ccInfo,
+ ccInfo,
m,
&pprop,
})
diff --git a/cc/library.go b/cc/library.go
index 5c2cb5d..de09d53 100644
--- a/cc/library.go
+++ b/cc/library.go
@@ -1225,12 +1225,11 @@
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 197a4b2..27a9f66 100644
--- a/cc/ndk_library.go
+++ b/cc/ndk_library.go
@@ -302,12 +302,11 @@
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 18e6f35..2373658 100644
--- a/cc/tidy.go
+++ b/cc/tidy.go
@@ -220,7 +220,7 @@
// (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)