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
This commit is contained in:
mrziwang
2024-06-20 16:39:25 -07:00
parent fe658ac53a
commit 0cbd3b0e79
3 changed files with 45 additions and 49 deletions

View File

@@ -2527,34 +2527,44 @@ func outputFilesForModule(ctx PathContext, module blueprint.Module, tag string)
// reading OutputFilesProvider before GenerateBuildActions is finished. // reading OutputFilesProvider before GenerateBuildActions is finished.
// If a module doesn't have the OutputFilesProvider, nil is returned. // If a module doesn't have the OutputFilesProvider, nil is returned.
func outputFilesForModuleFromProvider(ctx PathContext, module blueprint.Module, tag string) (Paths, error) { func outputFilesForModuleFromProvider(ctx PathContext, module blueprint.Module, tag string) (Paths, error) {
// TODO: support OutputFilesProvider for singletons var outputFilesProvider OutputFilesInfo
mctx, ok := ctx.(ModuleContext)
if !ok { if mctx, isMctx := ctx.(ModuleContext); isMctx {
return nil, nil if mctx.Module() != module {
} outputFilesProvider, _ = OtherModuleProvider(mctx, module, OutputFilesProvider)
if mctx.Module() != module { } else {
if outputFilesProvider, ok := OtherModuleProvider(mctx, module, OutputFilesProvider); ok {
if tag == "" { if tag == "" {
return outputFilesProvider.DefaultOutputFiles, nil return mctx.Module().base().outputFiles.DefaultOutputFiles, nil
} else if taggedOutputFiles, hasTag := outputFilesProvider.TaggedOutputFiles[tag]; hasTag { } else if taggedOutputFiles, hasTag := mctx.Module().base().outputFiles.TaggedOutputFiles[tag]; hasTag {
return taggedOutputFiles, nil return taggedOutputFiles, nil
} else { } 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 == "" { if tag == "" {
return mctx.Module().base().outputFiles.DefaultOutputFiles, nil return outputFilesProvider.DefaultOutputFiles, nil
} else if taggedOutputFiles, hasTag := mctx.Module().base().outputFiles.TaggedOutputFiles[tag]; hasTag { } else if taggedOutputFiles, hasTag := outputFilesProvider.TaggedOutputFiles[tag]; hasTag {
return taggedOutputFiles, nil return taggedOutputFiles, nil
} else { } 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 // TODO: Add a check for param module not having OutputFilesProvider set
return nil, nil return nil, nil
} }
func (o OutputFilesInfo) isEmpty() bool {
return o.DefaultOutputFiles == nil && o.TaggedOutputFiles == nil
}
type OutputFilesInfo struct { type OutputFilesInfo struct {
// default output files when tag is an empty string "" // default output files when tag is an empty string ""
DefaultOutputFiles Paths DefaultOutputFiles Paths

View File

@@ -206,27 +206,6 @@ func (mod *Module) IsPrebuilt() bool {
return false 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 { func (mod *Module) SelectedStl() string {
return "" return ""
} }
@@ -986,6 +965,20 @@ func (mod *Module) GenerateAndroidBuildActions(actx android.ModuleContext) {
if mod.testModule { if mod.testModule {
android.SetProvider(ctx, testing.TestModuleProviderKey, testing.TestModuleProviderData{}) 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 { func (mod *Module) deps(ctx DepsContext) Deps {
@@ -1469,7 +1462,7 @@ func (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
var srcProviderDepFiles android.Paths var srcProviderDepFiles android.Paths
for _, dep := range directSrcProvidersDeps { for _, dep := range directSrcProvidersDeps {
srcs, _ := dep.OutputFiles("") srcs := android.OutputFilesForModule(ctx, dep, "")
srcProviderDepFiles = append(srcProviderDepFiles, srcs...) srcProviderDepFiles = append(srcProviderDepFiles, srcs...)
} }
for _, dep := range directSrcDeps { for _, dep := range directSrcDeps {
@@ -1856,5 +1849,3 @@ var Bool = proptools.Bool
var BoolDefault = proptools.BoolDefault var BoolDefault = proptools.BoolDefault
var String = proptools.String var String = proptools.String
var StringPtr = proptools.StringPtr var StringPtr = proptools.StringPtr
var _ android.OutputFileProducer = (*Module)(nil)

View File

@@ -106,12 +106,9 @@ func TestDataLibs(t *testing.T) {
ctx := testRust(t, bp) ctx := testRust(t, bp)
module := ctx.ModuleForTests("main_test", "android_arm64_armv8-a").Module() testingModule := ctx.ModuleForTests("main_test", "android_arm64_armv8-a")
testBinary := module.(*Module).compiler.(*testDecorator) testBinary := testingModule.Module().(*Module).compiler.(*testDecorator)
outputFiles, err := module.(android.OutputFileProducer).OutputFiles("") outputFiles := testingModule.OutputFiles(t, "")
if err != nil {
t.Fatalf("Expected rust_test to produce output files, error: %s", err)
}
if len(outputFiles) != 1 { if len(outputFiles) != 1 {
t.Fatalf("expected exactly one output file. output files: [%s]", outputFiles) t.Fatalf("expected exactly one output file. output files: [%s]", outputFiles)
} }
@@ -168,12 +165,10 @@ func TestDataLibsRelativeInstallPath(t *testing.T) {
` `
ctx := testRust(t, bp) 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) testBinary := module.(*Module).compiler.(*testDecorator)
outputFiles, err := module.(android.OutputFileProducer).OutputFiles("") outputFiles := testingModule.OutputFiles(t, "")
if err != nil {
t.Fatalf("Expected rust_test to produce output files, error: %s", err)
}
if len(outputFiles) != 1 { if len(outputFiles) != 1 {
t.Fatalf("expected exactly one output file. output files: [%s]", outputFiles) t.Fatalf("expected exactly one output file. output files: [%s]", outputFiles)
} }