Use the the preferred architecture symlink as the tool path if it exists

When a genrule uses a binary with symlink_preferred_arch set as a tool,
use the symlink instead of the binary as the tool, as the symlink is
the more canonical name for the binary.

Test: m checkbuild
Change-Id: I5330b57139f03ca07bf70547261f191ed84ec9b8
This commit is contained in:
Colin Cross
2020-11-12 12:14:36 -08:00
parent 1d26d3033a
commit a615901b53

View File

@@ -95,6 +95,10 @@ type binaryDecorator struct {
// Names of symlinks to be installed for use in LOCAL_MODULE_SYMLINKS
symlinks []string
// If the module has symlink_preferred_arch set, the name of the symlink to the
// binary for the preferred arch.
preferredArchSymlink string
// Output archive of gcno coverage information
coverageOutputFile android.OptionalPath
@@ -402,7 +406,9 @@ func (binary *binaryDecorator) link(ctx ModuleContext,
ctx.PropertyErrorf("symlink_preferred_arch", "must also specify suffix")
}
if ctx.TargetPrimary() {
binary.symlinks = append(binary.symlinks, binary.getStemWithoutSuffix(ctx))
symlinkName := binary.getStemWithoutSuffix(ctx)
binary.symlinks = append(binary.symlinks, symlinkName)
binary.preferredArchSymlink = symlinkName
}
}
@@ -455,12 +461,26 @@ func (binary *binaryDecorator) install(ctx ModuleContext, file android.Path) {
binary.baseInstaller.subDir = "bootstrap"
}
binary.baseInstaller.install(ctx, file)
var preferredArchSymlinkPath android.OptionalPath
for _, symlink := range binary.symlinks {
ctx.InstallSymlink(binary.baseInstaller.installDir(ctx), symlink, binary.baseInstaller.path)
installedSymlink := ctx.InstallSymlink(binary.baseInstaller.installDir(ctx), symlink,
binary.baseInstaller.path)
if symlink == binary.preferredArchSymlink {
// If this is the preferred arch symlink, save the installed path for use as the
// tool path.
preferredArchSymlinkPath = android.OptionalPathForPath(installedSymlink)
}
}
if ctx.Os().Class == android.Host {
binary.toolPath = android.OptionalPathForPath(binary.baseInstaller.path)
// If the binary is multilib with a symlink to the preferred architecture, use the
// symlink instead of the binary because that's the more "canonical" name.
if preferredArchSymlinkPath.Valid() {
binary.toolPath = preferredArchSymlinkPath
} else {
binary.toolPath = android.OptionalPathForPath(binary.baseInstaller.path)
}
}
}