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

Commit 45901edb authored by Ivan Lozano's avatar Ivan Lozano
Browse files

Ensure hermetic device rust_bindgen.

rust_bindgen was not hermetic previously as it would pull in host
headers for device targets. This fixes that by using the same flags we
use when compiling with Clang. This also makes sure our rust_bindgen
headers are built as similar as possible to their respective
cc_libraries.

This also pulls in the bionic dependencies as well, which provide the
headers required for device targets.

Bug: 162007475
Test: device rust_bindgen deps file does not reference host headers.

Change-Id: I4efdf333e011a6c6d73a0345e5485823f166d17a
parent e1e844b8
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -86,7 +86,7 @@ func (binary *binaryDecorator) compilerDeps(ctx DepsContext, deps Deps) Deps {
	deps = binary.baseCompiler.compilerDeps(ctx, deps)

	if ctx.toolchain().Bionic() {
		deps = binary.baseCompiler.bionicDeps(ctx, deps)
		deps = bionicDeps(deps)
		deps.CrtBegin = "crtbegin_dynamic"
		deps.CrtEnd = "crtend_android"
	}
+30 −27
Original line number Diff line number Diff line
@@ -15,11 +15,11 @@
package rust

import (
	"github.com/google/blueprint"
	"strings"

	"github.com/google/blueprint"

	"android/soong/android"
	"android/soong/cc"
	ccConfig "android/soong/cc/config"
)

@@ -84,40 +84,39 @@ type bindgenDecorator struct {
	Properties BindgenProperties
}

func (b *bindgenDecorator) libraryExports(ctx android.ModuleContext) (android.Paths, []string) {
	var libraryPaths android.Paths
	var libraryFlags []string
func (b *bindgenDecorator) generateSource(ctx android.ModuleContext, deps PathDeps) android.Path {
	ccToolchain := ccConfig.FindToolchain(ctx.Os(), ctx.Arch())

	for _, static_lib := range b.Properties.Static_libs {
		if dep, ok := ctx.GetDirectDepWithTag(static_lib, cc.StaticDepTag).(*cc.Module); ok {
			libraryPaths = append(libraryPaths, dep.ExportedIncludeDirs()...)
			libraryFlags = append(libraryFlags, dep.ExportedFlags()...)
		}
	}
	for _, shared_lib := range b.Properties.Shared_libs {
		if dep, ok := ctx.GetDirectDepWithTag(shared_lib, cc.SharedDepTag).(*cc.Module); ok {
			libraryPaths = append(libraryPaths, dep.ExportedIncludeDirs()...)
			libraryFlags = append(libraryFlags, dep.ExportedFlags()...)
		}
	}
	var cflags []string
	var implicits android.Paths

	return libraryPaths, libraryFlags
}
	implicits = append(implicits, deps.depIncludePaths...)
	implicits = append(implicits, deps.depSystemIncludePaths...)

func (b *bindgenDecorator) generateSource(ctx android.ModuleContext) android.Path {
	ccToolchain := ccConfig.FindToolchain(ctx.Os(), ctx.Arch())
	includes, exportedFlags := b.libraryExports(ctx)
	// Default clang flags
	cflags = append(cflags, "${ccConfig.CommonClangGlobalCflags}")
	if ctx.Device() {
		cflags = append(cflags, "${ccConfig.DeviceClangGlobalCflags}")
	}

	var cflags []string
	cflags = append(cflags, b.Properties.Cflags...)
	// Toolchain clang flags
	cflags = append(cflags, "-target "+ccToolchain.ClangTriple())
	cflags = append(cflags, strings.ReplaceAll(ccToolchain.ToolchainClangCflags(), "${config.", "${ccConfig."))
	cflags = append(cflags, exportedFlags...)
	for _, include := range includes {

	// Dependency clang flags and include paths
	cflags = append(cflags, deps.depClangFlags...)
	for _, include := range deps.depIncludePaths {
		cflags = append(cflags, "-I"+include.String())
	}
	for _, include := range deps.depSystemIncludePaths {
		cflags = append(cflags, "-isystem "+include.String())
	}

	// Module defined clang flags and include paths
	cflags = append(cflags, b.Properties.Cflags...)
	for _, include := range b.Properties.Local_include_dirs {
		cflags = append(cflags, "-I"+android.PathForModuleSrc(ctx, include).String())
		implicits = append(implicits, android.PathForModuleSrc(ctx, include))
	}

	bindgenFlags := defaultBindgenFlags
@@ -135,7 +134,7 @@ func (b *bindgenDecorator) generateSource(ctx android.ModuleContext) android.Pat
		Description: "bindgen " + wrapperFile.Path().Rel(),
		Output:      outputFile,
		Input:       wrapperFile.Path(),
		Implicits:   includes,
		Implicits:   implicits,
		Args: map[string]string{
			"flags":  strings.Join(bindgenFlags, " "),
			"cflags": strings.Join(cflags, " "),
@@ -172,6 +171,10 @@ func NewRustBindgen(hod android.HostOrDeviceSupported) (*Module, *bindgenDecorat

func (b *bindgenDecorator) sourceProviderDeps(ctx DepsContext, deps Deps) Deps {
	deps = b.baseSourceProvider.sourceProviderDeps(ctx, deps)
	if ctx.toolchain().Bionic() {
		deps = bionicDeps(deps)
	}

	deps.SharedLibs = append(deps.SharedLibs, b.Properties.Shared_libs...)
	deps.StaticLibs = append(deps.StaticLibs, b.Properties.Static_libs...)
	return deps
+2 −2
Original line number Diff line number Diff line
@@ -48,9 +48,9 @@ func TestRustBindgen(t *testing.T) {
		t.Errorf("missing clang cflags in rust_bindgen rule: cflags %#v", libbindgen.Args["cflags"])
	}
	if !strings.Contains(libbindgen.Args["cflags"], "-Ishared_include") {
		t.Errorf("missing clang cflags in rust_bindgen rule: cflags %#v", libbindgen.Args["cflags"])
		t.Errorf("missing shared_libs exported includes in rust_bindgen rule: cflags %#v", libbindgen.Args["cflags"])
	}
	if !strings.Contains(libbindgen.Args["cflags"], "-Istatic_include") {
		t.Errorf("missing clang cflags in rust_bindgen rule: cflags %#v", libbindgen.Args["cflags"])
		t.Errorf("missing static_libs exported includes in rust_bindgen rule: cflags %#v", libbindgen.Args["cflags"])
	}
}
+1 −1
Original line number Diff line number Diff line
@@ -199,7 +199,7 @@ func (compiler *baseCompiler) compilerDeps(ctx DepsContext, deps Deps) Deps {
	return deps
}

func (compiler *baseCompiler) bionicDeps(ctx DepsContext, deps Deps) Deps {
func bionicDeps(deps Deps) Deps {
	deps.SharedLibs = append(deps.SharedLibs, "liblog")
	deps.SharedLibs = append(deps.SharedLibs, "libc")
	deps.SharedLibs = append(deps.SharedLibs, "libm")
+1 −1
Original line number Diff line number Diff line
@@ -340,7 +340,7 @@ func (library *libraryDecorator) compilerDeps(ctx DepsContext, deps Deps) Deps {
	deps = library.baseCompiler.compilerDeps(ctx, deps)

	if ctx.toolchain().Bionic() && (library.dylib() || library.shared()) {
		deps = library.baseCompiler.bionicDeps(ctx, deps)
		deps = bionicDeps(deps)
		deps.CrtBegin = "crtbegin_so"
		deps.CrtEnd = "crtend_so"
	}
Loading