diff options
author | 2020-10-16 10:49:08 -0400 | |
---|---|---|
committer | 2020-10-16 10:52:46 -0400 | |
commit | 0a2a1154577a8df48e37388ca081c42cae8be141 (patch) | |
tree | 65fb3596ce3fb147176be987aabfb1ed8ff71b87 | |
parent | faa866c5f05fbcd5d80b5feb2111da5ed2fdf41b (diff) |
rust: Add cflag checks against -xc++ and -std.
If -x c++ is passed through a modules cflags, it will be overridden by a
-x c and -std flag added by the build system if the extension is not
.hpp/.hh and cpp_std is not set. This leads to confusing behavior.
Instead, add a helpful error message to guide developers towards the
correct way to specify when a header is a C++ header and which std
version should be used.
Bug: 171011490
Test: m nothing
Change-Id: I7e7cba504798d47ce1c753ba8699d7475a95095b
-rw-r--r-- | rust/bindgen.go | 12 | ||||
-rw-r--r-- | rust/bindgen_test.go | 26 |
2 files changed, 38 insertions, 0 deletions
diff --git a/rust/bindgen.go b/rust/bindgen.go index ac33ff7ef..46d4acbc4 100644 --- a/rust/bindgen.go +++ b/rust/bindgen.go @@ -150,6 +150,18 @@ func (b *bindgenDecorator) GenerateSource(ctx ModuleContext, deps PathDeps) andr esc := proptools.NinjaAndShellEscapeList + // Filter out invalid cflags + for _, flag := range b.ClangProperties.Cflags { + if flag == "-x c++" || flag == "-xc++" { + ctx.PropertyErrorf("cflags", + "-x c++ should not be specified in cflags; setting cpp_std specifies this is a C++ header, or change the file extension to '.hpp' or '.hh'") + } + if strings.HasPrefix(flag, "-std=") { + ctx.PropertyErrorf("cflags", + "-std should not be specified in cflags; instead use c_std or cpp_std") + } + } + // Module defined clang flags and include paths cflags = append(cflags, esc(b.ClangProperties.Cflags)...) for _, include := range b.ClangProperties.Local_include_dirs { diff --git a/rust/bindgen_test.go b/rust/bindgen_test.go index 9cccf13be..c7ce42bb4 100644 --- a/rust/bindgen_test.go +++ b/rust/bindgen_test.go @@ -134,3 +134,29 @@ func TestRustBindgenStdVersions(t *testing.T) { t.Errorf("cpp_std value not passed in to rust_bindgen as a clang flag") } } + +func TestBindgenDisallowedFlags(t *testing.T) { + // Make sure passing '-x c++' to cflags generates an error + testRustError(t, "cflags: -x c\\+\\+ should not be specified in cflags.*", ` + rust_bindgen { + name: "libbad_flag", + wrapper_src: "src/any.h", + crate_name: "bindgen", + stem: "libbindgen", + source_stem: "bindings", + cflags: ["-x c++"] + } + `) + + // Make sure passing '-std=' to cflags generates an error + testRustError(t, "cflags: -std should not be specified in cflags.*", ` + rust_bindgen { + name: "libbad_flag", + wrapper_src: "src/any.h", + crate_name: "bindgen", + stem: "libbindgen", + source_stem: "bindings", + cflags: ["-std=foo"] + } + `) +} |