Loading Android.bp +2 −0 Original line number Diff line number Diff line Loading @@ -333,6 +333,8 @@ bootstrap_go_package { "soong-cc-config", ], srcs: [ "rust/config/arm_device.go", "rust/config/arm64_device.go", "rust/config/global.go", "rust/config/toolchain.go", "rust/config/whitelist.go", Loading cc/cc.go +8 −0 Original line number Diff line number Diff line Loading @@ -401,6 +401,14 @@ func StaticDepTag() dependencyTag { return staticDepTag } func CrtBeginDepTag() dependencyTag { return crtBeginDepTag } func CrtEndDepTag() dependencyTag { return crtEndDepTag } // Module contains the properties and members used by all C/C++ module types, and implements // the blueprint.Module interface. It delegates to compiler, linker, and installer interfaces // to construct the output file. Behavior can be customized with a Customizer interface Loading rust/binary.go +15 −0 Original line number Diff line number Diff line Loading @@ -71,6 +71,15 @@ func (binary *binaryDecorator) preferDynamic() bool { func (binary *binaryDecorator) compilerFlags(ctx ModuleContext, flags Flags) Flags { flags = binary.baseCompiler.compilerFlags(ctx, flags) if ctx.toolchain().Bionic() { // no-undefined-version breaks dylib compilation since __rust_*alloc* functions aren't defined, but we can apply this to binaries. flags.LinkFlags = append(flags.LinkFlags, "-Wl,--gc-sections", "-Wl,-z,nocopyreloc", "-Wl,--no-undefined-version") } if binary.preferDynamic() { flags.RustFlags = append(flags.RustFlags, "-C prefer-dynamic") } Loading @@ -86,6 +95,12 @@ func (binary *binaryDecorator) compilerDeps(ctx DepsContext, deps Deps) Deps { } } if ctx.toolchain().Bionic() { deps = binary.baseCompiler.bionicDeps(ctx, deps) deps.CrtBegin = "crtbegin_dynamic" deps.CrtEnd = "crtend_android" } return deps } Loading rust/builder.go +19 −10 Original line number Diff line number Diff line Loading @@ -28,14 +28,14 @@ var ( blueprint.RuleParams{ Command: "$rustcCmd " + "-C linker=${config.RustLinker} " + "-C link-args=\"${config.RustLinkerArgs} ${linkFlags}\" " + "-C link-args=\"${crtBegin} ${config.RustLinkerArgs} ${linkFlags} ${crtEnd}\" " + "-o $out $in ${libFlags} $rustcFlags " + "&& $rustcCmd --emit=dep-info -o $out.d $in ${libFlags} $rustcFlags", CommandDeps: []string{"$rustcCmd"}, Depfile: "$out.d", Deps: blueprint.DepsGCC, // Rustc deps-info writes out make compatible dep files: https://github.com/rust-lang/rust/issues/7633 }, "rustcFlags", "linkFlags", "libFlags") "rustcFlags", "linkFlags", "libFlags", "crtBegin", "crtEnd") ) func init() { Loading @@ -43,19 +43,19 @@ func init() { } func TransformSrcToBinary(ctx android.ModuleContext, mainSrc android.Path, deps PathDeps, flags Flags, outputFile android.WritablePath, includeDirs []string) { 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, deps.CrtBegin, deps.CrtEnd, flags, outputFile, "bin", includeDirs) } func TransformSrctoRlib(ctx android.ModuleContext, mainSrc android.Path, deps PathDeps, flags Flags, outputFile android.WritablePath, includeDirs []string) { 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, deps.CrtBegin, deps.CrtEnd, flags, outputFile, "rlib", includeDirs) } func TransformSrctoDylib(ctx android.ModuleContext, mainSrc android.Path, deps PathDeps, flags Flags, outputFile android.WritablePath, includeDirs []string) { 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, deps.CrtBegin, deps.CrtEnd, flags, outputFile, "dylib", includeDirs) } func TransformSrctoProcMacro(ctx android.ModuleContext, mainSrc android.Path, deps PathDeps, flags Flags, outputFile android.WritablePath, includeDirs []string) { transformSrctoCrate(ctx, mainSrc, deps.RLibs, deps.DyLibs, deps.ProcMacros, deps.StaticLibs, deps.SharedLibs, flags, outputFile, "proc-macro", includeDirs) transformSrctoCrate(ctx, mainSrc, deps.RLibs, deps.DyLibs, deps.ProcMacros, deps.StaticLibs, deps.SharedLibs, deps.CrtBegin, deps.CrtEnd, flags, outputFile, "proc-macro", includeDirs) } func rustLibsToPaths(libs RustLibraries) android.Paths { Loading @@ -67,24 +67,28 @@ func rustLibsToPaths(libs RustLibraries) android.Paths { } 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) { rlibs, dylibs, proc_macros RustLibraries, static_libs, shared_libs android.Paths, crtBegin, crtEnd android.OptionalPath, flags Flags, outputFile android.WritablePath, crate_type string, includeDirs []string) { var inputs android.Paths var deps android.Paths var libFlags, rustcFlags []string var libFlags, rustcFlags, linkFlags []string crate_name := ctx.(ModuleContext).CrateName() targetTriple := ctx.(ModuleContext).toolchain().RustTriple() inputs = append(inputs, main) // Collect rustc flags rustcFlags = append(rustcFlags, flags.GlobalFlags...) rustcFlags = append(rustcFlags, flags.GlobalRustFlags...) rustcFlags = append(rustcFlags, flags.RustFlags...) rustcFlags = append(rustcFlags, "--crate-type="+crate_type) rustcFlags = append(rustcFlags, "--crate-name="+crate_name) if targetTriple != "" { rustcFlags = append(rustcFlags, "--target="+targetTriple) linkFlags = append(linkFlags, "-target "+targetTriple) } // Collect linker flags linkFlags = append(linkFlags, flags.GlobalLinkFlags...) linkFlags = append(linkFlags, flags.LinkFlags...) // Collect library/crate flags for _, lib := range rlibs { Loading @@ -107,6 +111,9 @@ func transformSrctoCrate(ctx android.ModuleContext, main android.Path, deps = append(deps, rustLibsToPaths(proc_macros)...) deps = append(deps, static_libs...) deps = append(deps, shared_libs...) if crtBegin.Valid() { deps = append(deps, crtBegin.Path(), crtEnd.Path()) } ctx.Build(pctx, android.BuildParams{ Rule: rustc, Loading @@ -116,8 +123,10 @@ func transformSrctoCrate(ctx android.ModuleContext, main android.Path, Implicits: deps, Args: map[string]string{ "rustcFlags": strings.Join(rustcFlags, " "), "linkFlags": strings.Join(flags.LinkFlags, " "), "linkFlags": strings.Join(linkFlags, " "), "libFlags": strings.Join(libFlags, " "), "crtBegin": crtBegin.String(), "crtEnd": crtEnd.String(), }, }) Loading rust/compiler.go +14 −1 Original line number Diff line number Diff line Loading @@ -113,7 +113,8 @@ func (compiler *baseCompiler) compilerFlags(ctx ModuleContext, flags Flags) Flag flags.RustFlags = append(flags.RustFlags, compiler.featuresToFlags(compiler.Properties.Features)...) flags.RustFlags = append(flags.RustFlags, "--edition="+*compiler.Properties.Edition) flags.LinkFlags = append(flags.LinkFlags, compiler.Properties.Ld_flags...) flags.GlobalFlags = append(flags.GlobalFlags, ctx.toolchain().ToolchainRustFlags()) flags.GlobalRustFlags = append(flags.GlobalRustFlags, ctx.toolchain().ToolchainRustFlags()) flags.GlobalLinkFlags = append(flags.GlobalLinkFlags, ctx.toolchain().ToolchainLinkFlags()) if ctx.Host() && !ctx.Windows() { rpath_prefix := `\$$ORIGIN/` Loading Loading @@ -148,6 +149,18 @@ func (compiler *baseCompiler) compilerDeps(ctx DepsContext, deps Deps) Deps { return deps } func (compiler *baseCompiler) bionicDeps(ctx DepsContext, deps Deps) Deps { deps.SharedLibs = append(deps.SharedLibs, "liblog") deps.SharedLibs = append(deps.SharedLibs, "libc") deps.SharedLibs = append(deps.SharedLibs, "libm") deps.SharedLibs = append(deps.SharedLibs, "libdl") //TODO(b/141331117) libstd requires libgcc on Android deps.StaticLibs = append(deps.StaticLibs, "libgcc") return deps } func (compiler *baseCompiler) crateName() string { return compiler.Properties.Crate_name } Loading Loading
Android.bp +2 −0 Original line number Diff line number Diff line Loading @@ -333,6 +333,8 @@ bootstrap_go_package { "soong-cc-config", ], srcs: [ "rust/config/arm_device.go", "rust/config/arm64_device.go", "rust/config/global.go", "rust/config/toolchain.go", "rust/config/whitelist.go", Loading
cc/cc.go +8 −0 Original line number Diff line number Diff line Loading @@ -401,6 +401,14 @@ func StaticDepTag() dependencyTag { return staticDepTag } func CrtBeginDepTag() dependencyTag { return crtBeginDepTag } func CrtEndDepTag() dependencyTag { return crtEndDepTag } // Module contains the properties and members used by all C/C++ module types, and implements // the blueprint.Module interface. It delegates to compiler, linker, and installer interfaces // to construct the output file. Behavior can be customized with a Customizer interface Loading
rust/binary.go +15 −0 Original line number Diff line number Diff line Loading @@ -71,6 +71,15 @@ func (binary *binaryDecorator) preferDynamic() bool { func (binary *binaryDecorator) compilerFlags(ctx ModuleContext, flags Flags) Flags { flags = binary.baseCompiler.compilerFlags(ctx, flags) if ctx.toolchain().Bionic() { // no-undefined-version breaks dylib compilation since __rust_*alloc* functions aren't defined, but we can apply this to binaries. flags.LinkFlags = append(flags.LinkFlags, "-Wl,--gc-sections", "-Wl,-z,nocopyreloc", "-Wl,--no-undefined-version") } if binary.preferDynamic() { flags.RustFlags = append(flags.RustFlags, "-C prefer-dynamic") } Loading @@ -86,6 +95,12 @@ func (binary *binaryDecorator) compilerDeps(ctx DepsContext, deps Deps) Deps { } } if ctx.toolchain().Bionic() { deps = binary.baseCompiler.bionicDeps(ctx, deps) deps.CrtBegin = "crtbegin_dynamic" deps.CrtEnd = "crtend_android" } return deps } Loading
rust/builder.go +19 −10 Original line number Diff line number Diff line Loading @@ -28,14 +28,14 @@ var ( blueprint.RuleParams{ Command: "$rustcCmd " + "-C linker=${config.RustLinker} " + "-C link-args=\"${config.RustLinkerArgs} ${linkFlags}\" " + "-C link-args=\"${crtBegin} ${config.RustLinkerArgs} ${linkFlags} ${crtEnd}\" " + "-o $out $in ${libFlags} $rustcFlags " + "&& $rustcCmd --emit=dep-info -o $out.d $in ${libFlags} $rustcFlags", CommandDeps: []string{"$rustcCmd"}, Depfile: "$out.d", Deps: blueprint.DepsGCC, // Rustc deps-info writes out make compatible dep files: https://github.com/rust-lang/rust/issues/7633 }, "rustcFlags", "linkFlags", "libFlags") "rustcFlags", "linkFlags", "libFlags", "crtBegin", "crtEnd") ) func init() { Loading @@ -43,19 +43,19 @@ func init() { } func TransformSrcToBinary(ctx android.ModuleContext, mainSrc android.Path, deps PathDeps, flags Flags, outputFile android.WritablePath, includeDirs []string) { 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, deps.CrtBegin, deps.CrtEnd, flags, outputFile, "bin", includeDirs) } func TransformSrctoRlib(ctx android.ModuleContext, mainSrc android.Path, deps PathDeps, flags Flags, outputFile android.WritablePath, includeDirs []string) { 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, deps.CrtBegin, deps.CrtEnd, flags, outputFile, "rlib", includeDirs) } func TransformSrctoDylib(ctx android.ModuleContext, mainSrc android.Path, deps PathDeps, flags Flags, outputFile android.WritablePath, includeDirs []string) { 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, deps.CrtBegin, deps.CrtEnd, flags, outputFile, "dylib", includeDirs) } func TransformSrctoProcMacro(ctx android.ModuleContext, mainSrc android.Path, deps PathDeps, flags Flags, outputFile android.WritablePath, includeDirs []string) { transformSrctoCrate(ctx, mainSrc, deps.RLibs, deps.DyLibs, deps.ProcMacros, deps.StaticLibs, deps.SharedLibs, flags, outputFile, "proc-macro", includeDirs) transformSrctoCrate(ctx, mainSrc, deps.RLibs, deps.DyLibs, deps.ProcMacros, deps.StaticLibs, deps.SharedLibs, deps.CrtBegin, deps.CrtEnd, flags, outputFile, "proc-macro", includeDirs) } func rustLibsToPaths(libs RustLibraries) android.Paths { Loading @@ -67,24 +67,28 @@ func rustLibsToPaths(libs RustLibraries) android.Paths { } 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) { rlibs, dylibs, proc_macros RustLibraries, static_libs, shared_libs android.Paths, crtBegin, crtEnd android.OptionalPath, flags Flags, outputFile android.WritablePath, crate_type string, includeDirs []string) { var inputs android.Paths var deps android.Paths var libFlags, rustcFlags []string var libFlags, rustcFlags, linkFlags []string crate_name := ctx.(ModuleContext).CrateName() targetTriple := ctx.(ModuleContext).toolchain().RustTriple() inputs = append(inputs, main) // Collect rustc flags rustcFlags = append(rustcFlags, flags.GlobalFlags...) rustcFlags = append(rustcFlags, flags.GlobalRustFlags...) rustcFlags = append(rustcFlags, flags.RustFlags...) rustcFlags = append(rustcFlags, "--crate-type="+crate_type) rustcFlags = append(rustcFlags, "--crate-name="+crate_name) if targetTriple != "" { rustcFlags = append(rustcFlags, "--target="+targetTriple) linkFlags = append(linkFlags, "-target "+targetTriple) } // Collect linker flags linkFlags = append(linkFlags, flags.GlobalLinkFlags...) linkFlags = append(linkFlags, flags.LinkFlags...) // Collect library/crate flags for _, lib := range rlibs { Loading @@ -107,6 +111,9 @@ func transformSrctoCrate(ctx android.ModuleContext, main android.Path, deps = append(deps, rustLibsToPaths(proc_macros)...) deps = append(deps, static_libs...) deps = append(deps, shared_libs...) if crtBegin.Valid() { deps = append(deps, crtBegin.Path(), crtEnd.Path()) } ctx.Build(pctx, android.BuildParams{ Rule: rustc, Loading @@ -116,8 +123,10 @@ func transformSrctoCrate(ctx android.ModuleContext, main android.Path, Implicits: deps, Args: map[string]string{ "rustcFlags": strings.Join(rustcFlags, " "), "linkFlags": strings.Join(flags.LinkFlags, " "), "linkFlags": strings.Join(linkFlags, " "), "libFlags": strings.Join(libFlags, " "), "crtBegin": crtBegin.String(), "crtEnd": crtEnd.String(), }, }) Loading
rust/compiler.go +14 −1 Original line number Diff line number Diff line Loading @@ -113,7 +113,8 @@ func (compiler *baseCompiler) compilerFlags(ctx ModuleContext, flags Flags) Flag flags.RustFlags = append(flags.RustFlags, compiler.featuresToFlags(compiler.Properties.Features)...) flags.RustFlags = append(flags.RustFlags, "--edition="+*compiler.Properties.Edition) flags.LinkFlags = append(flags.LinkFlags, compiler.Properties.Ld_flags...) flags.GlobalFlags = append(flags.GlobalFlags, ctx.toolchain().ToolchainRustFlags()) flags.GlobalRustFlags = append(flags.GlobalRustFlags, ctx.toolchain().ToolchainRustFlags()) flags.GlobalLinkFlags = append(flags.GlobalLinkFlags, ctx.toolchain().ToolchainLinkFlags()) if ctx.Host() && !ctx.Windows() { rpath_prefix := `\$$ORIGIN/` Loading Loading @@ -148,6 +149,18 @@ func (compiler *baseCompiler) compilerDeps(ctx DepsContext, deps Deps) Deps { return deps } func (compiler *baseCompiler) bionicDeps(ctx DepsContext, deps Deps) Deps { deps.SharedLibs = append(deps.SharedLibs, "liblog") deps.SharedLibs = append(deps.SharedLibs, "libc") deps.SharedLibs = append(deps.SharedLibs, "libm") deps.SharedLibs = append(deps.SharedLibs, "libdl") //TODO(b/141331117) libstd requires libgcc on Android deps.StaticLibs = append(deps.StaticLibs, "libgcc") return deps } func (compiler *baseCompiler) crateName() string { return compiler.Properties.Crate_name } Loading