aboutsummaryrefslogtreecommitdiffstats
path: root/cc
diff options
context:
space:
mode:
authorTreehugger Robot <treehugger-gerrit@google.com>2019-03-15 09:02:18 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2019-03-15 09:02:18 +0000
commit7487fb54feb9a21e0ba774734556a38aedf4aef5 (patch)
tree7aebe58851da5d8cc5782f862e7450274707ec30 /cc
parent6f933e5528c207994249b8cb66281fff41a60429 (diff)
parentf11943527d5fee8c253a23c959ebb70267721652 (diff)
downloadbuild_soong-7487fb54feb9a21e0ba774734556a38aedf4aef5.tar.gz
build_soong-7487fb54feb9a21e0ba774734556a38aedf4aef5.tar.bz2
build_soong-7487fb54feb9a21e0ba774734556a38aedf4aef5.zip
Merge "Create symlink for bionic files"
Diffstat (limited to 'cc')
-rw-r--r--cc/androidmk.go6
-rw-r--r--cc/binary.go28
-rw-r--r--cc/cc.go8
-rw-r--r--cc/library.go25
-rw-r--r--cc/util.go7
5 files changed, 64 insertions, 10 deletions
diff --git a/cc/androidmk.go b/cc/androidmk.go
index fc791fe5..d229d0cf 100644
--- a/cc/androidmk.go
+++ b/cc/androidmk.go
@@ -158,6 +158,9 @@ func (library *libraryDecorator) AndroidMk(ctx AndroidMkContext, ret *android.An
if len(library.Properties.Overrides) > 0 {
fmt.Fprintln(w, "LOCAL_OVERRIDES_MODULES := "+strings.Join(library.Properties.Overrides, " "))
}
+ if len(library.post_install_cmds) > 0 {
+ fmt.Fprintln(w, "LOCAL_POST_INSTALL_CMD := "+strings.Join(library.post_install_cmds, "&& "))
+ }
})
} else if library.header() {
ret.Class = "HEADER_LIBRARIES"
@@ -231,6 +234,9 @@ func (binary *binaryDecorator) AndroidMk(ctx AndroidMkContext, ret *android.Andr
if len(binary.Properties.Overrides) > 0 {
fmt.Fprintln(w, "LOCAL_OVERRIDES_MODULES := "+strings.Join(binary.Properties.Overrides, " "))
}
+ if len(binary.post_install_cmds) > 0 {
+ fmt.Fprintln(w, "LOCAL_POST_INSTALL_CMD := "+strings.Join(binary.post_install_cmds, "&& "))
+ }
})
}
diff --git a/cc/binary.go b/cc/binary.go
index 4794815c..99529433 100644
--- a/cc/binary.go
+++ b/cc/binary.go
@@ -15,6 +15,8 @@
package cc
import (
+ "path/filepath"
+
"github.com/google/blueprint"
"android/soong/android"
@@ -91,6 +93,8 @@ type binaryDecorator struct {
// Location of the file that should be copied to dist dir when requested
distFile android.OptionalPath
+
+ post_install_cmds []string
}
var _ linker = (*binaryDecorator)(nil)
@@ -249,7 +253,7 @@ func (binary *binaryDecorator) linkerFlags(ctx ModuleContext, flags Flags) Flags
} else {
switch ctx.Os() {
case android.Android:
- if ctx.bootstrap() {
+ if ctx.bootstrap() && !ctx.inRecovery() {
flags.DynamicLinker = "/system/bin/bootstrap/linker"
} else {
flags.DynamicLinker = "/system/bin/linker"
@@ -413,7 +417,29 @@ func (binary *binaryDecorator) symlinkList() []string {
return binary.symlinks
}
+// /system/bin/linker -> /apex/com.android.runtime/bin/linker
+func (binary *binaryDecorator) installSymlinkToRuntimeApex(ctx ModuleContext, file android.Path) {
+ dir := binary.baseInstaller.installDir(ctx)
+ dirOnDevice := android.InstallPathToOnDevicePath(ctx, dir)
+ target := "/" + filepath.Join("apex", "com.android.runtime", dir.Base(), file.Base())
+
+ ctx.InstallAbsoluteSymlink(dir, file.Base(), target)
+ binary.post_install_cmds = append(binary.post_install_cmds, makeSymlinkCmd(dirOnDevice, file.Base(), target))
+
+ for _, symlink := range binary.symlinks {
+ ctx.InstallAbsoluteSymlink(dir, symlink, target)
+ binary.post_install_cmds = append(binary.post_install_cmds, makeSymlinkCmd(dirOnDevice, symlink, target))
+ }
+}
+
func (binary *binaryDecorator) install(ctx ModuleContext, file android.Path) {
+ // Bionic binaries (e.g. linker) is installed to the bootstrap subdirectory.
+ // The original path becomes a symlink to the corresponding file in the
+ // runtime APEX.
+ if isBionic(ctx.baseModuleName()) && ctx.Arch().Native && ctx.apexName() == "" && !ctx.inRecovery() {
+ binary.installSymlinkToRuntimeApex(ctx, file)
+ binary.baseInstaller.subDir = "bootstrap"
+ }
binary.baseInstaller.install(ctx, file)
for _, symlink := range binary.symlinks {
ctx.InstallSymlink(binary.baseInstaller.installDir(ctx), symlink, binary.baseInstaller.path)
diff --git a/cc/cc.go b/cc/cc.go
index 284b58d4..c036b841 100644
--- a/cc/cc.go
+++ b/cc/cc.go
@@ -599,6 +599,14 @@ func (c *Module) bootstrap() bool {
return Bool(c.Properties.Bootstrap)
}
+func isBionic(name string) bool {
+ switch name {
+ case "libc", "libm", "libdl", "linker":
+ return true
+ }
+ return false
+}
+
type baseModuleContext struct {
android.BaseContext
moduleContextImpl
diff --git a/cc/library.go b/cc/library.go
index 71a9df65..6404906c 100644
--- a/cc/library.go
+++ b/cc/library.go
@@ -15,6 +15,7 @@
package cc
import (
+ "path/filepath"
"regexp"
"sort"
"strconv"
@@ -290,6 +291,8 @@ type libraryDecorator struct {
versionScriptPath android.ModuleGenPath
+ post_install_cmds []string
+
// Decorated interafaces
*baseCompiler
*baseLinker
@@ -888,6 +891,14 @@ func (library *libraryDecorator) toc() android.OptionalPath {
return library.tocFile
}
+func (library *libraryDecorator) installSymlinkToRuntimeApex(ctx ModuleContext, file android.Path) {
+ dir := library.baseInstaller.installDir(ctx)
+ dirOnDevice := android.InstallPathToOnDevicePath(ctx, dir)
+ target := "/" + filepath.Join("apex", "com.android.runtime", dir.Base(), "bionic", file.Base())
+ ctx.InstallAbsoluteSymlink(dir, file.Base(), target)
+ library.post_install_cmds = append(library.post_install_cmds, makeSymlinkCmd(dirOnDevice, file.Base(), target))
+}
+
func (library *libraryDecorator) install(ctx ModuleContext, file android.Path) {
if library.shared() {
if ctx.Device() && ctx.useVndk() {
@@ -905,15 +916,11 @@ func (library *libraryDecorator) install(ctx ModuleContext, file android.Path) {
}
}
} else if len(library.Properties.Stubs.Versions) > 0 && android.DirectlyInAnyApex(ctx, ctx.ModuleName()) {
- // If a library in an APEX has stable versioned APIs, we basically don't need
- // to have the platform variant of the library in /system partition because
- // platform components can just use the lib from the APEX without fearing about
- // compatibility. However, if the library is required for some early processes
- // before the APEX is activated, the platform variant may also be required.
- // In that case, it is installed to the subdirectory 'bootstrap' in order to
- // be distinguished/isolated from other non-bootstrap libraries in /system/lib
- // so that the bootstrap libraries are used only when the APEX isn't ready.
- if !library.buildStubs() && ctx.Arch().Native {
+ // Bionic libraries (e.g. libc.so) is installed to the bootstrap subdirectory.
+ // The original path becomes a symlink to the corresponding file in the
+ // runtime APEX.
+ if isBionic(ctx.baseModuleName()) && !library.buildStubs() && ctx.Arch().Native && !ctx.inRecovery() {
+ library.installSymlinkToRuntimeApex(ctx, file)
library.baseInstaller.subDir = "bootstrap"
}
}
diff --git a/cc/util.go b/cc/util.go
index 925dd741..782bf614 100644
--- a/cc/util.go
+++ b/cc/util.go
@@ -133,3 +133,10 @@ func splitFileExt(name string) (string, string, string) {
return root, suffix, ext
}
+
+// linkDirOnDevice/linkName -> target
+func makeSymlinkCmd(linkDirOnDevice string, linkName string, target string) string {
+ dir := filepath.Join("$(PRODUCT_OUT)", linkDirOnDevice)
+ return "mkdir -p " + dir + " && " +
+ "ln -sf " + target + " " + filepath.Join(dir, linkName)
+}