rust: Add Bindgen_flag_files property
Add a new Bindgen_flag_files property to bindgen modules that let users specify files that contain extra flags for bindgen. Bug: 242243245 Test: presubmit Change-Id: I21d987c08ac417c04aaa3bfb3b75d563fc662d5b
This commit is contained in:
@@ -61,15 +61,18 @@ var (
|
|||||||
"${cc_config.ClangBase}/${bindgenHostPrebuiltTag}/${bindgenClangVersion}/${bindgenClangLibdir}")
|
"${cc_config.ClangBase}/${bindgenHostPrebuiltTag}/${bindgenClangVersion}/${bindgenClangLibdir}")
|
||||||
|
|
||||||
//TODO(ivanlozano) Switch this to RuleBuilder
|
//TODO(ivanlozano) Switch this to RuleBuilder
|
||||||
|
//
|
||||||
|
//TODO Pass the flag files directly to bindgen e.g. with @file when it supports that.
|
||||||
|
//See https://github.com/rust-lang/rust-bindgen/issues/2508.
|
||||||
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 " +
|
||||||
"$cmd $flags $in -o $out -- -MD -MF $out.d $cflags",
|
"$cmd $flags $$(cat $flagfiles) $in -o $out -- -MD -MF $out.d $cflags",
|
||||||
CommandDeps: []string{"$cmd"},
|
CommandDeps: []string{"$cmd"},
|
||||||
Deps: blueprint.DepsGCC,
|
Deps: blueprint.DepsGCC,
|
||||||
Depfile: "$out.d",
|
Depfile: "$out.d",
|
||||||
},
|
},
|
||||||
"cmd", "flags", "cflags")
|
"cmd", "flags", "flagfiles", "cflags")
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
@@ -90,6 +93,9 @@ type BindgenProperties struct {
|
|||||||
// list of bindgen-specific flags and options
|
// list of bindgen-specific flags and options
|
||||||
Bindgen_flags []string `android:"arch_variant"`
|
Bindgen_flags []string `android:"arch_variant"`
|
||||||
|
|
||||||
|
// list of files containing extra bindgen flags
|
||||||
|
Bindgen_flag_files []string `android:"arch_variant"`
|
||||||
|
|
||||||
// module name of a custom binary/script which should be used instead of the 'bindgen' binary. This custom
|
// 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.
|
// binary must expect arguments in a similar fashion to bindgen, e.g.
|
||||||
//
|
//
|
||||||
@@ -216,6 +222,14 @@ func (b *bindgenDecorator) GenerateSource(ctx ModuleContext, deps PathDeps) andr
|
|||||||
bindgenFlags := defaultBindgenFlags
|
bindgenFlags := defaultBindgenFlags
|
||||||
bindgenFlags = append(bindgenFlags, esc(b.Properties.Bindgen_flags)...)
|
bindgenFlags = append(bindgenFlags, esc(b.Properties.Bindgen_flags)...)
|
||||||
|
|
||||||
|
// cat reads from stdin if its command line is empty,
|
||||||
|
// so we pass in /dev/null if there are no other flag files
|
||||||
|
bindgenFlagFiles := []string{"/dev/null"}
|
||||||
|
for _, flagFile := range b.Properties.Bindgen_flag_files {
|
||||||
|
bindgenFlagFiles = append(bindgenFlagFiles, android.PathForModuleSrc(ctx, flagFile).String())
|
||||||
|
implicits = append(implicits, android.PathForModuleSrc(ctx, flagFile))
|
||||||
|
}
|
||||||
|
|
||||||
wrapperFile := android.OptionalPathForModuleSrc(ctx, b.Properties.Wrapper_src)
|
wrapperFile := android.OptionalPathForModuleSrc(ctx, b.Properties.Wrapper_src)
|
||||||
if !wrapperFile.Valid() {
|
if !wrapperFile.Valid() {
|
||||||
ctx.PropertyErrorf("wrapper_src", "invalid path to wrapper source")
|
ctx.PropertyErrorf("wrapper_src", "invalid path to wrapper source")
|
||||||
@@ -261,9 +275,10 @@ func (b *bindgenDecorator) GenerateSource(ctx ModuleContext, deps PathDeps) andr
|
|||||||
Input: wrapperFile.Path(),
|
Input: wrapperFile.Path(),
|
||||||
Implicits: implicits,
|
Implicits: implicits,
|
||||||
Args: map[string]string{
|
Args: map[string]string{
|
||||||
"cmd": cmd,
|
"cmd": cmd,
|
||||||
"flags": strings.Join(bindgenFlags, " "),
|
"flags": strings.Join(bindgenFlags, " "),
|
||||||
"cflags": strings.Join(cflags, " "),
|
"flagfiles": strings.Join(bindgenFlagFiles, " "),
|
||||||
|
"cflags": strings.Join(cflags, " "),
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@@ -168,3 +168,28 @@ func TestBindgenDisallowedFlags(t *testing.T) {
|
|||||||
}
|
}
|
||||||
`)
|
`)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestBindgenFlagFile(t *testing.T) {
|
||||||
|
ctx := testRust(t, `
|
||||||
|
rust_bindgen {
|
||||||
|
name: "libbindgen",
|
||||||
|
wrapper_src: "src/any.h",
|
||||||
|
crate_name: "bindgen",
|
||||||
|
stem: "libbindgen",
|
||||||
|
source_stem: "bindings",
|
||||||
|
bindgen_flag_files: [
|
||||||
|
"flag_file.txt",
|
||||||
|
],
|
||||||
|
}
|
||||||
|
`)
|
||||||
|
libbindgen := ctx.ModuleForTests("libbindgen", "android_arm64_armv8-a_source").Output("bindings.rs")
|
||||||
|
|
||||||
|
if !strings.Contains(libbindgen.Args["flagfiles"], "/dev/null") {
|
||||||
|
t.Errorf("missing /dev/null in rust_bindgen rule: flags %#v", libbindgen.Args["flagfiles"])
|
||||||
|
}
|
||||||
|
if !strings.Contains(libbindgen.Args["flagfiles"], "flag_file.txt") {
|
||||||
|
t.Errorf("missing bindgen flags file in rust_bindgen rule: flags %#v", libbindgen.Args["flagfiles"])
|
||||||
|
}
|
||||||
|
// TODO: The best we can do right now is check $flagfiles. Once bindgen.go switches to RuleBuilder,
|
||||||
|
// we may be able to check libbinder.RuleParams.Command to see if it contains $(cat /dev/null flag_file.txt)
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user