diff options
Diffstat (limited to 'rust/rust.go')
-rw-r--r-- | rust/rust.go | 64 |
1 files changed, 33 insertions, 31 deletions
diff --git a/rust/rust.go b/rust/rust.go index 80fe62243..68dc5a08b 100644 --- a/rust/rust.go +++ b/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, |