From c62a5107f8cd70b8328c14df50eef00ab96f7243 Mon Sep 17 00:00:00 2001 From: Paul Duffin Date: Wed, 11 Dec 2019 18:34:15 +0000 Subject: [PATCH] Discard duplicate operations to copy files to snapshot Header include directories are copied into the snapshot separately for each cc library that exports them. However, the same include directories can be exported by multiple libraries which caused ninja error because two separate rules (albeit identical) were defined to create the same files. This avoids the duplicate ninja rules by detecting and discarding duplicate copies, i.e. where the source and destination are the same. It will also report an error if two or more different source files are copied to the same destination. Bug: 142918168 Test: m nothing added test and verified it produced two identical copy rules fixed code and verified duplicate copy rules had been eliminated Change-Id: I39e37405035bee5093f96e03248e9e29ed30962c --- sdk/cc_sdk_test.go | 39 +++++++++++++++++++++++++++++++++++++++ sdk/update.go | 29 ++++++++++++++++++++++------- 2 files changed, 61 insertions(+), 7 deletions(-) diff --git a/sdk/cc_sdk_test.go b/sdk/cc_sdk_test.go index 7620ec1ab..3d081d083 100644 --- a/sdk/cc_sdk_test.go +++ b/sdk/cc_sdk_test.go @@ -142,6 +142,45 @@ func TestBasicSdkWithCc(t *testing.T) { ensureListContains(t, pathsToStrings(cpplibForMyApex2.Rule("ld").Implicits), sdkMemberV2.String()) } +func TestSnapshotWithCcDuplicateHeaders(t *testing.T) { + result := testSdkWithCc(t, ` + sdk { + name: "mysdk", + native_shared_libs: ["mynativelib1", "mynativelib2"], + } + + cc_library_shared { + name: "mynativelib1", + srcs: [ + "Test.cpp", + ], + export_include_dirs: ["include"], + system_shared_libs: [], + stl: "none", + } + + cc_library_shared { + name: "mynativelib2", + srcs: [ + "Test.cpp", + ], + export_include_dirs: ["include"], + system_shared_libs: [], + stl: "none", + } + `) + + result.CheckSnapshot("mysdk", "android_common", "", + checkAllCopyRules(` +include/Test.h -> include/include/Test.h +.intermediates/mynativelib1/android_arm64_armv8-a_core_shared/mynativelib1.so -> arm64/lib/mynativelib1.so +.intermediates/mynativelib1/android_arm_armv7-a-neon_core_shared/mynativelib1.so -> arm/lib/mynativelib1.so +.intermediates/mynativelib2/android_arm64_armv8-a_core_shared/mynativelib2.so -> arm64/lib/mynativelib2.so +.intermediates/mynativelib2/android_arm_armv7-a-neon_core_shared/mynativelib2.so -> arm/lib/mynativelib2.so +`), + ) +} + func TestSnapshotWithCcShared(t *testing.T) { result := testSdkWithCc(t, ` sdk { diff --git a/sdk/update.go b/sdk/update.go index 324f6c315..52d21eda6 100644 --- a/sdk/update.go +++ b/sdk/update.go @@ -184,6 +184,7 @@ func (s *sdk) buildSnapshot(ctx android.ModuleContext) android.OutputPath { sdk: s, version: "current", snapshotDir: snapshotDir.OutputPath, + copies: make(map[string]string), filesToZip: []android.Path{bp.path}, bpFile: bpFile, prebuiltModules: make(map[string]*bpModule), @@ -337,6 +338,11 @@ type snapshotBuilder struct { version string snapshotDir android.OutputPath bpFile *bpFile + + // Map from destination to source of each copy - used to eliminate duplicates and + // detect conflicts. + copies map[string]string + filesToZip android.Paths zipsToMerge android.Paths @@ -345,13 +351,22 @@ type snapshotBuilder struct { } func (s *snapshotBuilder) CopyToSnapshot(src android.Path, dest string) { - path := s.snapshotDir.Join(s.ctx, dest) - s.ctx.Build(pctx, android.BuildParams{ - Rule: android.Cp, - Input: src, - Output: path, - }) - s.filesToZip = append(s.filesToZip, path) + if existing, ok := s.copies[dest]; ok { + if existing != src.String() { + s.ctx.ModuleErrorf("conflicting copy, %s copied from both %s and %s", dest, existing, src) + return + } + } else { + path := s.snapshotDir.Join(s.ctx, dest) + s.ctx.Build(pctx, android.BuildParams{ + Rule: android.Cp, + Input: src, + Output: path, + }) + s.filesToZip = append(s.filesToZip, path) + + s.copies[dest] = src.String() + } } func (s *snapshotBuilder) UnzipToSnapshot(zipPath android.Path, destDir string) {