Fix proc_macro dependency handling.
Currently proc_macros don't pull in the correct arch dependencies when the host arch differs from the target arch. This fixes how proc_macro dependencies are handled by defining them as always being host-only and including them as dependencies for device-modules by using AddFarVariationDependencies. Bug: 141491501 Test: Example device rust module builds with proc_macro dependency. Change-Id: Ic037dc406ce90526f8b68c92fffc0d93a498a4ff
This commit is contained in:
@@ -43,28 +43,19 @@ func init() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TransformSrcToBinary(ctx android.ModuleContext, mainSrc android.Path, deps PathDeps, flags Flags, outputFile android.WritablePath, includeDirs []string) {
|
func TransformSrcToBinary(ctx android.ModuleContext, mainSrc android.Path, deps PathDeps, flags Flags, outputFile android.WritablePath, includeDirs []string) {
|
||||||
targetTriple := ctx.(ModuleContext).toolchain().RustTriple()
|
transformSrctoCrate(ctx, mainSrc, deps.RLibs, deps.DyLibs, deps.ProcMacros, deps.StaticLibs, deps.SharedLibs, flags, outputFile, "bin", includeDirs)
|
||||||
|
|
||||||
transformSrctoCrate(ctx, mainSrc, deps.RLibs, deps.DyLibs, deps.ProcMacros, deps.StaticLibs, deps.SharedLibs, flags, outputFile, "bin", includeDirs, targetTriple)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func TransformSrctoRlib(ctx android.ModuleContext, mainSrc android.Path, deps PathDeps, flags Flags, outputFile android.WritablePath, includeDirs []string) {
|
func TransformSrctoRlib(ctx android.ModuleContext, mainSrc android.Path, deps PathDeps, flags Flags, outputFile android.WritablePath, includeDirs []string) {
|
||||||
targetTriple := ctx.(ModuleContext).toolchain().RustTriple()
|
transformSrctoCrate(ctx, mainSrc, deps.RLibs, deps.DyLibs, deps.ProcMacros, deps.StaticLibs, deps.SharedLibs, flags, outputFile, "rlib", includeDirs)
|
||||||
|
|
||||||
transformSrctoCrate(ctx, mainSrc, deps.RLibs, deps.DyLibs, deps.ProcMacros, deps.StaticLibs, deps.SharedLibs, flags, outputFile, "rlib", includeDirs, targetTriple)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func TransformSrctoDylib(ctx android.ModuleContext, mainSrc android.Path, deps PathDeps, flags Flags, outputFile android.WritablePath, includeDirs []string) {
|
func TransformSrctoDylib(ctx android.ModuleContext, mainSrc android.Path, deps PathDeps, flags Flags, outputFile android.WritablePath, includeDirs []string) {
|
||||||
targetTriple := ctx.(ModuleContext).toolchain().RustTriple()
|
transformSrctoCrate(ctx, mainSrc, deps.RLibs, deps.DyLibs, deps.ProcMacros, deps.StaticLibs, deps.SharedLibs, flags, outputFile, "dylib", includeDirs)
|
||||||
|
|
||||||
transformSrctoCrate(ctx, mainSrc, deps.RLibs, deps.DyLibs, deps.ProcMacros, deps.StaticLibs, deps.SharedLibs, flags, outputFile, "dylib", includeDirs, targetTriple)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func TransformSrctoProcMacro(ctx android.ModuleContext, mainSrc android.Path, deps PathDeps, flags Flags, outputFile android.WritablePath, includeDirs []string) {
|
func TransformSrctoProcMacro(ctx android.ModuleContext, mainSrc android.Path, deps PathDeps, flags Flags, outputFile android.WritablePath, includeDirs []string) {
|
||||||
// Proc macros are compiler plugins, and thus should target the host compiler
|
transformSrctoCrate(ctx, mainSrc, deps.RLibs, deps.DyLibs, deps.ProcMacros, deps.StaticLibs, deps.SharedLibs, flags, outputFile, "proc-macro", includeDirs)
|
||||||
targetTriple := ""
|
|
||||||
|
|
||||||
transformSrctoCrate(ctx, mainSrc, deps.RLibs, deps.DyLibs, deps.ProcMacros, deps.StaticLibs, deps.SharedLibs, flags, outputFile, "proc-macro", includeDirs, targetTriple)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func rustLibsToPaths(libs RustLibraries) android.Paths {
|
func rustLibsToPaths(libs RustLibraries) android.Paths {
|
||||||
@@ -76,12 +67,13 @@ func rustLibsToPaths(libs RustLibraries) android.Paths {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func transformSrctoCrate(ctx android.ModuleContext, main android.Path,
|
func transformSrctoCrate(ctx android.ModuleContext, main android.Path,
|
||||||
rlibs, dylibs, proc_macros RustLibraries, static_libs, shared_libs android.Paths, flags Flags, outputFile android.WritablePath, crate_type string, includeDirs []string, targetTriple string) {
|
rlibs, dylibs, proc_macros RustLibraries, static_libs, shared_libs android.Paths, flags Flags, outputFile android.WritablePath, crate_type string, includeDirs []string) {
|
||||||
|
|
||||||
var inputs android.Paths
|
var inputs android.Paths
|
||||||
var deps android.Paths
|
var deps android.Paths
|
||||||
var libFlags, rustcFlags []string
|
var libFlags, rustcFlags []string
|
||||||
crate_name := ctx.(ModuleContext).CrateName()
|
crate_name := ctx.(ModuleContext).CrateName()
|
||||||
|
targetTriple := ctx.(ModuleContext).toolchain().RustTriple()
|
||||||
|
|
||||||
inputs = append(inputs, main)
|
inputs = append(inputs, main)
|
||||||
|
|
||||||
|
@@ -64,7 +64,6 @@ func TestEnforceSingleSourceFile(t *testing.T) {
|
|||||||
rust_proc_macro {
|
rust_proc_macro {
|
||||||
name: "foo-bar-proc-macro",
|
name: "foo-bar-proc-macro",
|
||||||
srcs: ["foo.rs", "src/bar.rs"],
|
srcs: ["foo.rs", "src/bar.rs"],
|
||||||
host_supported: true,
|
|
||||||
}`)
|
}`)
|
||||||
|
|
||||||
// Test prebuilts
|
// Test prebuilts
|
||||||
|
@@ -45,7 +45,7 @@ type procMacroInterface interface {
|
|||||||
var _ compiler = (*procMacroDecorator)(nil)
|
var _ compiler = (*procMacroDecorator)(nil)
|
||||||
|
|
||||||
func ProcMacroFactory() android.Module {
|
func ProcMacroFactory() android.Module {
|
||||||
module, _ := NewProcMacro(android.HostAndDeviceSupported)
|
module, _ := NewProcMacro(android.HostSupportedNoCross)
|
||||||
return module.Init()
|
return module.Init()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
16
rust/rust.go
16
rust/rust.go
@@ -321,15 +321,6 @@ func (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
|
|||||||
if rustDep, ok := dep.(*Module); ok {
|
if rustDep, ok := dep.(*Module); ok {
|
||||||
//Handle Rust Modules
|
//Handle Rust Modules
|
||||||
|
|
||||||
if rustDep.Target().Os != ctx.Os() {
|
|
||||||
ctx.ModuleErrorf("OS mismatch between %q and %q", ctx.ModuleName(), depName)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if rustDep.Target().Arch.ArchType != ctx.Arch().ArchType {
|
|
||||||
ctx.ModuleErrorf("Arch mismatch between %q and %q", ctx.ModuleName(), depName)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
linkFile := rustDep.outputFile
|
linkFile := rustDep.outputFile
|
||||||
if !linkFile.Valid() {
|
if !linkFile.Valid() {
|
||||||
ctx.ModuleErrorf("Invalid output file when adding dep %q to %q", depName, ctx.ModuleName())
|
ctx.ModuleErrorf("Invalid output file when adding dep %q to %q", depName, ctx.ModuleName())
|
||||||
@@ -361,9 +352,6 @@ func (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
|
|||||||
if lib, ok := rustDep.compiler.(*libraryDecorator); ok {
|
if lib, ok := rustDep.compiler.(*libraryDecorator); ok {
|
||||||
depPaths.linkDirs = append(depPaths.linkDirs, lib.exportedDirs()...)
|
depPaths.linkDirs = append(depPaths.linkDirs, lib.exportedDirs()...)
|
||||||
depPaths.depFlags = append(depPaths.depFlags, lib.exportedDepFlags()...)
|
depPaths.depFlags = append(depPaths.depFlags, lib.exportedDepFlags()...)
|
||||||
} else if procMacro, ok := rustDep.compiler.(*libraryDecorator); ok {
|
|
||||||
depPaths.linkDirs = append(depPaths.linkDirs, procMacro.exportedDirs()...)
|
|
||||||
depPaths.depFlags = append(depPaths.depFlags, procMacro.exportedDepFlags()...)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Append this dependencies output to this mod's linkDirs so they can be exported to dependencies
|
// Append this dependencies output to this mod's linkDirs so they can be exported to dependencies
|
||||||
@@ -491,7 +479,9 @@ func (mod *Module) DepsMutator(actx android.BottomUpMutatorContext) {
|
|||||||
}
|
}
|
||||||
actx.AddVariationDependencies(append(ccDepVariations, blueprint.Variation{Mutator: "link", Variation: "shared"}), cc.SharedDepTag(), deps.SharedLibs...)
|
actx.AddVariationDependencies(append(ccDepVariations, blueprint.Variation{Mutator: "link", Variation: "shared"}), cc.SharedDepTag(), deps.SharedLibs...)
|
||||||
actx.AddVariationDependencies(append(ccDepVariations, blueprint.Variation{Mutator: "link", Variation: "static"}), cc.StaticDepTag(), deps.StaticLibs...)
|
actx.AddVariationDependencies(append(ccDepVariations, blueprint.Variation{Mutator: "link", Variation: "static"}), cc.StaticDepTag(), deps.StaticLibs...)
|
||||||
actx.AddDependency(mod, procMacroDepTag, deps.ProcMacros...)
|
|
||||||
|
// proc_macros are compiler plugins, and so we need the host arch variant as a dependendcy.
|
||||||
|
actx.AddFarVariationDependencies([]blueprint.Variation{{Mutator: "arch", Variation: ctx.Config().BuildOsVariant}}, procMacroDepTag, deps.ProcMacros...)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (mod *Module) Name() string {
|
func (mod *Module) Name() string {
|
||||||
|
@@ -150,7 +150,6 @@ func TestDepsTracking(t *testing.T) {
|
|||||||
rust_proc_macro {
|
rust_proc_macro {
|
||||||
name: "libpm",
|
name: "libpm",
|
||||||
srcs: ["foo.rs"],
|
srcs: ["foo.rs"],
|
||||||
host_supported: true,
|
|
||||||
}
|
}
|
||||||
rust_binary_host {
|
rust_binary_host {
|
||||||
name: "fizz-buzz",
|
name: "fizz-buzz",
|
||||||
|
Reference in New Issue
Block a user