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
This commit is contained in:
4
cc/cc.go
4
cc/cc.go
@@ -1079,6 +1079,10 @@ func (c *Module) CcLibraryInterface() bool {
|
||||
return false
|
||||
}
|
||||
|
||||
func (c *Module) RlibStd() bool {
|
||||
panic(fmt.Errorf("RlibStd called on non-Rust module: %q", c.BaseModuleName()))
|
||||
}
|
||||
|
||||
func (c *Module) RustLibraryInterface() bool {
|
||||
return false
|
||||
}
|
||||
|
@@ -87,6 +87,12 @@ type Snapshottable interface {
|
||||
// SnapshotStaticLibs returns the list of static library dependencies for this module.
|
||||
SnapshotStaticLibs() []string
|
||||
|
||||
// SnapshotDylibs returns the list of dylib library dependencies for this module.
|
||||
SnapshotDylibs() []string
|
||||
|
||||
// SnapshotRlibs returns the list of rlib library dependencies for this module.
|
||||
SnapshotRlibs() []string
|
||||
|
||||
// IsSnapshotPrebuilt returns true if this module is a snapshot prebuilt.
|
||||
IsSnapshotPrebuilt() bool
|
||||
}
|
||||
@@ -239,6 +245,9 @@ type LinkableInterface interface {
|
||||
// Dylib returns true if this is an dylib module.
|
||||
Dylib() bool
|
||||
|
||||
// RlibStd returns true if this is an rlib which links against an rlib libstd.
|
||||
RlibStd() bool
|
||||
|
||||
// Static returns true if this is a static library module.
|
||||
Static() bool
|
||||
|
||||
|
@@ -100,6 +100,7 @@ const (
|
||||
snapshotBinarySuffix = "_binary."
|
||||
snapshotObjectSuffix = "_object."
|
||||
SnapshotRlibSuffix = "_rlib."
|
||||
SnapshotDylibSuffix = "_dylib."
|
||||
)
|
||||
|
||||
type SnapshotProperties struct {
|
||||
@@ -107,6 +108,7 @@ type SnapshotProperties struct {
|
||||
Static_libs []string `android:"arch_variant"`
|
||||
Shared_libs []string `android:"arch_variant"`
|
||||
Rlibs []string `android:"arch_variant"`
|
||||
Dylibs []string `android:"arch_variant"`
|
||||
Vndk_libs []string `android:"arch_variant"`
|
||||
Binaries []string `android:"arch_variant"`
|
||||
Objects []string `android:"arch_variant"`
|
||||
@@ -186,6 +188,7 @@ func (s *snapshotModule) DepsMutator(ctx android.BottomUpMutatorContext) {
|
||||
staticLibs := collectSnapshotMap(s.properties.Static_libs, snapshotSuffix, SnapshotStaticSuffix)
|
||||
sharedLibs := collectSnapshotMap(s.properties.Shared_libs, snapshotSuffix, SnapshotSharedSuffix)
|
||||
rlibs := collectSnapshotMap(s.properties.Rlibs, snapshotSuffix, SnapshotRlibSuffix)
|
||||
dylibs := collectSnapshotMap(s.properties.Dylibs, snapshotSuffix, SnapshotDylibSuffix)
|
||||
vndkLibs := collectSnapshotMap(s.properties.Vndk_libs, "", vndkSuffix)
|
||||
for k, v := range vndkLibs {
|
||||
sharedLibs[k] = v
|
||||
@@ -198,11 +201,12 @@ func (s *snapshotModule) DepsMutator(ctx android.BottomUpMutatorContext) {
|
||||
StaticLibs: staticLibs,
|
||||
SharedLibs: sharedLibs,
|
||||
Rlibs: rlibs,
|
||||
Dylibs: dylibs,
|
||||
})
|
||||
}
|
||||
|
||||
type SnapshotInfo struct {
|
||||
HeaderLibs, Binaries, Objects, StaticLibs, SharedLibs, Rlibs map[string]string
|
||||
HeaderLibs, Binaries, Objects, StaticLibs, SharedLibs, Rlibs, Dylibs map[string]string
|
||||
}
|
||||
|
||||
var SnapshotInfoProvider = blueprint.NewMutatorProvider(SnapshotInfo{}, "deps")
|
||||
|
@@ -57,6 +57,14 @@ func (m *Module) SnapshotStaticLibs() []string {
|
||||
return m.Properties.SnapshotStaticLibs
|
||||
}
|
||||
|
||||
func (m *Module) SnapshotRlibs() []string {
|
||||
return []string{}
|
||||
}
|
||||
|
||||
func (m *Module) SnapshotDylibs() []string {
|
||||
return []string{}
|
||||
}
|
||||
|
||||
// snapshotLibraryInterface is an interface for libraries captured to VNDK / vendor snapshots.
|
||||
type snapshotLibraryInterface interface {
|
||||
libraryInterface
|
||||
|
@@ -108,10 +108,10 @@ func isSnapshotAware(cfg android.DeviceConfig, m LinkableInterface, inProprietar
|
||||
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 @@ type snapshotJsonFlags struct {
|
||||
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 @@ var ccSnapshotAction snapshot.GenerateSnapshotAction = func(s snapshot.SnapshotS
|
||||
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 @@ var ccSnapshotAction snapshot.GenerateSnapshotAction = func(s snapshot.SnapshotS
|
||||
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 @@ var ccSnapshotAction snapshot.GenerateSnapshotAction = func(s snapshot.SnapshotS
|
||||
}
|
||||
}
|
||||
}
|
||||
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 @@ var ccSnapshotAction snapshot.GenerateSnapshotAction = func(s snapshot.SnapshotS
|
||||
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())
|
||||
|
Reference in New Issue
Block a user