aboutsummaryrefslogtreecommitdiffstats
path: root/apex
diff options
context:
space:
mode:
authorAlex Light <allight@google.com>2019-01-18 14:37:31 -0800
committerAlex Light <allight@google.com>2019-01-29 03:21:47 +0000
commit3d67359f2f0eee9da739a7f96ae9888116e09079 (patch)
tree2d8f7ae5e9c3526b4e15a9b20ad495c4fd709087 /apex
parent62f6fcbbb9528b58fd98e5fd5c71e484844be12f (diff)
downloadbuild_soong-3d67359f2f0eee9da739a7f96ae9888116e09079.tar.gz
build_soong-3d67359f2f0eee9da739a7f96ae9888116e09079.tar.bz2
build_soong-3d67359f2f0eee9da739a7f96ae9888116e09079.zip
Add support for symlink_preferred_arch in apex
Some modules rely on symlink_preferred_arch to have expected files present. This change makes apexs include these symlinks. Test: m com.android.runtime.debug pushd $(mktemp -d) mkdir mnt unzip $OUT/apex/system/com.android.runtime.debug.apex sudo mount -o loop,ro apex_payload.img mnt Ensure that mnt/bin/dalvikvm and mnt/bin/dex2oatd both exist and are symlinks to mnt/bin/dalvikvm64 and mnt/bin/dex2oatd32 respectively. Bug: 119942078 Bug: 122373634 Bug: 123079311 Change-Id: I47868fbedc5bdd3141a836c488f79e91e0a6ddfe
Diffstat (limited to 'apex')
-rw-r--r--apex/apex.go23
-rw-r--r--apex/apex_test.go62
2 files changed, 67 insertions, 18 deletions
diff --git a/apex/apex.go b/apex/apex.go
index 321e2e89..96a4bd5e 100644
--- a/apex/apex.go
+++ b/apex/apex.go
@@ -333,6 +333,7 @@ type apexFile struct {
installDir string
class apexFileClass
module android.Module
+ symlinks []string
}
type apexBundle struct {
@@ -396,7 +397,8 @@ func (a *apexBundle) DepsMutator(ctx android.BottomUpMutatorContext) {
a.properties.Multilib.Both.Binaries, target.String(),
a.getImageVariation(config))
- if i == 0 {
+ isPrimaryAbi := i == 0
+ if isPrimaryAbi {
// When multilib.* is omitted for binaries, it implies
// multilib.first.
ctx.AddFarVariationDependencies([]blueprint.Variation{
@@ -571,7 +573,7 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) {
case sharedLibTag:
if cc, ok := child.(*cc.Module); ok {
fileToCopy, dirInApex := getCopyManifestForNativeLibrary(cc)
- filesInfo = append(filesInfo, apexFile{fileToCopy, depName, cc.Arch().ArchType, dirInApex, nativeSharedLib, cc})
+ filesInfo = append(filesInfo, apexFile{fileToCopy, depName, cc.Arch().ArchType, dirInApex, nativeSharedLib, cc, nil})
return true
} else {
ctx.PropertyErrorf("native_shared_libs", "%q is not a cc_library or cc_library_shared module", depName)
@@ -584,7 +586,7 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) {
return true
}
fileToCopy, dirInApex := getCopyManifestForExecutable(cc)
- filesInfo = append(filesInfo, apexFile{fileToCopy, depName, cc.Arch().ArchType, dirInApex, nativeExecutable, cc})
+ filesInfo = append(filesInfo, apexFile{fileToCopy, depName, cc.Arch().ArchType, dirInApex, nativeExecutable, cc, cc.Symlinks()})
return true
} else {
ctx.PropertyErrorf("binaries", "%q is not a cc_binary module", depName)
@@ -595,7 +597,7 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) {
if fileToCopy == nil {
ctx.PropertyErrorf("java_libs", "%q is not configured to be compiled into dex", depName)
} else {
- filesInfo = append(filesInfo, apexFile{fileToCopy, depName, java.Arch().ArchType, dirInApex, javaSharedLib, java})
+ filesInfo = append(filesInfo, apexFile{fileToCopy, depName, java.Arch().ArchType, dirInApex, javaSharedLib, java, nil})
}
return true
} else {
@@ -604,7 +606,7 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) {
case prebuiltTag:
if prebuilt, ok := child.(*android.PrebuiltEtc); ok {
fileToCopy, dirInApex := getCopyManifestForPrebuiltEtc(prebuilt)
- filesInfo = append(filesInfo, apexFile{fileToCopy, depName, prebuilt.Arch().ArchType, dirInApex, etc, prebuilt})
+ filesInfo = append(filesInfo, apexFile{fileToCopy, depName, prebuilt.Arch().ArchType, dirInApex, etc, prebuilt, nil})
return true
} else {
ctx.PropertyErrorf("prebuilts", "%q is not a prebuilt_etc module", depName)
@@ -639,7 +641,7 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) {
}
depName := ctx.OtherModuleName(child)
fileToCopy, dirInApex := getCopyManifestForNativeLibrary(cc)
- filesInfo = append(filesInfo, apexFile{fileToCopy, depName, cc.Arch().ArchType, dirInApex, nativeSharedLib, cc})
+ filesInfo = append(filesInfo, apexFile{fileToCopy, depName, cc.Arch().ArchType, dirInApex, nativeSharedLib, cc, nil})
return true
}
}
@@ -732,6 +734,10 @@ func (a *apexBundle) buildUnflattenedApex(ctx android.ModuleContext, keyFile and
dest_path := filepath.Join(android.PathForModuleOut(ctx, "image"+suffix).String(), dest)
copyCommands = append(copyCommands, "mkdir -p "+filepath.Dir(dest_path))
copyCommands = append(copyCommands, "cp "+src.String()+" "+dest_path)
+ for _, sym := range a.filesInfo[i].symlinks {
+ symlinkDest := filepath.Join(filepath.Dir(dest_path), sym)
+ copyCommands = append(copyCommands, "ln -s "+filepath.Base(dest)+" "+symlinkDest)
+ }
}
implicitInputs := append(android.Paths(nil), filesToCopy...)
implicitInputs = append(implicitInputs, manifest)
@@ -747,6 +753,9 @@ func (a *apexBundle) buildUnflattenedApex(ctx android.ModuleContext, keyFile and
pathInApex := filepath.Join(f.installDir, f.builtFile.Base())
if f.installDir == "bin" {
executablePaths = append(executablePaths, pathInApex)
+ for _, s := range f.symlinks {
+ executablePaths = append(executablePaths, filepath.Join("bin", s))
+ }
} else {
readOnlyPaths = append(readOnlyPaths, pathInApex)
}
@@ -879,7 +888,7 @@ func (a *apexBundle) buildFlattenedApex(ctx android.ModuleContext) {
Input: manifest,
Output: copiedManifest,
})
- a.filesInfo = append(a.filesInfo, apexFile{copiedManifest, ctx.ModuleName() + ".apex_manifest.json", android.Common, ".", etc, nil})
+ a.filesInfo = append(a.filesInfo, apexFile{copiedManifest, ctx.ModuleName() + ".apex_manifest.json", android.Common, ".", etc, nil, nil})
for _, fi := range a.filesInfo {
dir := filepath.Join("apex", ctx.ModuleName(), fi.installDir)
diff --git a/apex/apex_test.go b/apex/apex_test.go
index 4ca5b148..7ae49f6a 100644
--- a/apex/apex_test.go
+++ b/apex/apex_test.go
@@ -107,6 +107,16 @@ func testApex(t *testing.T, bp string) *android.TestContext {
recovery_available: true,
}
+ cc_object {
+ name: "crtbegin_static",
+ stl: "none",
+ }
+
+ cc_object {
+ name: "crtend_android",
+ stl: "none",
+ }
+
llndk_library {
name: "libc",
symbol_file: "",
@@ -194,6 +204,11 @@ func TestBasicApex(t *testing.T) {
name: "myapex",
key: "myapex.key",
native_shared_libs: ["mylib"],
+ multilib: {
+ both: {
+ binaries: ["foo",],
+ }
+ }
}
apex_key {
@@ -210,6 +225,25 @@ func TestBasicApex(t *testing.T) {
stl: "none",
}
+ cc_binary {
+ name: "foo",
+ srcs: ["mylib.cpp"],
+ compile_multilib: "both",
+ multilib: {
+ lib32: {
+ suffix: "32",
+ },
+ lib64: {
+ suffix: "64",
+ },
+ },
+ symlinks: ["foo_link_"],
+ symlink_preferred_arch: true,
+ system_shared_libs: [],
+ static_executable: true,
+ stl: "none",
+ }
+
cc_library {
name: "mylib2",
srcs: ["mylib.cpp"],
@@ -237,6 +271,23 @@ func TestBasicApex(t *testing.T) {
// Ensure that the platform variant ends with _core_shared
ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_core_shared")
ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_core_shared")
+
+ // Ensure that all symlinks are present.
+ found_foo_link_64 := false
+ found_foo := false
+ for _, cmd := range strings.Split(copyCmds, " && ") {
+ if strings.HasPrefix(cmd, "ln -s foo64") {
+ if strings.HasSuffix(cmd, "bin/foo") {
+ found_foo = true
+ } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
+ found_foo_link_64 = true
+ }
+ }
+ }
+ good := found_foo && found_foo_link_64
+ if !good {
+ t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
+ }
}
func TestBasicZipApex(t *testing.T) {
@@ -671,17 +722,6 @@ func TestStaticLinking(t *testing.T) {
system_shared_libs: [],
stl: "none",
}
-
- cc_object {
- name: "crtbegin_static",
- stl: "none",
- }
-
- cc_object {
- name: "crtend_android",
- stl: "none",
- }
-
`)
ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a_core").Rule("ld").Args["libFlags"]