Merge "Fix symlinks from APEX to partitions" am: 4196e13a6a

Original change: https://android-review.googlesource.com/c/platform/build/soong/+/2442922

Change-Id: Iefadf2775084969290aef45b3f4377ec1a4d57b6
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Treehugger Robot 2023-02-21 04:35:26 +00:00 committed by Automerger Merge Worker
commit 9bd0f928f1
4 changed files with 33 additions and 8 deletions

View file

@ -502,6 +502,7 @@ type Module interface {
InstallInRoot() bool InstallInRoot() bool
InstallInVendor() bool InstallInVendor() bool
InstallForceOS() (*OsType, *ArchType) InstallForceOS() (*OsType, *ArchType)
PartitionTag(DeviceConfig) string
HideFromMake() HideFromMake()
IsHideFromMake() bool IsHideFromMake() bool
IsSkipInstall() bool IsSkipInstall() bool

View file

@ -514,6 +514,7 @@ type apexFile struct {
// buildFile is put in the installDir inside the APEX. // buildFile is put in the installDir inside the APEX.
builtFile android.Path builtFile android.Path
installDir string installDir string
partition string
customStem string customStem string
symlinks []string // additional symlinks symlinks []string // additional symlinks
@ -553,6 +554,7 @@ func newApexFile(ctx android.BaseModuleContext, builtFile android.Path, androidM
} }
if module != nil { if module != nil {
ret.moduleDir = ctx.OtherModuleDir(module) ret.moduleDir = ctx.OtherModuleDir(module)
ret.partition = module.PartitionTag(ctx.DeviceConfig())
ret.requiredModuleNames = module.RequiredModuleNames() ret.requiredModuleNames = module.RequiredModuleNames()
ret.targetRequiredModuleNames = module.TargetRequiredModuleNames() ret.targetRequiredModuleNames = module.TargetRequiredModuleNames()
ret.hostRequiredModuleNames = module.HostRequiredModuleNames() ret.hostRequiredModuleNames = module.HostRequiredModuleNames()

View file

@ -7122,7 +7122,10 @@ func TestSymlinksFromApexToSystem(t *testing.T) {
cc_library { cc_library {
name: "mylib", name: "mylib",
srcs: ["mylib.cpp"], srcs: ["mylib.cpp"],
shared_libs: ["myotherlib"], shared_libs: [
"myotherlib",
"myotherlib_ext",
],
system_shared_libs: [], system_shared_libs: [],
stl: "none", stl: "none",
apex_available: [ apex_available: [
@ -7146,6 +7149,20 @@ func TestSymlinksFromApexToSystem(t *testing.T) {
min_sdk_version: "current", min_sdk_version: "current",
} }
cc_library {
name: "myotherlib_ext",
srcs: ["mylib.cpp"],
system_shared_libs: [],
system_ext_specific: true,
stl: "none",
apex_available: [
"myapex",
"myapex.updatable",
"//apex_available:platform",
],
min_sdk_version: "current",
}
java_library { java_library {
name: "myjar", name: "myjar",
srcs: ["foo/bar/MyClass.java"], srcs: ["foo/bar/MyClass.java"],
@ -7186,12 +7203,15 @@ func TestSymlinksFromApexToSystem(t *testing.T) {
t.Errorf("%q is not found", file) t.Errorf("%q is not found", file)
} }
ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) { ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
for _, f := range files { for _, f := range files {
if f.path == file { if f.path == file {
if !f.isLink { if !f.isLink {
t.Errorf("%q is not a symlink", file) t.Errorf("%q is not a symlink", file)
} }
if f.src != target {
t.Errorf("expected symlink target to be %q, got %q", target, f.src)
}
return return
} }
} }
@ -7205,23 +7225,27 @@ func TestSymlinksFromApexToSystem(t *testing.T) {
ensureRealfileExists(t, files, "javalib/myjar.jar") ensureRealfileExists(t, files, "javalib/myjar.jar")
ensureRealfileExists(t, files, "lib64/mylib.so") ensureRealfileExists(t, files, "lib64/mylib.so")
ensureRealfileExists(t, files, "lib64/myotherlib.so") ensureRealfileExists(t, files, "lib64/myotherlib.so")
ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image") files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
ensureRealfileExists(t, files, "javalib/myjar.jar") ensureRealfileExists(t, files, "javalib/myjar.jar")
ensureRealfileExists(t, files, "lib64/mylib.so") ensureRealfileExists(t, files, "lib64/mylib.so")
ensureRealfileExists(t, files, "lib64/myotherlib.so") ensureRealfileExists(t, files, "lib64/myotherlib.so")
ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
// For bundled build, symlink to the system for the non-updatable APEXes only // For bundled build, symlink to the system for the non-updatable APEXes only
ctx = testApex(t, bp) ctx = testApex(t, bp)
files = getFiles(t, ctx, "myapex", "android_common_myapex_image") files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
ensureRealfileExists(t, files, "javalib/myjar.jar") ensureRealfileExists(t, files, "javalib/myjar.jar")
ensureRealfileExists(t, files, "lib64/mylib.so") ensureRealfileExists(t, files, "lib64/mylib.so")
ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image") files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
ensureRealfileExists(t, files, "javalib/myjar.jar") ensureRealfileExists(t, files, "javalib/myjar.jar")
ensureRealfileExists(t, files, "lib64/mylib.so") ensureRealfileExists(t, files, "lib64/mylib.so")
ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
} }
func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) { func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {

View file

@ -476,8 +476,7 @@ func (a *apexBundle) buildUnflattenedApex(ctx android.ModuleContext) {
// Copy the built file to the directory. But if the symlink optimization is turned // Copy the built file to the directory. But if the symlink optimization is turned
// on, place a symlink to the corresponding file in /system partition instead. // on, place a symlink to the corresponding file in /system partition instead.
if a.linkToSystemLib && fi.transitiveDep && fi.availableToPlatform() { if a.linkToSystemLib && fi.transitiveDep && fi.availableToPlatform() {
// TODO(jiyong): pathOnDevice should come from fi.module, not being calculated here pathOnDevice := filepath.Join("/", fi.partition, fi.path())
pathOnDevice := filepath.Join("/system", fi.path())
copyCommands = append(copyCommands, "ln -sfn "+pathOnDevice+" "+destPath) copyCommands = append(copyCommands, "ln -sfn "+pathOnDevice+" "+destPath)
} else { } else {
// Copy the file into APEX // Copy the file into APEX
@ -941,8 +940,7 @@ func (a *apexBundle) buildFlattenedApex(ctx android.ModuleContext) {
dir := filepath.Join("apex", bundleName, fi.installDir) dir := filepath.Join("apex", bundleName, fi.installDir)
installDir := android.PathForModuleInstall(ctx, dir) installDir := android.PathForModuleInstall(ctx, dir)
if a.linkToSystemLib && fi.transitiveDep && fi.availableToPlatform() { if a.linkToSystemLib && fi.transitiveDep && fi.availableToPlatform() {
// TODO(jiyong): pathOnDevice should come from fi.module, not being calculated here pathOnDevice := filepath.Join("/", fi.partition, fi.path())
pathOnDevice := filepath.Join("/system", fi.path())
installedSymlinks = append(installedSymlinks, installedSymlinks = append(installedSymlinks,
ctx.InstallAbsoluteSymlink(installDir, fi.stem(), pathOnDevice)) ctx.InstallAbsoluteSymlink(installDir, fi.stem(), pathOnDevice))
} else { } else {