xref: /aosp_15_r20/build/soong/rust/bindgen_test.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2020 The Android Open Source Project
2*333d2b36SAndroid Build Coastguard Worker//
3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*333d2b36SAndroid Build Coastguard Worker//
7*333d2b36SAndroid Build Coastguard Worker//     http://www.apache.org/licenses/LICENSE-2.0
8*333d2b36SAndroid Build Coastguard Worker//
9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*333d2b36SAndroid Build Coastguard Worker// limitations under the License.
14*333d2b36SAndroid Build Coastguard Worker
15*333d2b36SAndroid Build Coastguard Workerpackage rust
16*333d2b36SAndroid Build Coastguard Worker
17*333d2b36SAndroid Build Coastguard Workerimport (
18*333d2b36SAndroid Build Coastguard Worker	"strings"
19*333d2b36SAndroid Build Coastguard Worker	"testing"
20*333d2b36SAndroid Build Coastguard Worker
21*333d2b36SAndroid Build Coastguard Worker	"android/soong/android"
22*333d2b36SAndroid Build Coastguard Worker)
23*333d2b36SAndroid Build Coastguard Worker
24*333d2b36SAndroid Build Coastguard Workerfunc TestRustBindgen(t *testing.T) {
25*333d2b36SAndroid Build Coastguard Worker	ctx := testRust(t, `
26*333d2b36SAndroid Build Coastguard Worker		rust_bindgen {
27*333d2b36SAndroid Build Coastguard Worker			name: "libbindgen",
28*333d2b36SAndroid Build Coastguard Worker			defaults: ["cc_defaults_flags"],
29*333d2b36SAndroid Build Coastguard Worker			wrapper_src: "src/any.h",
30*333d2b36SAndroid Build Coastguard Worker			crate_name: "bindgen",
31*333d2b36SAndroid Build Coastguard Worker			stem: "libbindgen",
32*333d2b36SAndroid Build Coastguard Worker			source_stem: "bindings",
33*333d2b36SAndroid Build Coastguard Worker			bindgen_flags: ["--bindgen-flag.*"],
34*333d2b36SAndroid Build Coastguard Worker			cflags: ["--clang-flag()"],
35*333d2b36SAndroid Build Coastguard Worker			shared_libs: ["libfoo_shared"],
36*333d2b36SAndroid Build Coastguard Worker		}
37*333d2b36SAndroid Build Coastguard Worker		rust_bindgen {
38*333d2b36SAndroid Build Coastguard Worker			name: "libbindgen_staticlib",
39*333d2b36SAndroid Build Coastguard Worker			wrapper_src: "src/any.h",
40*333d2b36SAndroid Build Coastguard Worker			crate_name: "bindgen_staticlib",
41*333d2b36SAndroid Build Coastguard Worker			stem: "libbindgen_staticlib",
42*333d2b36SAndroid Build Coastguard Worker			source_stem: "bindings",
43*333d2b36SAndroid Build Coastguard Worker			static_libs: ["libfoo_static"],
44*333d2b36SAndroid Build Coastguard Worker		}
45*333d2b36SAndroid Build Coastguard Worker		rust_bindgen {
46*333d2b36SAndroid Build Coastguard Worker			name: "libbindgen_headerlib",
47*333d2b36SAndroid Build Coastguard Worker			wrapper_src: "src/any.h",
48*333d2b36SAndroid Build Coastguard Worker			crate_name: "bindgen_headerlib",
49*333d2b36SAndroid Build Coastguard Worker			stem: "libbindgen_headerlib",
50*333d2b36SAndroid Build Coastguard Worker			source_stem: "bindings",
51*333d2b36SAndroid Build Coastguard Worker			header_libs: ["libfoo_header"],
52*333d2b36SAndroid Build Coastguard Worker		}
53*333d2b36SAndroid Build Coastguard Worker		cc_library_shared {
54*333d2b36SAndroid Build Coastguard Worker			name: "libfoo_shared",
55*333d2b36SAndroid Build Coastguard Worker			export_include_dirs: ["shared_include"],
56*333d2b36SAndroid Build Coastguard Worker		}
57*333d2b36SAndroid Build Coastguard Worker		cc_library_static {
58*333d2b36SAndroid Build Coastguard Worker			name: "libfoo_static",
59*333d2b36SAndroid Build Coastguard Worker			export_include_dirs: ["static_include"],
60*333d2b36SAndroid Build Coastguard Worker		}
61*333d2b36SAndroid Build Coastguard Worker		cc_library_headers {
62*333d2b36SAndroid Build Coastguard Worker			name: "libfoo_header",
63*333d2b36SAndroid Build Coastguard Worker			export_include_dirs: ["header_include"],
64*333d2b36SAndroid Build Coastguard Worker		}
65*333d2b36SAndroid Build Coastguard Worker		cc_defaults {
66*333d2b36SAndroid Build Coastguard Worker			name: "cc_defaults_flags",
67*333d2b36SAndroid Build Coastguard Worker			cflags: ["--default-flag"],
68*333d2b36SAndroid Build Coastguard Worker		}
69*333d2b36SAndroid Build Coastguard Worker	`)
70*333d2b36SAndroid Build Coastguard Worker	libbindgen := ctx.ModuleForTests("libbindgen", "android_arm64_armv8-a_source").Output("bindings.rs")
71*333d2b36SAndroid Build Coastguard Worker	libbindgenStatic := ctx.ModuleForTests("libbindgen_staticlib", "android_arm64_armv8-a_source").Output("bindings.rs")
72*333d2b36SAndroid Build Coastguard Worker	libbindgenHeader := ctx.ModuleForTests("libbindgen_headerlib", "android_arm64_armv8-a_source").Output("bindings.rs")
73*333d2b36SAndroid Build Coastguard Worker	libbindgenHeaderModule := ctx.ModuleForTests("libbindgen_headerlib", "android_arm64_armv8-a_source").Module().(*Module)
74*333d2b36SAndroid Build Coastguard Worker	// Ensure that the flags are present and escaped
75*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(libbindgen.Args["flags"], "'--bindgen-flag.*'") {
76*333d2b36SAndroid Build Coastguard Worker		t.Errorf("missing bindgen flags in rust_bindgen rule: flags %#v", libbindgen.Args["flags"])
77*333d2b36SAndroid Build Coastguard Worker	}
78*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(libbindgen.Args["cflags"], "'--clang-flag()'") {
79*333d2b36SAndroid Build Coastguard Worker		t.Errorf("missing clang cflags in rust_bindgen rule: cflags %#v", libbindgen.Args["cflags"])
80*333d2b36SAndroid Build Coastguard Worker	}
81*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(libbindgen.Args["cflags"], "-Ishared_include") {
82*333d2b36SAndroid Build Coastguard Worker		t.Errorf("missing shared_libs exported includes in rust_bindgen rule: cflags %#v", libbindgen.Args["cflags"])
83*333d2b36SAndroid Build Coastguard Worker	}
84*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(libbindgenStatic.Args["cflags"], "-Istatic_include") {
85*333d2b36SAndroid Build Coastguard Worker		t.Errorf("missing static_libs exported includes in rust_bindgen rule: cflags %#v", libbindgenStatic.Args["cflags"])
86*333d2b36SAndroid Build Coastguard Worker	}
87*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(libbindgenHeader.Args["cflags"], "-Iheader_include") {
88*333d2b36SAndroid Build Coastguard Worker		t.Errorf("missing header_libs exported includes in rust_bindgen rule: cflags %#v", libbindgenHeader.Args["cflags"])
89*333d2b36SAndroid Build Coastguard Worker	}
90*333d2b36SAndroid Build Coastguard Worker
91*333d2b36SAndroid Build Coastguard Worker	if android.InList("libfoo_static", libbindgenHeaderModule.Properties.AndroidMkHeaderLibs) {
92*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Static library dependency should not be in HeaderLibs list")
93*333d2b36SAndroid Build Coastguard Worker	}
94*333d2b36SAndroid Build Coastguard Worker
95*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(libbindgen.Args["cflags"], "--default-flag") {
96*333d2b36SAndroid Build Coastguard Worker		t.Errorf("rust_bindgen missing cflags defined in cc_defaults: cflags %#v", libbindgen.Args["cflags"])
97*333d2b36SAndroid Build Coastguard Worker	}
98*333d2b36SAndroid Build Coastguard Worker}
99*333d2b36SAndroid Build Coastguard Worker
100*333d2b36SAndroid Build Coastguard Workerfunc TestRustBindgenCustomBindgen(t *testing.T) {
101*333d2b36SAndroid Build Coastguard Worker	ctx := testRust(t, `
102*333d2b36SAndroid Build Coastguard Worker		rust_bindgen {
103*333d2b36SAndroid Build Coastguard Worker			name: "libbindgen",
104*333d2b36SAndroid Build Coastguard Worker			wrapper_src: "src/any.h",
105*333d2b36SAndroid Build Coastguard Worker			crate_name: "bindgen",
106*333d2b36SAndroid Build Coastguard Worker			stem: "libbindgen",
107*333d2b36SAndroid Build Coastguard Worker			source_stem: "bindings",
108*333d2b36SAndroid Build Coastguard Worker			custom_bindgen: "my_bindgen"
109*333d2b36SAndroid Build Coastguard Worker		}
110*333d2b36SAndroid Build Coastguard Worker		rust_binary_host {
111*333d2b36SAndroid Build Coastguard Worker			name: "my_bindgen",
112*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.rs"],
113*333d2b36SAndroid Build Coastguard Worker		}
114*333d2b36SAndroid Build Coastguard Worker	`)
115*333d2b36SAndroid Build Coastguard Worker
116*333d2b36SAndroid Build Coastguard Worker	libbindgen := ctx.ModuleForTests("libbindgen", "android_arm64_armv8-a_source").Output("bindings.rs")
117*333d2b36SAndroid Build Coastguard Worker
118*333d2b36SAndroid Build Coastguard Worker	// The rule description should contain the custom binary name rather than bindgen, so checking the description
119*333d2b36SAndroid Build Coastguard Worker	// should be sufficient.
120*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(libbindgen.Description, "my_bindgen") {
121*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Custom bindgen binary %s not used for libbindgen: rule description %#v", "my_bindgen",
122*333d2b36SAndroid Build Coastguard Worker			libbindgen.Description)
123*333d2b36SAndroid Build Coastguard Worker	}
124*333d2b36SAndroid Build Coastguard Worker}
125*333d2b36SAndroid Build Coastguard Worker
126*333d2b36SAndroid Build Coastguard Workerfunc TestRustBindgenStdVersions(t *testing.T) {
127*333d2b36SAndroid Build Coastguard Worker	testRustError(t, "c_std and cpp_std cannot both be defined at the same time.", `
128*333d2b36SAndroid Build Coastguard Worker		rust_bindgen {
129*333d2b36SAndroid Build Coastguard Worker			name: "libbindgen",
130*333d2b36SAndroid Build Coastguard Worker			wrapper_src: "src/any.h",
131*333d2b36SAndroid Build Coastguard Worker			crate_name: "bindgen",
132*333d2b36SAndroid Build Coastguard Worker			stem: "libbindgen",
133*333d2b36SAndroid Build Coastguard Worker			source_stem: "bindings",
134*333d2b36SAndroid Build Coastguard Worker			c_std: "somevalue",
135*333d2b36SAndroid Build Coastguard Worker			cpp_std: "somevalue",
136*333d2b36SAndroid Build Coastguard Worker		}
137*333d2b36SAndroid Build Coastguard Worker	`)
138*333d2b36SAndroid Build Coastguard Worker
139*333d2b36SAndroid Build Coastguard Worker	ctx := testRust(t, `
140*333d2b36SAndroid Build Coastguard Worker		rust_bindgen {
141*333d2b36SAndroid Build Coastguard Worker			name: "libbindgen_cstd",
142*333d2b36SAndroid Build Coastguard Worker			wrapper_src: "src/any.hpp",
143*333d2b36SAndroid Build Coastguard Worker			crate_name: "bindgen",
144*333d2b36SAndroid Build Coastguard Worker			stem: "libbindgen",
145*333d2b36SAndroid Build Coastguard Worker			source_stem: "bindings",
146*333d2b36SAndroid Build Coastguard Worker			c_std: "foo"
147*333d2b36SAndroid Build Coastguard Worker		}
148*333d2b36SAndroid Build Coastguard Worker		rust_bindgen {
149*333d2b36SAndroid Build Coastguard Worker			name: "libbindgen_cppstd",
150*333d2b36SAndroid Build Coastguard Worker			wrapper_src: "src/any.h",
151*333d2b36SAndroid Build Coastguard Worker			crate_name: "bindgen",
152*333d2b36SAndroid Build Coastguard Worker			stem: "libbindgen",
153*333d2b36SAndroid Build Coastguard Worker			source_stem: "bindings",
154*333d2b36SAndroid Build Coastguard Worker			cpp_std: "foo"
155*333d2b36SAndroid Build Coastguard Worker		}
156*333d2b36SAndroid Build Coastguard Worker	`)
157*333d2b36SAndroid Build Coastguard Worker
158*333d2b36SAndroid Build Coastguard Worker	libbindgen_cstd := ctx.ModuleForTests("libbindgen_cstd", "android_arm64_armv8-a_source").Output("bindings.rs")
159*333d2b36SAndroid Build Coastguard Worker	libbindgen_cppstd := ctx.ModuleForTests("libbindgen_cppstd", "android_arm64_armv8-a_source").Output("bindings.rs")
160*333d2b36SAndroid Build Coastguard Worker
161*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(libbindgen_cstd.Args["cflags"], "-std=foo") {
162*333d2b36SAndroid Build Coastguard Worker		t.Errorf("c_std value not passed in to rust_bindgen as a clang flag")
163*333d2b36SAndroid Build Coastguard Worker	}
164*333d2b36SAndroid Build Coastguard Worker
165*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(libbindgen_cppstd.Args["cflags"], "-std=foo") {
166*333d2b36SAndroid Build Coastguard Worker		t.Errorf("cpp_std value not passed in to rust_bindgen as a clang flag")
167*333d2b36SAndroid Build Coastguard Worker	}
168*333d2b36SAndroid Build Coastguard Worker
169*333d2b36SAndroid Build Coastguard Worker	// Make sure specifying cpp_std emits the '-x c++' flag
170*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(libbindgen_cppstd.Args["cflags"], "-x c++") {
171*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Setting cpp_std should cause the '-x c++' flag to be emitted")
172*333d2b36SAndroid Build Coastguard Worker	}
173*333d2b36SAndroid Build Coastguard Worker
174*333d2b36SAndroid Build Coastguard Worker	// Make sure specifying c_std omits the '-x c++' flag
175*333d2b36SAndroid Build Coastguard Worker	if strings.Contains(libbindgen_cstd.Args["cflags"], "-x c++") {
176*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Setting c_std should not cause the '-x c++' flag to be emitted")
177*333d2b36SAndroid Build Coastguard Worker	}
178*333d2b36SAndroid Build Coastguard Worker}
179*333d2b36SAndroid Build Coastguard Worker
180*333d2b36SAndroid Build Coastguard Workerfunc TestBindgenDisallowedFlags(t *testing.T) {
181*333d2b36SAndroid Build Coastguard Worker	// Make sure passing '-x c++' to cflags generates an error
182*333d2b36SAndroid Build Coastguard Worker	testRustError(t, "cflags: -x c\\+\\+ should not be specified in cflags.*", `
183*333d2b36SAndroid Build Coastguard Worker		rust_bindgen {
184*333d2b36SAndroid Build Coastguard Worker			name: "libbad_flag",
185*333d2b36SAndroid Build Coastguard Worker			wrapper_src: "src/any.h",
186*333d2b36SAndroid Build Coastguard Worker			crate_name: "bindgen",
187*333d2b36SAndroid Build Coastguard Worker			stem: "libbindgen",
188*333d2b36SAndroid Build Coastguard Worker			source_stem: "bindings",
189*333d2b36SAndroid Build Coastguard Worker			cflags: ["-x c++"]
190*333d2b36SAndroid Build Coastguard Worker		}
191*333d2b36SAndroid Build Coastguard Worker	`)
192*333d2b36SAndroid Build Coastguard Worker
193*333d2b36SAndroid Build Coastguard Worker	// Make sure passing '-std=' to cflags generates an error
194*333d2b36SAndroid Build Coastguard Worker	testRustError(t, "cflags: -std should not be specified in cflags.*", `
195*333d2b36SAndroid Build Coastguard Worker		rust_bindgen {
196*333d2b36SAndroid Build Coastguard Worker			name: "libbad_flag",
197*333d2b36SAndroid Build Coastguard Worker			wrapper_src: "src/any.h",
198*333d2b36SAndroid Build Coastguard Worker			crate_name: "bindgen",
199*333d2b36SAndroid Build Coastguard Worker			stem: "libbindgen",
200*333d2b36SAndroid Build Coastguard Worker			source_stem: "bindings",
201*333d2b36SAndroid Build Coastguard Worker			cflags: ["-std=foo"]
202*333d2b36SAndroid Build Coastguard Worker		}
203*333d2b36SAndroid Build Coastguard Worker	`)
204*333d2b36SAndroid Build Coastguard Worker}
205*333d2b36SAndroid Build Coastguard Worker
206*333d2b36SAndroid Build Coastguard Workerfunc TestBindgenFlagFile(t *testing.T) {
207*333d2b36SAndroid Build Coastguard Worker	ctx := testRust(t, `
208*333d2b36SAndroid Build Coastguard Worker		rust_bindgen {
209*333d2b36SAndroid Build Coastguard Worker			name: "libbindgen",
210*333d2b36SAndroid Build Coastguard Worker			wrapper_src: "src/any.h",
211*333d2b36SAndroid Build Coastguard Worker			crate_name: "bindgen",
212*333d2b36SAndroid Build Coastguard Worker			stem: "libbindgen",
213*333d2b36SAndroid Build Coastguard Worker			source_stem: "bindings",
214*333d2b36SAndroid Build Coastguard Worker			bindgen_flag_files: [
215*333d2b36SAndroid Build Coastguard Worker				"flag_file.txt",
216*333d2b36SAndroid Build Coastguard Worker			],
217*333d2b36SAndroid Build Coastguard Worker		}
218*333d2b36SAndroid Build Coastguard Worker	`)
219*333d2b36SAndroid Build Coastguard Worker	libbindgen := ctx.ModuleForTests("libbindgen", "android_arm64_armv8-a_source").Output("bindings.rs")
220*333d2b36SAndroid Build Coastguard Worker
221*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(libbindgen.Args["flagfiles"], "/dev/null") {
222*333d2b36SAndroid Build Coastguard Worker		t.Errorf("missing /dev/null in rust_bindgen rule: flags %#v", libbindgen.Args["flagfiles"])
223*333d2b36SAndroid Build Coastguard Worker	}
224*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(libbindgen.Args["flagfiles"], "flag_file.txt") {
225*333d2b36SAndroid Build Coastguard Worker		t.Errorf("missing bindgen flags file in rust_bindgen rule: flags %#v", libbindgen.Args["flagfiles"])
226*333d2b36SAndroid Build Coastguard Worker	}
227*333d2b36SAndroid Build Coastguard Worker	// TODO: The best we can do right now is check $flagfiles. Once bindgen.go switches to RuleBuilder,
228*333d2b36SAndroid Build Coastguard Worker	// we may be able to check libbinder.RuleParams.Command to see if it contains $(cat /dev/null flag_file.txt)
229*333d2b36SAndroid Build Coastguard Worker}
230*333d2b36SAndroid Build Coastguard Worker
231*333d2b36SAndroid Build Coastguard Workerfunc TestBindgenHandleStaticInlining(t *testing.T) {
232*333d2b36SAndroid Build Coastguard Worker	ctx := testRust(t, `
233*333d2b36SAndroid Build Coastguard Worker		rust_bindgen {
234*333d2b36SAndroid Build Coastguard Worker			name: "libbindgen",
235*333d2b36SAndroid Build Coastguard Worker			wrapper_src: "src/any.h",
236*333d2b36SAndroid Build Coastguard Worker			crate_name: "bindgen",
237*333d2b36SAndroid Build Coastguard Worker			stem: "libbindgen",
238*333d2b36SAndroid Build Coastguard Worker			source_stem: "bindings",
239*333d2b36SAndroid Build Coastguard Worker			handle_static_inline: true,
240*333d2b36SAndroid Build Coastguard Worker			static_inline_library: "libbindgen_staticfns"
241*333d2b36SAndroid Build Coastguard Worker		}
242*333d2b36SAndroid Build Coastguard Worker
243*333d2b36SAndroid Build Coastguard Worker		cc_library_static {
244*333d2b36SAndroid Build Coastguard Worker			name: "libbindgen_staticfns",
245*333d2b36SAndroid Build Coastguard Worker			srcs: [":libbindgen"],
246*333d2b36SAndroid Build Coastguard Worker			include_dirs: ["src/"],
247*333d2b36SAndroid Build Coastguard Worker		}
248*333d2b36SAndroid Build Coastguard Worker	`)
249*333d2b36SAndroid Build Coastguard Worker	libbindgen := ctx.ModuleForTests("libbindgen", "android_arm64_armv8-a_source").Output("bindings.rs")
250*333d2b36SAndroid Build Coastguard Worker	// Make sure the flag to support `static inline` functions is present
251*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(libbindgen.Args["flags"], "--wrap-static-fns") {
252*333d2b36SAndroid Build Coastguard Worker		t.Errorf("missing flag to handle static inlining in rust_bindgen rule: flags %#v", libbindgen.Args["flags"])
253*333d2b36SAndroid Build Coastguard Worker	}
254*333d2b36SAndroid Build Coastguard Worker
255*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(libbindgen.Args["flags"], "--wrap-static-fns-path") {
256*333d2b36SAndroid Build Coastguard Worker		t.Errorf("missing flag to define path for static inlining C source from bindgen (--wrap-static-fns-path): flags %#v", libbindgen.Args["flags"])
257*333d2b36SAndroid Build Coastguard Worker	}
258*333d2b36SAndroid Build Coastguard Worker
259*333d2b36SAndroid Build Coastguard Worker}
260*333d2b36SAndroid Build Coastguard Worker
261*333d2b36SAndroid Build Coastguard Workerfunc TestBindgenStaticInlineProperties(t *testing.T) {
262*333d2b36SAndroid Build Coastguard Worker	// Make sure handle_static_inline without static_inline_library generates an error
263*333d2b36SAndroid Build Coastguard Worker	testRustError(t, "requires declaring static_inline_library to the corresponding cc_library module that includes the generated C source from bindgen", `
264*333d2b36SAndroid Build Coastguard Worker		rust_bindgen {
265*333d2b36SAndroid Build Coastguard Worker			name: "libbindgen",
266*333d2b36SAndroid Build Coastguard Worker			wrapper_src: "src/any.h",
267*333d2b36SAndroid Build Coastguard Worker			crate_name: "bindgen",
268*333d2b36SAndroid Build Coastguard Worker			stem: "libbindgen",
269*333d2b36SAndroid Build Coastguard Worker			source_stem: "bindings",
270*333d2b36SAndroid Build Coastguard Worker			handle_static_inline: true
271*333d2b36SAndroid Build Coastguard Worker		}
272*333d2b36SAndroid Build Coastguard Worker	`)
273*333d2b36SAndroid Build Coastguard Worker	testRustError(t, "requires declaring handle_static_inline", `
274*333d2b36SAndroid Build Coastguard Worker		rust_bindgen {
275*333d2b36SAndroid Build Coastguard Worker			name: "libbindgen",
276*333d2b36SAndroid Build Coastguard Worker			wrapper_src: "src/any.h",
277*333d2b36SAndroid Build Coastguard Worker			crate_name: "bindgen",
278*333d2b36SAndroid Build Coastguard Worker			stem: "libbindgen",
279*333d2b36SAndroid Build Coastguard Worker			source_stem: "bindings",
280*333d2b36SAndroid Build Coastguard Worker			static_inline_library: "libbindgen_staticfns"
281*333d2b36SAndroid Build Coastguard Worker		}
282*333d2b36SAndroid Build Coastguard Worker
283*333d2b36SAndroid Build Coastguard Worker		cc_library_static {
284*333d2b36SAndroid Build Coastguard Worker			name: "libbindgen_staticfns",
285*333d2b36SAndroid Build Coastguard Worker			srcs: [":libbindgen"],
286*333d2b36SAndroid Build Coastguard Worker			include_dirs: ["src/"],
287*333d2b36SAndroid Build Coastguard Worker		}
288*333d2b36SAndroid Build Coastguard Worker	`)
289*333d2b36SAndroid Build Coastguard Worker}
290