Merge "Add support for custom bindgen binaries."
This commit is contained in:
commit
80668b07d2
3 changed files with 59 additions and 8 deletions
|
@ -41,12 +41,12 @@ var (
|
||||||
bindgen = pctx.AndroidStaticRule("bindgen",
|
bindgen = pctx.AndroidStaticRule("bindgen",
|
||||||
blueprint.RuleParams{
|
blueprint.RuleParams{
|
||||||
Command: "CLANG_PATH=$bindgenClang LIBCLANG_PATH=$bindgenLibClang RUSTFMT=${config.RustBin}/rustfmt " +
|
Command: "CLANG_PATH=$bindgenClang LIBCLANG_PATH=$bindgenLibClang RUSTFMT=${config.RustBin}/rustfmt " +
|
||||||
"$bindgenCmd $flags $in -o $out -- -MD -MF $out.d $cflags",
|
"$cmd $flags $in -o $out -- -MD -MF $out.d $cflags",
|
||||||
CommandDeps: []string{"$bindgenCmd"},
|
CommandDeps: []string{"$cmd"},
|
||||||
Deps: blueprint.DepsGCC,
|
Deps: blueprint.DepsGCC,
|
||||||
Depfile: "$out.d",
|
Depfile: "$out.d",
|
||||||
},
|
},
|
||||||
"flags", "cflags")
|
"cmd", "flags", "cflags")
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
@ -76,6 +76,12 @@ type BindgenProperties struct {
|
||||||
// list of shared libraries that provide headers for this binding.
|
// list of shared libraries that provide headers for this binding.
|
||||||
Shared_libs []string `android:"arch_variant"`
|
Shared_libs []string `android:"arch_variant"`
|
||||||
|
|
||||||
|
// module name of a custom binary/script which should be used instead of the 'bindgen' binary. This custom
|
||||||
|
// binary must expect arguments in a similar fashion to bindgen, e.g.
|
||||||
|
//
|
||||||
|
// "my_bindgen [flags] wrapper_header.h -o [output_path] -- [clang flags]"
|
||||||
|
Custom_bindgen string `android:"path"`
|
||||||
|
|
||||||
//TODO(b/161141999) Add support for headers from cc_library_header modules.
|
//TODO(b/161141999) Add support for headers from cc_library_header modules.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -130,17 +136,28 @@ func (b *bindgenDecorator) generateSource(ctx android.ModuleContext, deps PathDe
|
||||||
|
|
||||||
outputFile := android.PathForModuleOut(ctx, b.baseSourceProvider.getStem(ctx)+".rs")
|
outputFile := android.PathForModuleOut(ctx, b.baseSourceProvider.getStem(ctx)+".rs")
|
||||||
|
|
||||||
|
var cmd, cmdDesc string
|
||||||
|
if b.Properties.Custom_bindgen != "" {
|
||||||
|
cmd = ctx.GetDirectDepWithTag(b.Properties.Custom_bindgen, customBindgenDepTag).(*Module).HostToolPath().String()
|
||||||
|
cmdDesc = b.Properties.Custom_bindgen
|
||||||
|
} else {
|
||||||
|
cmd = "$bindgenCmd"
|
||||||
|
cmdDesc = "bindgen"
|
||||||
|
}
|
||||||
|
|
||||||
ctx.Build(pctx, android.BuildParams{
|
ctx.Build(pctx, android.BuildParams{
|
||||||
Rule: bindgen,
|
Rule: bindgen,
|
||||||
Description: "bindgen " + wrapperFile.Path().Rel(),
|
Description: strings.Join([]string{cmdDesc, wrapperFile.Path().Rel()}, " "),
|
||||||
Output: outputFile,
|
Output: outputFile,
|
||||||
Input: wrapperFile.Path(),
|
Input: wrapperFile.Path(),
|
||||||
Implicits: implicits,
|
Implicits: implicits,
|
||||||
Args: map[string]string{
|
Args: map[string]string{
|
||||||
|
"cmd": cmd,
|
||||||
"flags": strings.Join(bindgenFlags, " "),
|
"flags": strings.Join(bindgenFlags, " "),
|
||||||
"cflags": strings.Join(cflags, " "),
|
"cflags": strings.Join(cflags, " "),
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
b.baseSourceProvider.outputFile = outputFile
|
b.baseSourceProvider.outputFile = outputFile
|
||||||
return outputFile
|
return outputFile
|
||||||
}
|
}
|
||||||
|
|
|
@ -55,3 +55,29 @@ func TestRustBindgen(t *testing.T) {
|
||||||
t.Errorf("missing static_libs exported includes 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"])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestRustBindgenCustomBindgen(t *testing.T) {
|
||||||
|
ctx := testRust(t, `
|
||||||
|
rust_bindgen {
|
||||||
|
name: "libbindgen",
|
||||||
|
wrapper_src: "src/any.h",
|
||||||
|
crate_name: "bindgen",
|
||||||
|
stem: "libbindgen",
|
||||||
|
source_stem: "bindings",
|
||||||
|
custom_bindgen: "my_bindgen"
|
||||||
|
}
|
||||||
|
rust_binary_host {
|
||||||
|
name: "my_bindgen",
|
||||||
|
srcs: ["foo.rs"],
|
||||||
|
}
|
||||||
|
`)
|
||||||
|
|
||||||
|
libbindgen := ctx.ModuleForTests("libbindgen", "android_arm64_armv8-a").Output("bindings.rs")
|
||||||
|
|
||||||
|
// The rule description should contain the custom binary name rather than bindgen, so checking the description
|
||||||
|
// should be sufficient.
|
||||||
|
if !strings.Contains(libbindgen.Description, "my_bindgen") {
|
||||||
|
t.Errorf("Custom bindgen binary %s not used for libbindgen: rule description %#v", "my_bindgen",
|
||||||
|
libbindgen.Description)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -722,6 +722,7 @@ type dependencyTag struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
customBindgenDepTag = dependencyTag{name: "customBindgenTag"}
|
||||||
rlibDepTag = dependencyTag{name: "rlibTag", library: true}
|
rlibDepTag = dependencyTag{name: "rlibTag", library: true}
|
||||||
dylibDepTag = dependencyTag{name: "dylib", library: true}
|
dylibDepTag = dependencyTag{name: "dylib", library: true}
|
||||||
procMacroDepTag = dependencyTag{name: "procMacro", proc_macro: true}
|
procMacroDepTag = dependencyTag{name: "procMacro", proc_macro: true}
|
||||||
|
@ -1009,6 +1010,13 @@ func (mod *Module) DepsMutator(actx android.BottomUpMutatorContext) {
|
||||||
actx.AddVariationDependencies(commonDepVariations, cc.CrtEndDepTag, deps.CrtEnd)
|
actx.AddVariationDependencies(commonDepVariations, cc.CrtEndDepTag, deps.CrtEnd)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if mod.sourceProvider != nil {
|
||||||
|
if bindgen, ok := mod.sourceProvider.(*bindgenDecorator); ok &&
|
||||||
|
bindgen.Properties.Custom_bindgen != "" {
|
||||||
|
actx.AddFarVariationDependencies(ctx.Config().BuildOSTarget.Variations(), customBindgenDepTag,
|
||||||
|
bindgen.Properties.Custom_bindgen)
|
||||||
|
}
|
||||||
|
}
|
||||||
// proc_macros are compiler plugins, and so we need the host arch variant as a dependendcy.
|
// proc_macros are compiler plugins, and so we need the host arch variant as a dependendcy.
|
||||||
actx.AddFarVariationDependencies(ctx.Config().BuildOSTarget.Variations(), procMacroDepTag, deps.ProcMacros...)
|
actx.AddFarVariationDependencies(ctx.Config().BuildOSTarget.Variations(), procMacroDepTag, deps.ProcMacros...)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue