Rust cdylib/statliclib support for vendor snapshot.
Adds support for platform vendor_available Rust FFI libraries and
binaries to be included in the vendor snapshot.
Because rlib and dylibs are not yet in snapshots, libstd cannot be
included in a vendor snapshot. As a result, vendor-specific Rust code
can't be guaranteed to work with the platform-provided vendor_available
modules built with a newer toolchain. For now, a check is added
indicating vendor-specific Rust code is unsupported.
This changes the linkage for vendor variants of these modules to default
to rlib linkage since dylibs cannot be included in the snapshot yet.
Bug: 184042776
Test: m nothing # new Soong tests pass
Change-Id: I502eaa4bb962eb87ff868fcf49b435f0d2f982e6
diff --git a/rust/library.go b/rust/library.go
index 1bdf83a..7421817 100644
--- a/rust/library.go
+++ b/rust/library.go
@@ -99,6 +99,8 @@
MutatedProperties LibraryMutatedProperties
includeDirs android.Paths
sourceProvider SourceProvider
+
+ collectedSnapshotHeaders android.Paths
}
type libraryInterface interface {
@@ -220,7 +222,10 @@
}
func (library *libraryDecorator) autoDep(ctx android.BottomUpMutatorContext) autoDep {
- if library.preferRlib() {
+ if ctx.Module().(*Module).InVendor() {
+ // Vendor modules should statically link libstd.
+ return rlibAutoDep
+ } else if library.preferRlib() {
return rlibAutoDep
} else if library.rlib() || library.static() {
return rlibAutoDep
@@ -236,7 +241,10 @@
}
func (library *libraryDecorator) stdLinkage(ctx *depsContext) RustLinkage {
- if library.static() || library.MutatedProperties.VariantIsStaticStd {
+ if ctx.RustModule().InVendor() {
+ // Vendor modules should statically link libstd.
+ return RlibLinkage
+ } else if library.static() || library.MutatedProperties.VariantIsStaticStd {
return RlibLinkage
} else if library.baseCompiler.preferRlib() {
return RlibLinkage
@@ -623,6 +631,19 @@
// Disable dylib Vendor Ramdisk variations until we support these.
v.(*Module).Disable()
}
+
+ variation := v.(*Module).ModuleBase.ImageVariation().Variation
+ if strings.HasPrefix(variation, cc.VendorVariationPrefix) &&
+ m.HasVendorVariant() &&
+ !cc.IsVendorProprietaryModule(mctx) &&
+ strings.TrimPrefix(variation, cc.VendorVariationPrefix) == mctx.DeviceConfig().VndkVersion() {
+
+ // cc.MutateImage runs before LibraryMutator, so vendor variations which are meant for rlibs only are
+ // produced for Dylibs; however, dylibs should not be enabled for boardVndkVersion for
+ // non-vendor proprietary modules.
+ v.(*Module).Disable()
+ }
+
case "source":
v.(*Module).compiler.(libraryInterface).setSource()
// The source variant does not produce any library.
@@ -671,3 +692,54 @@
}
}
}
+
+func (l *libraryDecorator) snapshotHeaders() android.Paths {
+ if l.collectedSnapshotHeaders == nil {
+ panic("snapshotHeaders() must be called after collectHeadersForSnapshot()")
+ }
+ return l.collectedSnapshotHeaders
+}
+
+// collectHeadersForSnapshot collects all exported headers from library.
+// It globs header files in the source tree for exported include directories,
+// and tracks generated header files separately.
+//
+// This is to be called from GenerateAndroidBuildActions, and then collected
+// header files can be retrieved by snapshotHeaders().
+func (l *libraryDecorator) collectHeadersForSnapshot(ctx android.ModuleContext, deps PathDeps) {
+ ret := android.Paths{}
+
+ // Glob together the headers from the modules include_dirs property
+ for _, path := range android.CopyOfPaths(l.includeDirs) {
+ dir := path.String()
+ glob, err := ctx.GlobWithDeps(dir+"/**/*", nil)
+ if err != nil {
+ ctx.ModuleErrorf("glob failed: %#v", err)
+ return
+ }
+
+ for _, header := range glob {
+ // Filter out only the files with extensions that are headers.
+ found := false
+ for _, ext := range cc.HeaderExts {
+ if strings.HasSuffix(header, ext) {
+ found = true
+ break
+ }
+ }
+ if !found {
+ continue
+ }
+ ret = append(ret, android.PathForSource(ctx, header))
+ }
+ }
+
+ // Glob together the headers from C dependencies as well, starting with non-generated headers.
+ ret = append(ret, cc.GlobHeadersForSnapshot(ctx, append(android.CopyOfPaths(deps.depIncludePaths), deps.depSystemIncludePaths...))...)
+
+ // Collect generated headers from C dependencies.
+ ret = append(ret, cc.GlobGeneratedHeadersForSnapshot(ctx, deps.depGeneratedHeaders)...)
+
+ // TODO(185577950): If support for generated headers is added, they need to be collected here as well.
+ l.collectedSnapshotHeaders = ret
+}