From 4d945ee719be41aab43b5b2e9f105a1e721ecf46 Mon Sep 17 00:00:00 2001 From: Inseob Kim Date: Thu, 24 Feb 2022 10:29:18 +0900 Subject: [PATCH] Fix snapshot symlinks LOCAL_MODULE_SYMLINKS was enough to install symlinks for snapshot binaries. However, Soong now requires LOCAL_SOONG_INSTALLED_SYMLINKS, which results in broken symlink support in snapshots. This fixes symlink problems, and then amends the Soong snapshot test. Bug: 220639435 Bug: 220907049 Test: manually add symlinks and try building Test: Soong test Change-Id: Ia75ddf3aa642558e396f1d80736310c3c8d02ad1 --- cc/androidmk.go | 4 ---- cc/binary.go | 16 ++++++++++------ cc/snapshot_prebuilt.go | 3 +++ cc/vendor_snapshot_test.go | 17 ++++++++++++++++- 4 files changed, 29 insertions(+), 11 deletions(-) diff --git a/cc/androidmk.go b/cc/androidmk.go index 92902729c..318cd7c77 100644 --- a/cc/androidmk.go +++ b/cc/androidmk.go @@ -560,10 +560,6 @@ func (c *snapshotLibraryDecorator) AndroidMkEntries(ctx AndroidMkContext, entrie func (c *snapshotBinaryDecorator) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) { entries.Class = "EXECUTABLES" entries.SubName = c.baseProperties.Androidmk_suffix - - entries.ExtraEntries = append(entries.ExtraEntries, func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) { - entries.AddStrings("LOCAL_MODULE_SYMLINKS", c.Properties.Symlinks...) - }) } func (c *snapshotObjectLinker) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) { diff --git a/cc/binary.go b/cc/binary.go index 6c7d581ec..0fe44903c 100644 --- a/cc/binary.go +++ b/cc/binary.go @@ -441,6 +441,16 @@ func (binary *binaryDecorator) link(ctx ModuleContext, // Need to determine symlinks early since some targets (ie APEX) need this // information but will not call 'install' + binary.setSymlinkList(ctx) + + return ret +} + +func (binary *binaryDecorator) unstrippedOutputFilePath() android.Path { + return binary.unstrippedOutputFile +} + +func (binary *binaryDecorator) setSymlinkList(ctx ModuleContext) { for _, symlink := range binary.Properties.Symlinks { binary.symlinks = append(binary.symlinks, symlink+String(binary.Properties.Suffix)+ctx.toolchain().ExecutableSuffix()) @@ -457,12 +467,6 @@ func (binary *binaryDecorator) link(ctx ModuleContext, binary.preferredArchSymlink = symlinkName } } - - return ret -} - -func (binary *binaryDecorator) unstrippedOutputFilePath() android.Path { - return binary.unstrippedOutputFile } func (binary *binaryDecorator) symlinkList() []string { diff --git a/cc/snapshot_prebuilt.go b/cc/snapshot_prebuilt.go index 753d74c75..9d40ad058 100644 --- a/cc/snapshot_prebuilt.go +++ b/cc/snapshot_prebuilt.go @@ -680,6 +680,9 @@ func (p *snapshotBinaryDecorator) link(ctx ModuleContext, flags Flags, deps Path Input: in, }) + // binary snapshots need symlinking + p.setSymlinkList(ctx) + return outputFile } diff --git a/cc/vendor_snapshot_test.go b/cc/vendor_snapshot_test.go index 645b2ccf6..2bb43abe8 100644 --- a/cc/vendor_snapshot_test.go +++ b/cc/vendor_snapshot_test.go @@ -741,6 +741,7 @@ func TestVendorSnapshotUse(t *testing.T) { src: "bin", }, }, + symlinks: ["binfoo", "binbar"], } vendor_snapshot_binary { @@ -920,7 +921,21 @@ func TestVendorSnapshotUse(t *testing.T) { ctx.ModuleForTests("libvendor_without_snapshot", sharedVariant).Output("libvendor_without_snapshot.so") // bin is installed by bin.vendor_binary.31.arm64 - ctx.ModuleForTests("bin.vendor_binary.31.arm64", binaryVariant).Output("bin") + bin64Module := ctx.ModuleForTests("bin.vendor_binary.31.arm64", binaryVariant) + bin64Module.Output("bin") + + // also test symlinks + bin64MkEntries := android.AndroidMkEntriesForTest(t, ctx, bin64Module.Module()) + bin64KatiSymlinks := bin64MkEntries[0].EntryMap["LOCAL_SOONG_INSTALL_SYMLINKS"] + + // Either AndroidMk entries contain symlinks, or symlinks should be installed by Soong + for _, symlink := range []string{"binfoo", "binbar"} { + if inList(symlink, bin64KatiSymlinks) { + continue + } + + bin64Module.Output(symlink) + } // bin32 is installed by bin32.vendor_binary.31.arm64 ctx.ModuleForTests("bin32.vendor_binary.31.arm64", binary32Variant).Output("bin32")