diff --git a/rust/binary.go b/rust/binary.go index 860dc948a..146c683fb 100644 --- a/rust/binary.go +++ b/rust/binary.go @@ -137,12 +137,7 @@ func (binary *binaryDecorator) compile(ctx ModuleContext, flags Flags, deps Path fileName := binary.getStem(ctx) + ctx.toolchain().ExecutableSuffix() outputFile := android.PathForModuleOut(ctx, fileName) ret := buildOutput{outputFile: outputFile} - var crateRootPath android.Path - if binary.baseCompiler.Properties.Crate_root == nil { - crateRootPath, _ = srcPathFromModuleSrcs(ctx, binary.baseCompiler.Properties.Srcs) - } else { - crateRootPath = android.PathForModuleSrc(ctx, *binary.baseCompiler.Properties.Crate_root) - } + crateRootPath := binary.crateRootPath(ctx) flags.RustFlags = append(flags.RustFlags, deps.depFlags...) flags.LinkFlags = append(flags.LinkFlags, deps.depLinkFlags...) diff --git a/rust/compiler.go b/rust/compiler.go index 98bbcb645..899502a64 100644 --- a/rust/compiler.go +++ b/rust/compiler.go @@ -541,7 +541,7 @@ func (compiler *baseCompiler) relativeInstallPath() string { func (compiler *baseCompiler) crateRootPath(ctx ModuleContext) android.Path { if compiler.Properties.Crate_root == nil { - path, _ := srcPathFromModuleSrcs(ctx, compiler.Properties.Srcs) + path := srcPathFromModuleSrcs(ctx, compiler.Properties.Srcs) return path } else { return android.PathForModuleSrc(ctx, *compiler.Properties.Crate_root) @@ -549,7 +549,7 @@ func (compiler *baseCompiler) crateRootPath(ctx ModuleContext) android.Path { } // Returns the Path for the main source file along with Paths for generated source files from modules listed in srcs. -func srcPathFromModuleSrcs(ctx ModuleContext, srcs []string) (android.Path, android.Paths) { +func srcPathFromModuleSrcs(ctx ModuleContext, srcs []string) android.Path { if len(srcs) == 0 { ctx.PropertyErrorf("srcs", "srcs must not be empty") } @@ -580,5 +580,5 @@ func srcPathFromModuleSrcs(ctx ModuleContext, srcs []string) (android.Path, andr // TODO: b/297264540 - once all modules are sandboxed, we need to select the proper // entry point file from Srcs rather than taking the first one paths := android.PathsForModuleSrc(ctx, srcs) - return paths[srcIndex], paths[1:] + return paths[srcIndex] } diff --git a/rust/compiler_test.go b/rust/compiler_test.go index ec6829a1b..89f4d1abf 100644 --- a/rust/compiler_test.go +++ b/rust/compiler_test.go @@ -67,6 +67,7 @@ func TestCfgsToFlags(t *testing.T) { func TestEnforceSingleSourceFile(t *testing.T) { singleSrcError := "srcs can only contain one path for a rust file and source providers prefixed by \":\"" + prebuiltSingleSrcError := "prebuilt libraries can only have one entry in srcs" // Test libraries testRustError(t, singleSrcError, ` @@ -90,7 +91,7 @@ func TestEnforceSingleSourceFile(t *testing.T) { }`) // Test prebuilts - testRustError(t, singleSrcError, ` + testRustError(t, prebuiltSingleSrcError, ` rust_prebuilt_dylib { name: "foo-bar-prebuilt", srcs: ["liby.so", "libz.so"], diff --git a/rust/prebuilt.go b/rust/prebuilt.go index fe9d0b5dd..e35e510da 100644 --- a/rust/prebuilt.go +++ b/rust/prebuilt.go @@ -76,6 +76,17 @@ var _ compiler = (*prebuiltProcMacroDecorator)(nil) var _ exportedFlagsProducer = (*prebuiltProcMacroDecorator)(nil) var _ rustPrebuilt = (*prebuiltProcMacroDecorator)(nil) +func prebuiltPath(ctx ModuleContext, prebuilt rustPrebuilt) android.Path { + srcs := android.PathsForModuleSrc(ctx, prebuilt.prebuiltSrcs()) + if len(srcs) == 0 { + ctx.PropertyErrorf("srcs", "srcs must not be empty") + } + if len(srcs) > 1 { + ctx.PropertyErrorf("srcs", "prebuilt libraries can only have one entry in srcs (the prebuilt path)") + } + return srcs[0] +} + func PrebuiltLibraryFactory() android.Module { module, _ := NewPrebuiltLibrary(android.HostAndDeviceSupported) return module.Init() @@ -148,11 +159,7 @@ func (prebuilt *prebuiltLibraryDecorator) compilerProps() []interface{} { func (prebuilt *prebuiltLibraryDecorator) compile(ctx ModuleContext, flags Flags, deps PathDeps) buildOutput { prebuilt.flagExporter.exportLinkDirs(android.PathsForModuleSrc(ctx, prebuilt.Properties.Link_dirs).Strings()...) prebuilt.flagExporter.setProvider(ctx) - - srcPath, paths := srcPathFromModuleSrcs(ctx, prebuilt.prebuiltSrcs()) - if len(paths) > 0 { - ctx.PropertyErrorf("srcs", "prebuilt libraries can only have one entry in srcs (the prebuilt path)") - } + srcPath := prebuiltPath(ctx, prebuilt) prebuilt.baseCompiler.unstrippedOutputFile = srcPath return buildOutput{outputFile: srcPath} } @@ -205,11 +212,7 @@ func (prebuilt *prebuiltProcMacroDecorator) compilerProps() []interface{} { func (prebuilt *prebuiltProcMacroDecorator) compile(ctx ModuleContext, flags Flags, deps PathDeps) buildOutput { prebuilt.flagExporter.exportLinkDirs(android.PathsForModuleSrc(ctx, prebuilt.Properties.Link_dirs).Strings()...) prebuilt.flagExporter.setProvider(ctx) - - srcPath, paths := srcPathFromModuleSrcs(ctx, prebuilt.prebuiltSrcs()) - if len(paths) > 0 { - ctx.PropertyErrorf("srcs", "prebuilt libraries can only have one entry in srcs (the prebuilt path)") - } + srcPath := prebuiltPath(ctx, prebuilt) prebuilt.baseCompiler.unstrippedOutputFile = srcPath return buildOutput{outputFile: srcPath} } diff --git a/rust/proc_macro.go b/rust/proc_macro.go index b93b24f15..e3a48bff6 100644 --- a/rust/proc_macro.go +++ b/rust/proc_macro.go @@ -79,7 +79,7 @@ func (procMacro *procMacroDecorator) compile(ctx ModuleContext, flags Flags, dep fileName := procMacro.getStem(ctx) + ctx.toolchain().ProcMacroSuffix() outputFile := android.PathForModuleOut(ctx, fileName) - srcPath, _ := srcPathFromModuleSrcs(ctx, procMacro.baseCompiler.Properties.Srcs) + srcPath := procMacro.crateRootPath(ctx) ret := TransformSrctoProcMacro(ctx, srcPath, deps, flags, outputFile) procMacro.baseCompiler.unstrippedOutputFile = outputFile return ret