rust: Suppress default sysroot unconditionally
With proper prebuilt modules, we can avoid any rustc implicit sysroot searching. Asd a bonus, this should make rust-project.json generation correctly grab otherwise implicit dependencies. Prebuilt rlibs may include several dependency rlibs. Without a link_dirs attribute, every dependency (even if unexported) would need a separate module. Previously we were casing out on exact structs, which might be OK when libraryDecorator and procMacroDecorator were the only possibilities, but repeating the logic for three types is too much. Using an interface makes this logic scale better. Bug: 159591910 Test: cd external/rust; mma; m crosvm.experimental Change-Id: Ia1124e09f48cd05e39f094bbcb988622ebd2272f
This commit is contained in:
61
rust/rust.go
61
rust/rust.go
@@ -262,6 +262,43 @@ type compiler interface {
|
||||
nativeCoverage() bool
|
||||
}
|
||||
|
||||
type exportedFlagsProducer interface {
|
||||
exportedLinkDirs() []string
|
||||
exportedDepFlags() []string
|
||||
exportLinkDirs(...string)
|
||||
exportDepFlags(...string)
|
||||
}
|
||||
|
||||
type flagExporter struct {
|
||||
depFlags []string
|
||||
linkDirs []string
|
||||
}
|
||||
|
||||
func (flagExporter *flagExporter) exportedLinkDirs() []string {
|
||||
return flagExporter.linkDirs
|
||||
}
|
||||
|
||||
func (flagExporter *flagExporter) exportedDepFlags() []string {
|
||||
return flagExporter.depFlags
|
||||
}
|
||||
|
||||
func (flagExporter *flagExporter) exportLinkDirs(dirs ...string) {
|
||||
flagExporter.linkDirs = android.FirstUniqueStrings(append(flagExporter.linkDirs, dirs...))
|
||||
}
|
||||
|
||||
func (flagExporter *flagExporter) exportDepFlags(flags ...string) {
|
||||
flagExporter.depFlags = android.FirstUniqueStrings(append(flagExporter.depFlags, flags...))
|
||||
}
|
||||
|
||||
var _ exportedFlagsProducer = (*flagExporter)(nil)
|
||||
|
||||
func NewFlagExporter() *flagExporter {
|
||||
return &flagExporter{
|
||||
depFlags: []string{},
|
||||
linkDirs: []string{},
|
||||
}
|
||||
}
|
||||
|
||||
func (mod *Module) isCoverageVariant() bool {
|
||||
return mod.coverage.Properties.IsCoverageVariant
|
||||
}
|
||||
@@ -416,7 +453,7 @@ func (mod *Module) Module() android.Module {
|
||||
func (mod *Module) StubsVersions() []string {
|
||||
// For now, Rust has no stubs versions.
|
||||
if mod.compiler != nil {
|
||||
if _, ok := mod.compiler.(*libraryDecorator); ok {
|
||||
if _, ok := mod.compiler.(libraryInterface); ok {
|
||||
return []string{}
|
||||
}
|
||||
}
|
||||
@@ -708,19 +745,15 @@ func (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
|
||||
}
|
||||
|
||||
//Append the dependencies exportedDirs
|
||||
if lib, ok := rustDep.compiler.(*libraryDecorator); ok {
|
||||
depPaths.linkDirs = append(depPaths.linkDirs, lib.exportedDirs()...)
|
||||
if lib, ok := rustDep.compiler.(exportedFlagsProducer); ok {
|
||||
depPaths.linkDirs = append(depPaths.linkDirs, lib.exportedLinkDirs()...)
|
||||
depPaths.depFlags = append(depPaths.depFlags, lib.exportedDepFlags()...)
|
||||
}
|
||||
|
||||
// Append this dependencies output to this mod's linkDirs so they can be exported to dependencies
|
||||
// This can be probably be refactored by defining a common exporter interface similar to cc's
|
||||
if depTag == dylibDepTag || depTag == rlibDepTag || depTag == procMacroDepTag {
|
||||
linkDir := linkPathFromFilePath(linkFile.Path())
|
||||
if lib, ok := mod.compiler.(*libraryDecorator); ok {
|
||||
lib.linkDirs = append(lib.linkDirs, linkDir)
|
||||
} else if procMacro, ok := mod.compiler.(*procMacroDecorator); ok {
|
||||
procMacro.linkDirs = append(procMacro.linkDirs, linkDir)
|
||||
if lib, ok := mod.compiler.(exportedFlagsProducer); ok {
|
||||
lib.exportLinkDirs(linkDir)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -771,14 +804,10 @@ func (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
|
||||
}
|
||||
|
||||
// Make sure these dependencies are propagated
|
||||
if lib, ok := mod.compiler.(*libraryDecorator); ok && exportDep {
|
||||
lib.linkDirs = append(lib.linkDirs, linkPath)
|
||||
lib.depFlags = append(lib.depFlags, depFlag)
|
||||
} else if procMacro, ok := mod.compiler.(*procMacroDecorator); ok && exportDep {
|
||||
procMacro.linkDirs = append(procMacro.linkDirs, linkPath)
|
||||
procMacro.depFlags = append(procMacro.depFlags, depFlag)
|
||||
if lib, ok := mod.compiler.(exportedFlagsProducer); ok && exportDep {
|
||||
lib.exportLinkDirs(linkPath)
|
||||
lib.exportDepFlags(depFlag)
|
||||
}
|
||||
|
||||
}
|
||||
})
|
||||
|
||||
|
Reference in New Issue
Block a user