Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bb3add11 authored by Matthew Maurer's avatar Matthew Maurer
Browse files

rust: Suppress default sysroot unconditionally

With proper prebuilt modules, we can avoid any rustc implicit sysroot
searching.

Asd a bonus, this should make rust-project.json generation correctly
grab otherwise implicit dependencies.

Prebuilt rlibs may include several dependency rlibs. Without a
link_dirs attribute, every dependency (even if unexported) would need a
separate module.

Previously we were casing out on exact structs, which might be OK when
libraryDecorator and procMacroDecorator were the only possibilities, but
repeating the logic for three types is too much. Using an interface
makes this logic scale better.

Bug: 159591910
Test: cd external/rust; mma; m crosvm.experimental
Change-Id: Ia1124e09f48cd05e39f094bbcb988622ebd2272f
parent c761eeca
Loading
Loading
Loading
Loading
+18 −24
Original line number Diff line number Diff line
@@ -70,37 +70,37 @@ func init() {
}

func TransformSrcToBinary(ctx ModuleContext, mainSrc android.Path, deps PathDeps, flags Flags,
	outputFile android.WritablePath, includeDirs []string) buildOutput {
	outputFile android.WritablePath, linkDirs []string) buildOutput {
	flags.RustFlags = append(flags.RustFlags, "-C lto")

	return transformSrctoCrate(ctx, mainSrc, deps, flags, outputFile, "bin", includeDirs)
	return transformSrctoCrate(ctx, mainSrc, deps, flags, outputFile, "bin", linkDirs)
}

func TransformSrctoRlib(ctx ModuleContext, mainSrc android.Path, deps PathDeps, flags Flags,
	outputFile android.WritablePath, includeDirs []string) buildOutput {
	return transformSrctoCrate(ctx, mainSrc, deps, flags, outputFile, "rlib", includeDirs)
	outputFile android.WritablePath, linkDirs []string) buildOutput {
	return transformSrctoCrate(ctx, mainSrc, deps, flags, outputFile, "rlib", linkDirs)
}

func TransformSrctoDylib(ctx ModuleContext, mainSrc android.Path, deps PathDeps, flags Flags,
	outputFile android.WritablePath, includeDirs []string) buildOutput {
	return transformSrctoCrate(ctx, mainSrc, deps, flags, outputFile, "dylib", includeDirs)
	outputFile android.WritablePath, linkDirs []string) buildOutput {
	return transformSrctoCrate(ctx, mainSrc, deps, flags, outputFile, "dylib", linkDirs)
}

func TransformSrctoStatic(ctx ModuleContext, mainSrc android.Path, deps PathDeps, flags Flags,
	outputFile android.WritablePath, includeDirs []string) buildOutput {
	outputFile android.WritablePath, linkDirs []string) buildOutput {
	flags.RustFlags = append(flags.RustFlags, "-C lto")
	return transformSrctoCrate(ctx, mainSrc, deps, flags, outputFile, "staticlib", includeDirs)
	return transformSrctoCrate(ctx, mainSrc, deps, flags, outputFile, "staticlib", linkDirs)
}

func TransformSrctoShared(ctx ModuleContext, mainSrc android.Path, deps PathDeps, flags Flags,
	outputFile android.WritablePath, includeDirs []string) buildOutput {
	outputFile android.WritablePath, linkDirs []string) buildOutput {
	flags.RustFlags = append(flags.RustFlags, "-C lto")
	return transformSrctoCrate(ctx, mainSrc, deps, flags, outputFile, "cdylib", includeDirs)
	return transformSrctoCrate(ctx, mainSrc, deps, flags, outputFile, "cdylib", linkDirs)
}

func TransformSrctoProcMacro(ctx ModuleContext, mainSrc android.Path, deps PathDeps,
	flags Flags, outputFile android.WritablePath, includeDirs []string) buildOutput {
	return transformSrctoCrate(ctx, mainSrc, deps, flags, outputFile, "proc-macro", includeDirs)
	flags Flags, outputFile android.WritablePath, linkDirs []string) buildOutput {
	return transformSrctoCrate(ctx, mainSrc, deps, flags, outputFile, "proc-macro", linkDirs)
}

func rustLibsToPaths(libs RustLibraries) android.Paths {
@@ -112,7 +112,7 @@ func rustLibsToPaths(libs RustLibraries) android.Paths {
}

func transformSrctoCrate(ctx ModuleContext, main android.Path, deps PathDeps, flags Flags,
	outputFile android.WritablePath, crate_type string, includeDirs []string) buildOutput {
	outputFile android.WritablePath, crate_type string, linkDirs []string) buildOutput {

	var inputs android.Paths
	var implicits android.Paths
@@ -137,16 +137,10 @@ func transformSrctoCrate(ctx ModuleContext, main android.Path, deps PathDeps, fl
		rustcFlags = append(rustcFlags, "--target="+targetTriple)
		linkFlags = append(linkFlags, "-target "+targetTriple)
	}
	// TODO(b/159718669): Once we have defined static libraries in the host
	// prebuilts Blueprint file, sysroot should be unconditionally sourced
	// from /dev/null. Explicitly set sysroot to avoid clippy-driver to
	// internally call rustc.
	if ctx.Host() && ctx.TargetPrimary() {
		rustcFlags = append(rustcFlags, "--sysroot=${config.RustPath}")
	} else {
		// If we're not targeting the host primary arch, do not use a sysroot.

	// Suppress an implicit sysroot
	rustcFlags = append(rustcFlags, "--sysroot=/dev/null")
	}

	// Collect linker flags
	linkFlags = append(linkFlags, flags.GlobalLinkFlags...)
	linkFlags = append(linkFlags, flags.LinkFlags...)
@@ -162,7 +156,7 @@ func transformSrctoCrate(ctx ModuleContext, main android.Path, deps PathDeps, fl
		libFlags = append(libFlags, "--extern "+proc_macro.CrateName+"="+proc_macro.Path.String())
	}

	for _, path := range includeDirs {
	for _, path := range linkDirs {
		libFlags = append(libFlags, "-L "+path)
	}

+0 −2
Original line number Diff line number Diff line
@@ -103,8 +103,6 @@ type BaseCompilerProperties struct {

type baseCompiler struct {
	Properties   BaseCompilerProperties
	depFlags     []string
	linkDirs     []string
	coverageFile android.Path //rustc generates a single gcno file

	// Install related
+5 −28
Original line number Diff line number Diff line
@@ -19,7 +19,6 @@ import (
	"strings"

	"android/soong/android"
	"android/soong/rust/config"
)

func init() {
@@ -74,6 +73,7 @@ type LibraryMutatedProperties struct {

type libraryDecorator struct {
	*baseCompiler
	*flagExporter

	Properties        LibraryCompilerProperties
	MutatedProperties LibraryMutatedProperties
@@ -111,22 +111,6 @@ func (library *libraryDecorator) nativeCoverage() bool {
	return true
}

func (library *libraryDecorator) exportedDirs() []string {
	return library.linkDirs
}

func (library *libraryDecorator) exportedDepFlags() []string {
	return library.depFlags
}

func (library *libraryDecorator) reexportDirs(dirs ...string) {
	library.linkDirs = android.FirstUniqueStrings(append(library.linkDirs, dirs...))
}

func (library *libraryDecorator) reexportDepFlags(flags ...string) {
	library.depFlags = android.FirstUniqueStrings(append(library.depFlags, flags...))
}

func (library *libraryDecorator) rlib() bool {
	return library.MutatedProperties.VariantIsRlib
}
@@ -199,6 +183,7 @@ func (library *libraryDecorator) autoDep() autoDep {

var _ compiler = (*libraryDecorator)(nil)
var _ libraryInterface = (*libraryDecorator)(nil)
var _ exportedFlagsProducer = (*libraryDecorator)(nil)

// rust_library produces all rust variants.
func RustLibraryFactory() android.Module {
@@ -337,6 +322,7 @@ func NewRustLibrary(hod android.HostOrDeviceSupported) (*Module, *libraryDecorat
			BuildStatic: false,
		},
		baseCompiler: NewBaseCompiler("lib", "lib64", InstallInSystem),
		flagExporter: NewFlagExporter(),
	}

	module.compiler = library
@@ -351,15 +337,6 @@ func (library *libraryDecorator) compilerProps() []interface{} {
}

func (library *libraryDecorator) compilerDeps(ctx DepsContext, deps Deps) Deps {

	// TODO(b/155498724) Remove if C static libraries no longer require libstd as an rlib dependency.
	if !ctx.Host() && library.static() {
		library.setNoStdlibs()
		for _, stdlib := range config.Stdlibs {
			deps.Rlibs = append(deps.Rlibs, stdlib)
		}
	}

	deps = library.baseCompiler.compilerDeps(ctx, deps)

	if ctx.toolchain().Bionic() && (library.dylib() || library.shared()) {
@@ -438,8 +415,8 @@ func (library *libraryDecorator) compile(ctx ModuleContext, flags Flags, deps Pa
	library.coverageOutputZipFile = TransformCoverageFilesToZip(ctx, coverageFiles, library.getStem(ctx))

	if library.rlib() || library.dylib() {
		library.reexportDirs(deps.linkDirs...)
		library.reexportDepFlags(deps.depFlags...)
		library.exportLinkDirs(deps.linkDirs...)
		library.exportDepFlags(deps.depFlags...)
	}
	library.unstrippedOutputFile = outputFile

+5 −0
Original line number Diff line number Diff line
@@ -27,6 +27,8 @@ func init() {
type PrebuiltProperties struct {
	// path to the prebuilt file
	Srcs []string `android:"path,arch_variant"`
	// directories containing associated rlib dependencies
	Link_dirs []string `android:"path,arch_variant"`
}

type prebuiltLibraryDecorator struct {
@@ -35,6 +37,7 @@ type prebuiltLibraryDecorator struct {
}

var _ compiler = (*prebuiltLibraryDecorator)(nil)
var _ exportedFlagsProducer = (*prebuiltLibraryDecorator)(nil)

func PrebuiltLibraryFactory() android.Module {
	module, _ := NewPrebuiltLibrary(android.HostAndDeviceSupported)
@@ -90,6 +93,8 @@ func (prebuilt *prebuiltLibraryDecorator) compilerProps() []interface{} {
}

func (prebuilt *prebuiltLibraryDecorator) compile(ctx ModuleContext, flags Flags, deps PathDeps) android.Path {
	prebuilt.exportLinkDirs(android.PathsForModuleSrc(ctx, prebuilt.Properties.Link_dirs).Strings()...)

	srcPath := srcPathFromModuleSrcs(ctx, prebuilt.prebuiltSrcs())

	prebuilt.unstrippedOutputFile = srcPath
+3 −0
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ type ProcMacroCompilerProperties struct {

type procMacroDecorator struct {
	*baseCompiler
	*flagExporter

	Properties ProcMacroCompilerProperties
}
@@ -35,6 +36,7 @@ type procMacroInterface interface {
}

var _ compiler = (*procMacroDecorator)(nil)
var _ exportedFlagsProducer = (*procMacroDecorator)(nil)

func ProcMacroFactory() android.Module {
	module, _ := NewProcMacro(android.HostSupportedNoCross)
@@ -46,6 +48,7 @@ func NewProcMacro(hod android.HostOrDeviceSupported) (*Module, *procMacroDecorat

	procMacro := &procMacroDecorator{
		baseCompiler: NewBaseCompiler("lib", "lib64", InstallInSystem),
		flagExporter: NewFlagExporter(),
	}

	module.compiler = procMacro
Loading