diff options
Diffstat (limited to 'rust/library.go')
-rw-r--r-- | rust/library.go | 132 |
1 files changed, 78 insertions, 54 deletions
diff --git a/rust/library.go b/rust/library.go index 3c948ea09..8b8e797a2 100644 --- a/rust/library.go +++ b/rust/library.go @@ -19,7 +19,6 @@ import ( "strings" "android/soong/android" - "android/soong/rust/config" ) func init() { @@ -29,14 +28,17 @@ func init() { android.RegisterModuleType("rust_library_host", RustLibraryHostFactory) android.RegisterModuleType("rust_library_host_dylib", RustLibraryDylibHostFactory) android.RegisterModuleType("rust_library_host_rlib", RustLibraryRlibHostFactory) - android.RegisterModuleType("rust_library_shared", RustLibrarySharedFactory) - android.RegisterModuleType("rust_library_static", RustLibraryStaticFactory) - android.RegisterModuleType("rust_library_host_shared", RustLibrarySharedHostFactory) - android.RegisterModuleType("rust_library_host_static", RustLibraryStaticHostFactory) + android.RegisterModuleType("rust_ffi", RustFFIFactory) + android.RegisterModuleType("rust_ffi_shared", RustFFISharedFactory) + android.RegisterModuleType("rust_ffi_static", RustFFIStaticFactory) + android.RegisterModuleType("rust_ffi_host", RustFFIHostFactory) + android.RegisterModuleType("rust_ffi_host_shared", RustFFISharedHostFactory) + android.RegisterModuleType("rust_ffi_host_static", RustFFIStaticHostFactory) } type VariantLibraryProperties struct { - Enabled *bool `android:"arch_variant"` + Enabled *bool `android:"arch_variant"` + Srcs []string `android:"path,arch_variant"` } type LibraryCompilerProperties struct { @@ -71,6 +73,7 @@ type LibraryMutatedProperties struct { type libraryDecorator struct { *baseCompiler + *flagExporter Properties LibraryCompilerProperties MutatedProperties LibraryMutatedProperties @@ -96,6 +99,8 @@ type libraryInterface interface { setStatic() // Build a specific library variant + BuildOnlyFFI() + BuildOnlyRust() BuildOnlyRlib() BuildOnlyDylib() BuildOnlyStatic() @@ -106,22 +111,6 @@ func (library *libraryDecorator) nativeCoverage() bool { return true } -func (library *libraryDecorator) exportedDirs() []string { - return library.linkDirs -} - -func (library *libraryDecorator) exportedDepFlags() []string { - return library.depFlags -} - -func (library *libraryDecorator) reexportDirs(dirs ...string) { - library.linkDirs = android.FirstUniqueStrings(append(library.linkDirs, dirs...)) -} - -func (library *libraryDecorator) reexportDepFlags(flags ...string) { - library.depFlags = android.FirstUniqueStrings(append(library.depFlags, flags...)) -} - func (library *libraryDecorator) rlib() bool { return library.MutatedProperties.VariantIsRlib } @@ -182,12 +171,31 @@ func (library *libraryDecorator) setStatic() { library.MutatedProperties.VariantIsDylib = false } +func (library *libraryDecorator) autoDep() autoDep { + if library.rlib() || library.static() { + return rlibAutoDep + } else if library.dylib() || library.shared() { + return dylibAutoDep + } else { + return rlibAutoDep + } +} + var _ compiler = (*libraryDecorator)(nil) var _ libraryInterface = (*libraryDecorator)(nil) +var _ exportedFlagsProducer = (*libraryDecorator)(nil) -// rust_library produces all variants. +// rust_library produces all rust variants. func RustLibraryFactory() android.Module { - module, _ := NewRustLibrary(android.HostAndDeviceSupported) + module, library := NewRustLibrary(android.HostAndDeviceSupported) + library.BuildOnlyRust() + return module.Init() +} + +// rust_ffi produces all ffi variants. +func RustFFIFactory() android.Module { + module, library := NewRustLibrary(android.HostAndDeviceSupported) + library.BuildOnlyFFI() return module.Init() } @@ -205,23 +213,31 @@ func RustLibraryRlibFactory() android.Module { return module.Init() } -// rust_library_shared produces a shared library. -func RustLibrarySharedFactory() android.Module { +// rust_ffi_shared produces a shared library. +func RustFFISharedFactory() android.Module { module, library := NewRustLibrary(android.HostAndDeviceSupported) library.BuildOnlyShared() return module.Init() } -// rust_library_static produces a static library. -func RustLibraryStaticFactory() android.Module { +// rust_ffi_static produces a static library. +func RustFFIStaticFactory() android.Module { module, library := NewRustLibrary(android.HostAndDeviceSupported) library.BuildOnlyStatic() return module.Init() } -// rust_library_host produces all variants. +// rust_library_host produces all rust variants. func RustLibraryHostFactory() android.Module { - module, _ := NewRustLibrary(android.HostSupported) + module, library := NewRustLibrary(android.HostSupported) + library.BuildOnlyRust() + return module.Init() +} + +// rust_ffi_host produces all FFI variants. +func RustFFIHostFactory() android.Module { + module, library := NewRustLibrary(android.HostSupported) + library.BuildOnlyFFI() return module.Init() } @@ -239,44 +255,60 @@ func RustLibraryRlibHostFactory() android.Module { return module.Init() } -// rust_library_static_host produces a static library. -func RustLibraryStaticHostFactory() android.Module { +// rust_ffi_static_host produces a static library. +func RustFFIStaticHostFactory() android.Module { module, library := NewRustLibrary(android.HostSupported) library.BuildOnlyStatic() return module.Init() } -// rust_library_shared_host produces an shared library. -func RustLibrarySharedHostFactory() android.Module { +// rust_ffi_shared_host produces an shared library. +func RustFFISharedHostFactory() android.Module { module, library := NewRustLibrary(android.HostSupported) library.BuildOnlyShared() return module.Init() } -func (library *libraryDecorator) BuildOnlyDylib() { +func (library *libraryDecorator) BuildOnlyFFI() { + library.MutatedProperties.BuildDylib = false library.MutatedProperties.BuildRlib = false + library.MutatedProperties.BuildShared = true + library.MutatedProperties.BuildStatic = true +} + +func (library *libraryDecorator) BuildOnlyRust() { + library.MutatedProperties.BuildDylib = true + library.MutatedProperties.BuildRlib = true library.MutatedProperties.BuildShared = false library.MutatedProperties.BuildStatic = false +} +func (library *libraryDecorator) BuildOnlyDylib() { + library.MutatedProperties.BuildDylib = true + library.MutatedProperties.BuildRlib = false + library.MutatedProperties.BuildShared = false + library.MutatedProperties.BuildStatic = false } func (library *libraryDecorator) BuildOnlyRlib() { library.MutatedProperties.BuildDylib = false + library.MutatedProperties.BuildRlib = true library.MutatedProperties.BuildShared = false library.MutatedProperties.BuildStatic = false } func (library *libraryDecorator) BuildOnlyStatic() { - library.MutatedProperties.BuildShared = false library.MutatedProperties.BuildRlib = false library.MutatedProperties.BuildDylib = false - + library.MutatedProperties.BuildShared = false + library.MutatedProperties.BuildStatic = true } func (library *libraryDecorator) BuildOnlyShared() { - library.MutatedProperties.BuildStatic = false library.MutatedProperties.BuildRlib = false library.MutatedProperties.BuildDylib = false + library.MutatedProperties.BuildStatic = false + library.MutatedProperties.BuildShared = true } func NewRustLibrary(hod android.HostOrDeviceSupported) (*Module, *libraryDecorator) { @@ -284,12 +316,13 @@ func NewRustLibrary(hod android.HostOrDeviceSupported) (*Module, *libraryDecorat library := &libraryDecorator{ MutatedProperties: LibraryMutatedProperties{ - BuildDylib: true, - BuildRlib: true, - BuildShared: true, - BuildStatic: true, + BuildDylib: false, + BuildRlib: false, + BuildShared: false, + BuildStatic: false, }, baseCompiler: NewBaseCompiler("lib", "lib64", InstallInSystem), + flagExporter: NewFlagExporter(), } module.compiler = library @@ -304,15 +337,6 @@ func (library *libraryDecorator) compilerProps() []interface{} { } func (library *libraryDecorator) compilerDeps(ctx DepsContext, deps Deps) Deps { - - // TODO(b/155498724) Remove if C static libraries no longer require libstd as an rlib dependency. - if !ctx.Host() && library.static() { - library.setNoStdlibs() - for _, stdlib := range config.Stdlibs { - deps.Rlibs = append(deps.Rlibs, stdlib+".static") - } - } - deps = library.baseCompiler.compilerDeps(ctx, deps) if ctx.toolchain().Bionic() && (library.dylib() || library.shared()) { @@ -329,7 +353,7 @@ func (library *libraryDecorator) sharedLibFilename(ctx ModuleContext) string { } func (library *libraryDecorator) compilerFlags(ctx ModuleContext, flags Flags) Flags { - flags.RustFlags = append(flags.RustFlags, "-C metadata="+ctx.baseModuleName()) + flags.RustFlags = append(flags.RustFlags, "-C metadata="+ctx.ModuleName()) flags = library.baseCompiler.compilerFlags(ctx, flags) if library.shared() || library.static() { library.includeDirs = append(library.includeDirs, android.PathsForModuleSrc(ctx, library.Properties.Include_dirs)...) @@ -391,8 +415,8 @@ func (library *libraryDecorator) compile(ctx ModuleContext, flags Flags, deps Pa library.coverageOutputZipFile = TransformCoverageFilesToZip(ctx, coverageFiles, library.getStem(ctx)) if library.rlib() || library.dylib() { - library.reexportDirs(deps.linkDirs...) - library.reexportDepFlags(deps.depFlags...) + library.exportLinkDirs(deps.linkDirs...) + library.exportDepFlags(deps.depFlags...) } library.unstrippedOutputFile = outputFile |