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) {