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:
@@ -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
|
||||||
|
39
rust/rust.go
39
rust/rust.go
@@ -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)
|
|
||||||
|
@@ -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)
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user