rust: Add vendor and recovery dylib support.
Adds dylib support for vendor and recovery images.
This changes the default linkage for vendor and recovery images to
dylib, which matches the platform default linkage. This also means that
by default, dylib-std variants are used for rlib dependencies.
Bug: 204303985
Test: Soong tests.
Test: m dist vendor-snapshot
Test: RECOVERY_SNAPSHOT_VERSION=current m dist recovery-snapshot
Change-Id: If84074b8615a70c45e7e162abeb853dc8c34d49a
diff --git a/cc/vendor_snapshot.go b/cc/vendor_snapshot.go
index d2531c0..9ea337b 100644
--- a/cc/vendor_snapshot.go
+++ b/cc/vendor_snapshot.go
@@ -108,10 +108,10 @@
return false
}
}
- if sanitizable.Static() {
+ if sanitizable.Static() || sanitizable.Rlib() {
return sanitizable.OutputFile().Valid() && !isPrivate(image, m)
}
- if sanitizable.Shared() || sanitizable.Rlib() {
+ if sanitizable.Shared() || sanitizable.Dylib() {
if !sanitizable.OutputFile().Valid() {
return false
}
@@ -153,6 +153,8 @@
SharedLibs []string `json:",omitempty"`
StaticLibs []string `json:",omitempty"`
RuntimeLibs []string `json:",omitempty"`
+ Dylibs []string `json:",omitempty"`
+ Rlibs []string `json:",omitempty"`
// extra config files
InitRc []string `json:",omitempty"`
@@ -283,8 +285,17 @@
if m.Shared() {
prop.SharedLibs = m.SnapshotSharedLibs()
}
- // static libs dependencies are required to collect the NOTICE files.
+
+ // dylibs collect both shared and dylib dependencies.
+ if m.Dylib() {
+ prop.SharedLibs = m.SnapshotSharedLibs()
+ prop.Dylibs = m.SnapshotDylibs()
+ }
+
+ // static and rlib libs dependencies are required to collect the NOTICE files.
prop.StaticLibs = m.SnapshotStaticLibs()
+ prop.Rlibs = m.SnapshotRlibs()
+
if sanitizable, ok := m.(PlatformSanitizeable); ok {
if sanitizable.Static() && sanitizable.SanitizePropDefined() {
prop.SanitizeMinimalDep = sanitizable.MinimalRuntimeDep() || sanitizable.MinimalRuntimeNeeded()
@@ -299,13 +310,15 @@
libType = "shared"
} else if m.Rlib() {
libType = "rlib"
+ } else if m.Dylib() {
+ libType = "dylib"
} else {
libType = "header"
}
var stem string
- // install .a or .so
+ // install .a, .rlib, .dylib.so, or .so
if libType != "header" {
libPath := m.OutputFile().Path()
stem = libPath.Base()
@@ -328,6 +341,12 @@
}
}
}
+ if m.Rlib() && m.RlibStd() {
+ // rlibs produce both rlib-std and dylib-std variants
+ ext := filepath.Ext(stem)
+ stem = strings.TrimSuffix(stem, ext) + ".rlib-std" + ext
+ prop.ModuleName += ".rlib-std"
+ }
snapshotLibOut := filepath.Join(snapshotArchDir, targetArch, libType, m.RelativeInstallPath(), stem)
ret = append(ret, copyFile(ctx, libPath, snapshotLibOut, fake))
} else {
@@ -341,8 +360,12 @@
prop.StaticExecutable = m.StaticExecutable()
prop.InstallInRoot = m.InstallInRoot()
prop.SharedLibs = m.SnapshotSharedLibs()
- // static libs dependencies are required to collect the NOTICE files.
+ prop.Dylibs = m.SnapshotDylibs()
+
+ // static and rlib dependencies are required to collect the NOTICE files.
prop.StaticLibs = m.SnapshotStaticLibs()
+ prop.Rlibs = m.SnapshotRlibs()
+
// install bin
binPath := m.OutputFile().Path()
snapshotBinOut := filepath.Join(snapshotArchDir, targetArch, "binary", binPath.Base())