From e1e844b83cb37c72bf233034c3985a69f71e2e9d Mon Sep 17 00:00:00 2001 From: Ivan Lozano Date: Fri, 24 Jul 2020 15:16:30 -0400 Subject: [PATCH 1/2] Generate deps file for rust_bindgen modules. Bug: 162007475 Test: deps file generated containing the dependent header files. Change-Id: I4abaf8e76875f7657c1b8386749217adcba1ffa2 --- rust/bindgen.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/rust/bindgen.go b/rust/bindgen.go index 132b1fdb3..099bc6e26 100644 --- a/rust/bindgen.go +++ b/rust/bindgen.go @@ -41,8 +41,10 @@ var ( bindgen = pctx.AndroidStaticRule("bindgen", blueprint.RuleParams{ Command: "CLANG_PATH=$bindgenClang LIBCLANG_PATH=$bindgenLibClang RUSTFMT=${config.RustBin}/rustfmt " + - "$bindgenCmd $flags $in -o $out -- $cflags", + "$bindgenCmd $flags $in -o $out -- -MD -MF $out.d $cflags", CommandDeps: []string{"$bindgenCmd"}, + Deps: blueprint.DepsGCC, + Depfile: "$out.d", }, "flags", "cflags") ) From 45901edb9a6ba7b42136a3ead126f94f76363eb7 Mon Sep 17 00:00:00 2001 From: Ivan Lozano Date: Fri, 24 Jul 2020 16:05:01 -0400 Subject: [PATCH 2/2] 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 --- rust/binary.go | 2 +- rust/bindgen.go | 59 ++++++++++++++++++++++------------------- rust/bindgen_test.go | 4 +-- rust/compiler.go | 2 +- rust/library.go | 2 +- rust/rust.go | 20 +++++++++++++- rust/source_provider.go | 4 +-- 7 files changed, 57 insertions(+), 36 deletions(-) diff --git a/rust/binary.go b/rust/binary.go index 48f51dbdf..0d7f541c9 100644 --- a/rust/binary.go +++ b/rust/binary.go @@ -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" } diff --git a/rust/bindgen.go b/rust/bindgen.go index 099bc6e26..43053b02b 100644 --- a/rust/bindgen.go +++ b/rust/bindgen.go @@ -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 - - 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()...) - } - } - - return libraryPaths, libraryFlags -} - -func (b *bindgenDecorator) generateSource(ctx android.ModuleContext) android.Path { +func (b *bindgenDecorator) generateSource(ctx android.ModuleContext, deps PathDeps) android.Path { ccToolchain := ccConfig.FindToolchain(ctx.Os(), ctx.Arch()) - includes, exportedFlags := b.libraryExports(ctx) var cflags []string - cflags = append(cflags, b.Properties.Cflags...) + var implicits android.Paths + + implicits = append(implicits, deps.depIncludePaths...) + implicits = append(implicits, deps.depSystemIncludePaths...) + + // Default clang flags + cflags = append(cflags, "${ccConfig.CommonClangGlobalCflags}") + if ctx.Device() { + cflags = append(cflags, "${ccConfig.DeviceClangGlobalCflags}") + } + + // 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 diff --git a/rust/bindgen_test.go b/rust/bindgen_test.go index 18e188f22..2122ec12c 100644 --- a/rust/bindgen_test.go +++ b/rust/bindgen_test.go @@ -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"]) } } diff --git a/rust/compiler.go b/rust/compiler.go index ab3d2f44a..040219dc4 100644 --- a/rust/compiler.go +++ b/rust/compiler.go @@ -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") diff --git a/rust/library.go b/rust/library.go index acca25627..28c979248 100644 --- a/rust/library.go +++ b/rust/library.go @@ -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" } diff --git a/rust/rust.go b/rust/rust.go index 28f8e1a62..8ebd39dcc 100644 --- a/rust/rust.go +++ b/rust/rust.go @@ -256,6 +256,11 @@ type PathDeps struct { depFlags []string //ReexportedDeps android.Paths + // Used by bindgen modules which call clang + depClangFlags []string + depIncludePaths android.Paths + depSystemIncludePaths android.Paths + coverageFiles android.Paths CrtBegin android.OptionalPath @@ -671,7 +676,7 @@ func (mod *Module) GenerateAndroidBuildActions(actx android.ModuleContext) { mod.compiler.install(ctx, mod.outputFile.Path()) } } else if mod.sourceProvider != nil { - outputFile := mod.sourceProvider.generateSource(ctx) + outputFile := mod.sourceProvider.generateSource(ctx, deps) mod.outputFile = android.OptionalPathForPath(outputFile) mod.subName = ctx.ModuleSubDir() } @@ -821,6 +826,11 @@ func (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps { depFlag = "-lstatic=" + libName depPaths.linkDirs = append(depPaths.linkDirs, linkPath) depPaths.depFlags = append(depPaths.depFlags, depFlag) + depPaths.depIncludePaths = append(depPaths.depIncludePaths, ccDep.IncludeDirs()...) + if mod, ok := ccDep.(*cc.Module); ok { + depPaths.depSystemIncludePaths = append(depPaths.depSystemIncludePaths, mod.ExportedSystemIncludeDirs()...) + depPaths.depClangFlags = append(depPaths.depClangFlags, mod.ExportedFlags()...) + } depPaths.coverageFiles = append(depPaths.coverageFiles, ccDep.CoverageFiles()...) directStaticLibDeps = append(directStaticLibDeps, ccDep) mod.Properties.AndroidMkStaticLibs = append(mod.Properties.AndroidMkStaticLibs, depName) @@ -828,6 +838,11 @@ func (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps { depFlag = "-ldylib=" + libName depPaths.linkDirs = append(depPaths.linkDirs, linkPath) depPaths.depFlags = append(depPaths.depFlags, depFlag) + depPaths.depIncludePaths = append(depPaths.depIncludePaths, ccDep.IncludeDirs()...) + if mod, ok := ccDep.(*cc.Module); ok { + depPaths.depSystemIncludePaths = append(depPaths.depSystemIncludePaths, mod.ExportedSystemIncludeDirs()...) + depPaths.depClangFlags = append(depPaths.depClangFlags, mod.ExportedFlags()...) + } directSharedLibDeps = append(directSharedLibDeps, ccDep) mod.Properties.AndroidMkSharedLibs = append(mod.Properties.AndroidMkSharedLibs, depName) exportDep = true @@ -877,6 +892,9 @@ func (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps { // Dedup exported flags from dependencies depPaths.linkDirs = android.FirstUniqueStrings(depPaths.linkDirs) depPaths.depFlags = android.FirstUniqueStrings(depPaths.depFlags) + depPaths.depClangFlags = android.FirstUniqueStrings(depPaths.depClangFlags) + depPaths.depIncludePaths = android.FirstUniquePaths(depPaths.depIncludePaths) + depPaths.depSystemIncludePaths = android.FirstUniquePaths(depPaths.depSystemIncludePaths) return depPaths } diff --git a/rust/source_provider.go b/rust/source_provider.go index e034d2c28..da6147a15 100644 --- a/rust/source_provider.go +++ b/rust/source_provider.go @@ -33,7 +33,7 @@ type baseSourceProvider struct { var _ SourceProvider = (*baseSourceProvider)(nil) type SourceProvider interface { - generateSource(ctx android.ModuleContext) android.Path + generateSource(ctx android.ModuleContext, deps PathDeps) android.Path Srcs() android.Paths sourceProviderProps() []interface{} sourceProviderDeps(ctx DepsContext, deps Deps) Deps @@ -43,7 +43,7 @@ func (sp *baseSourceProvider) Srcs() android.Paths { return android.Paths{sp.outputFile} } -func (sp *baseSourceProvider) generateSource(ctx android.ModuleContext) android.Path { +func (sp *baseSourceProvider) generateSource(ctx android.ModuleContext, deps PathDeps) android.Path { panic("baseSourceProviderModule does not implement generateSource()") }