From 0cbd3b0e79a438d9ee35c82e52e18acfaeddab3e Mon Sep 17 00:00:00 2001 From: mrziwang Date: Thu, 20 Jun 2024 16:39:25 -0700 Subject: [PATCH] Add OutputFilesProvider support for singleton This CL also changes to use OutputFilesProvider on rust module, which has singleton involved. Test: CI Bug: 339477385 Bug: 348494466 Change-Id: Idc5c0fb9f8425f09184d5b73531ee3052e5a076c --- android/module.go | 38 ++++++++++++++++++++++++-------------- rust/rust.go | 39 +++++++++++++++------------------------ rust/test_test.go | 17 ++++++----------- 3 files changed, 45 insertions(+), 49 deletions(-) diff --git a/android/module.go b/android/module.go index a75f03f6d..7e34a3fe2 100644 --- a/android/module.go +++ b/android/module.go @@ -2527,34 +2527,44 @@ func outputFilesForModule(ctx PathContext, module blueprint.Module, tag string) // reading OutputFilesProvider before GenerateBuildActions is finished. // If a module doesn't have the OutputFilesProvider, nil is returned. func outputFilesForModuleFromProvider(ctx PathContext, module blueprint.Module, tag string) (Paths, error) { - // TODO: support OutputFilesProvider for singletons - mctx, ok := ctx.(ModuleContext) - if !ok { - return nil, nil - } - if mctx.Module() != module { - if outputFilesProvider, ok := OtherModuleProvider(mctx, module, OutputFilesProvider); ok { + var outputFilesProvider OutputFilesInfo + + if mctx, isMctx := ctx.(ModuleContext); isMctx { + if mctx.Module() != module { + outputFilesProvider, _ = OtherModuleProvider(mctx, module, OutputFilesProvider) + } else { if tag == "" { - return outputFilesProvider.DefaultOutputFiles, nil - } else if taggedOutputFiles, hasTag := outputFilesProvider.TaggedOutputFiles[tag]; hasTag { + return mctx.Module().base().outputFiles.DefaultOutputFiles, nil + } else if taggedOutputFiles, hasTag := mctx.Module().base().outputFiles.TaggedOutputFiles[tag]; hasTag { return taggedOutputFiles, nil } else { - return nil, fmt.Errorf("unsupported module reference tag %q", tag) + return nil, fmt.Errorf("unsupported tag %q for module getting its own output files", tag) } } - } else { + } else if cta, isCta := ctx.(*singletonContextAdaptor); isCta { + providerData, _ := cta.moduleProvider(module, OutputFilesProvider) + outputFilesProvider, _ = providerData.(OutputFilesInfo) + } + // TODO: Add a check for skipped context + + if !outputFilesProvider.isEmpty() { if tag == "" { - return mctx.Module().base().outputFiles.DefaultOutputFiles, nil - } else if taggedOutputFiles, hasTag := mctx.Module().base().outputFiles.TaggedOutputFiles[tag]; hasTag { + return outputFilesProvider.DefaultOutputFiles, nil + } else if taggedOutputFiles, hasTag := outputFilesProvider.TaggedOutputFiles[tag]; hasTag { return taggedOutputFiles, nil } else { - return nil, fmt.Errorf("unsupported tag %q for module getting its own output files", tag) + return nil, fmt.Errorf("unsupported module reference tag %q", tag) } } + // TODO: Add a check for param module not having OutputFilesProvider set return nil, nil } +func (o OutputFilesInfo) isEmpty() bool { + return o.DefaultOutputFiles == nil && o.TaggedOutputFiles == nil +} + type OutputFilesInfo struct { // default output files when tag is an empty string "" DefaultOutputFiles Paths diff --git a/rust/rust.go b/rust/rust.go index 7cd9df4c7..042ba8e17 100644 --- a/rust/rust.go +++ b/rust/rust.go @@ -206,27 +206,6 @@ func (mod *Module) IsPrebuilt() bool { return false } -func (mod *Module) OutputFiles(tag string) (android.Paths, error) { - switch tag { - case "": - if mod.sourceProvider != nil && (mod.compiler == nil || mod.compiler.Disabled()) { - return mod.sourceProvider.Srcs(), nil - } else { - if mod.OutputFile().Valid() { - return android.Paths{mod.OutputFile().Path()}, nil - } - return android.Paths{}, nil - } - case "unstripped": - if mod.compiler != nil { - return android.PathsIfNonNil(mod.compiler.unstrippedOutputFilePath()), nil - } - return nil, nil - default: - return nil, fmt.Errorf("unsupported module reference tag %q", tag) - } -} - func (mod *Module) SelectedStl() string { return "" } @@ -986,6 +965,20 @@ func (mod *Module) GenerateAndroidBuildActions(actx android.ModuleContext) { if mod.testModule { android.SetProvider(ctx, testing.TestModuleProviderKey, testing.TestModuleProviderData{}) } + mod.setOutputFiles(ctx) +} + +func (mod *Module) setOutputFiles(ctx ModuleContext) { + if mod.sourceProvider != nil && (mod.compiler == nil || mod.compiler.Disabled()) { + ctx.SetOutputFiles(mod.sourceProvider.Srcs(), "") + } else if mod.OutputFile().Valid() { + ctx.SetOutputFiles(android.Paths{mod.OutputFile().Path()}, "") + } else { + ctx.SetOutputFiles(android.Paths{}, "") + } + if mod.compiler != nil { + ctx.SetOutputFiles(android.PathsIfNonNil(mod.compiler.unstrippedOutputFilePath()), "unstripped") + } } func (mod *Module) deps(ctx DepsContext) Deps { @@ -1469,7 +1462,7 @@ func (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps { var srcProviderDepFiles android.Paths for _, dep := range directSrcProvidersDeps { - srcs, _ := dep.OutputFiles("") + srcs := android.OutputFilesForModule(ctx, dep, "") srcProviderDepFiles = append(srcProviderDepFiles, srcs...) } for _, dep := range directSrcDeps { @@ -1856,5 +1849,3 @@ var Bool = proptools.Bool var BoolDefault = proptools.BoolDefault var String = proptools.String var StringPtr = proptools.StringPtr - -var _ android.OutputFileProducer = (*Module)(nil) diff --git a/rust/test_test.go b/rust/test_test.go index 6d0ebcf28..dc796c8a4 100644 --- a/rust/test_test.go +++ b/rust/test_test.go @@ -106,12 +106,9 @@ func TestDataLibs(t *testing.T) { ctx := testRust(t, bp) - module := ctx.ModuleForTests("main_test", "android_arm64_armv8-a").Module() - testBinary := module.(*Module).compiler.(*testDecorator) - outputFiles, err := module.(android.OutputFileProducer).OutputFiles("") - if err != nil { - t.Fatalf("Expected rust_test to produce output files, error: %s", err) - } + testingModule := ctx.ModuleForTests("main_test", "android_arm64_armv8-a") + testBinary := testingModule.Module().(*Module).compiler.(*testDecorator) + outputFiles := testingModule.OutputFiles(t, "") if len(outputFiles) != 1 { t.Fatalf("expected exactly one output file. output files: [%s]", outputFiles) } @@ -168,12 +165,10 @@ func TestDataLibsRelativeInstallPath(t *testing.T) { ` ctx := testRust(t, bp) - module := ctx.ModuleForTests("main_test", "android_arm64_armv8-a").Module() + testingModule := ctx.ModuleForTests("main_test", "android_arm64_armv8-a") + module := testingModule.Module() testBinary := module.(*Module).compiler.(*testDecorator) - outputFiles, err := module.(android.OutputFileProducer).OutputFiles("") - if err != nil { - t.Fatalf("Expected rust_test to produce output files, error: %s", err) - } + outputFiles := testingModule.OutputFiles(t, "") if len(outputFiles) != 1 { t.Fatalf("expected exactly one output file. output files: [%s]", outputFiles) }