Merge "[rust] Pass cc dependencies as linker flags."
This commit is contained in:
64
rust/rust.go
64
rust/rust.go
@@ -244,13 +244,14 @@ type Deps struct {
|
||||
}
|
||||
|
||||
type PathDeps struct {
|
||||
DyLibs RustLibraries
|
||||
RLibs RustLibraries
|
||||
SharedLibs android.Paths
|
||||
StaticLibs android.Paths
|
||||
ProcMacros RustLibraries
|
||||
linkDirs []string
|
||||
depFlags []string
|
||||
DyLibs RustLibraries
|
||||
RLibs RustLibraries
|
||||
SharedLibs android.Paths
|
||||
StaticLibs android.Paths
|
||||
ProcMacros RustLibraries
|
||||
linkDirs []string
|
||||
depFlags []string
|
||||
linkObjects []string
|
||||
//ReexportedDeps android.Paths
|
||||
|
||||
// Used by bindgen modules which call clang
|
||||
@@ -296,13 +297,16 @@ type compiler interface {
|
||||
type exportedFlagsProducer interface {
|
||||
exportedLinkDirs() []string
|
||||
exportedDepFlags() []string
|
||||
exportedLinkObjects() []string
|
||||
exportLinkDirs(...string)
|
||||
exportDepFlags(...string)
|
||||
exportLinkObjects(...string)
|
||||
}
|
||||
|
||||
type flagExporter struct {
|
||||
depFlags []string
|
||||
linkDirs []string
|
||||
depFlags []string
|
||||
linkDirs []string
|
||||
linkObjects []string
|
||||
}
|
||||
|
||||
func (flagExporter *flagExporter) exportedLinkDirs() []string {
|
||||
@@ -313,6 +317,10 @@ func (flagExporter *flagExporter) exportedDepFlags() []string {
|
||||
return flagExporter.depFlags
|
||||
}
|
||||
|
||||
func (flagExporter *flagExporter) exportedLinkObjects() []string {
|
||||
return flagExporter.linkObjects
|
||||
}
|
||||
|
||||
func (flagExporter *flagExporter) exportLinkDirs(dirs ...string) {
|
||||
flagExporter.linkDirs = android.FirstUniqueStrings(append(flagExporter.linkDirs, dirs...))
|
||||
}
|
||||
@@ -321,12 +329,17 @@ func (flagExporter *flagExporter) exportDepFlags(flags ...string) {
|
||||
flagExporter.depFlags = android.FirstUniqueStrings(append(flagExporter.depFlags, flags...))
|
||||
}
|
||||
|
||||
func (flagExporter *flagExporter) exportLinkObjects(flags ...string) {
|
||||
flagExporter.linkObjects = android.FirstUniqueStrings(append(flagExporter.linkObjects, flags...))
|
||||
}
|
||||
|
||||
var _ exportedFlagsProducer = (*flagExporter)(nil)
|
||||
|
||||
func NewFlagExporter() *flagExporter {
|
||||
return &flagExporter{
|
||||
depFlags: []string{},
|
||||
linkDirs: []string{},
|
||||
depFlags: []string{},
|
||||
linkDirs: []string{},
|
||||
linkObjects: []string{},
|
||||
}
|
||||
}
|
||||
|
||||
@@ -813,6 +826,7 @@ func (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
|
||||
if lib, ok := rustDep.compiler.(exportedFlagsProducer); ok && depTag != procMacroDepTag {
|
||||
depPaths.linkDirs = append(depPaths.linkDirs, lib.exportedLinkDirs()...)
|
||||
depPaths.depFlags = append(depPaths.depFlags, lib.exportedDepFlags()...)
|
||||
depPaths.linkObjects = append(depPaths.linkObjects, lib.exportedLinkObjects()...)
|
||||
}
|
||||
|
||||
if depTag == dylibDepTag || depTag == rlibDepTag || depTag == procMacroDepTag {
|
||||
@@ -840,21 +854,18 @@ func (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
|
||||
return
|
||||
}
|
||||
}
|
||||
linkFile := ccDep.OutputFile()
|
||||
linkPath := linkPathFromFilePath(linkFile.Path())
|
||||
libName := libNameFromFilePath(linkFile.Path())
|
||||
depFlag := "-l" + libName
|
||||
linkObject := ccDep.OutputFile()
|
||||
linkPath := linkPathFromFilePath(linkObject.Path())
|
||||
|
||||
if !linkFile.Valid() {
|
||||
if !linkObject.Valid() {
|
||||
ctx.ModuleErrorf("Invalid output file when adding dep %q to %q", depName, ctx.ModuleName())
|
||||
}
|
||||
|
||||
exportDep := false
|
||||
switch {
|
||||
case cc.IsStaticDepTag(depTag):
|
||||
depFlag = "-lstatic=" + libName
|
||||
depPaths.linkDirs = append(depPaths.linkDirs, linkPath)
|
||||
depPaths.depFlags = append(depPaths.depFlags, depFlag)
|
||||
depPaths.linkObjects = append(depPaths.linkObjects, linkObject.String())
|
||||
depPaths.depIncludePaths = append(depPaths.depIncludePaths, ccDep.IncludeDirs()...)
|
||||
if mod, ok := ccDep.(*cc.Module); ok {
|
||||
depPaths.depSystemIncludePaths = append(depPaths.depSystemIncludePaths, mod.ExportedSystemIncludeDirs()...)
|
||||
@@ -864,9 +875,8 @@ func (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
|
||||
directStaticLibDeps = append(directStaticLibDeps, ccDep)
|
||||
mod.Properties.AndroidMkStaticLibs = append(mod.Properties.AndroidMkStaticLibs, depName)
|
||||
case cc.IsSharedDepTag(depTag):
|
||||
depFlag = "-ldylib=" + libName
|
||||
depPaths.linkDirs = append(depPaths.linkDirs, linkPath)
|
||||
depPaths.depFlags = append(depPaths.depFlags, depFlag)
|
||||
depPaths.linkObjects = append(depPaths.linkObjects, linkObject.String())
|
||||
depPaths.depIncludePaths = append(depPaths.depIncludePaths, ccDep.IncludeDirs()...)
|
||||
if mod, ok := ccDep.(*cc.Module); ok {
|
||||
depPaths.depSystemIncludePaths = append(depPaths.depSystemIncludePaths, mod.ExportedSystemIncludeDirs()...)
|
||||
@@ -876,15 +886,15 @@ func (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
|
||||
mod.Properties.AndroidMkSharedLibs = append(mod.Properties.AndroidMkSharedLibs, depName)
|
||||
exportDep = true
|
||||
case depTag == cc.CrtBeginDepTag:
|
||||
depPaths.CrtBegin = linkFile
|
||||
depPaths.CrtBegin = linkObject
|
||||
case depTag == cc.CrtEndDepTag:
|
||||
depPaths.CrtEnd = linkFile
|
||||
depPaths.CrtEnd = linkObject
|
||||
}
|
||||
|
||||
// Make sure these dependencies are propagated
|
||||
if lib, ok := mod.compiler.(exportedFlagsProducer); ok && exportDep {
|
||||
lib.exportLinkDirs(linkPath)
|
||||
lib.exportDepFlags(depFlag)
|
||||
lib.exportLinkObjects(linkObject.String())
|
||||
}
|
||||
}
|
||||
|
||||
@@ -958,14 +968,6 @@ func linkPathFromFilePath(filepath android.Path) string {
|
||||
return strings.Split(filepath.String(), filepath.Base())[0]
|
||||
}
|
||||
|
||||
func libNameFromFilePath(filepath android.Path) string {
|
||||
libName := strings.TrimSuffix(filepath.Base(), filepath.Ext())
|
||||
if strings.HasPrefix(libName, "lib") {
|
||||
libName = libName[3:]
|
||||
}
|
||||
return libName
|
||||
}
|
||||
|
||||
func (mod *Module) DepsMutator(actx android.BottomUpMutatorContext) {
|
||||
ctx := &depsContext{
|
||||
BottomUpMutatorContext: actx,
|
||||
|
Reference in New Issue
Block a user