diff --git a/rust/binary.go b/rust/binary.go index 1e9e11990..1a82c9208 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 83ad56013..e8bbb35f1 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" ) @@ -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") ) @@ -83,40 +85,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 @@ -134,7 +135,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, " "), @@ -176,6 +177,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 ac725d7da..4c6da9d86 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 89b89e20c..78bf7ada9 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() } @@ -849,6 +854,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) @@ -856,6 +866,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 @@ -916,6 +931,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()") }