Skip to content

Commit b50a6c6

Browse files
Allowlist types generated by bindgen (#60)
* Allowlist types generated by bindgen Tidied up build script as well, layout tests are no longer generated unless `EXT_PHP_RS_TEST` env variable is set. Much quicker build times and smaller output size. * Fix build * Override Rust toolchain when running CI
1 parent 52fae5c commit b50a6c6

File tree

3 files changed

+204
-25
lines changed

3 files changed

+204
-25
lines changed

.github/workflows/build.yml

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ jobs:
3232
uses: actions-rs/toolchain@v1
3333
with:
3434
toolchain: ${{ matrix.rust-toolchain }}
35+
override: true
3536
- name: Setup LLVM & Clang
3637
uses: KyleMayes/install-llvm-action@v1
3738
with:
@@ -42,12 +43,10 @@ jobs:
4243
with:
4344
mdbook-version: latest
4445
- name: Build
45-
uses: actions-rs/cargo@v1
4646
env:
4747
LIBCLANG_PATH: ${{ runner.temp }}/llvm-${{ matrix.llvm }}/lib
48-
with:
49-
command: build
50-
args: --release --features alloc,closure
48+
EXT_PHP_RS_TEST:
49+
run: cargo build --release --features alloc,closure
5150
- name: Test guide examples
5251
run: |
5352
mdbook test guide -L target/release/deps

.github/workflows/docs.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ jobs:
2828
uses: actions-rs/toolchain@v1
2929
with:
3030
toolchain: ${{ matrix.rust-toolchain }}
31+
override: true
3132
- name: Setup LLVM & Clang
3233
uses: KyleMayes/install-llvm-action@v1
3334
with:
@@ -41,7 +42,7 @@ jobs:
4142
env:
4243
LIBCLANG_PATH: ${{ runner.temp }}/llvm-${{ matrix.llvm }}/lib
4344
RUSTDOCFLAGS: --cfg docs
44-
run: cargo +nightly doc --release
45+
run: cargo --release
4546
- name: Build guide
4647
run: |
4748
mdbook build guide

build.rs

Lines changed: 199 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,11 @@ use std::{
33
env,
44
path::{Path, PathBuf},
55
process::Command,
6+
str,
67
};
78

89
use bindgen::callbacks::{MacroParsingBehavior, ParseCallbacks};
9-
use regex::{Captures, Regex};
10+
use regex::Regex;
1011

1112
extern crate bindgen;
1213

@@ -53,28 +54,23 @@ fn main() {
5354
.expect("Unable to run `php -i`. Please ensure it is visible in your PATH.");
5455

5556
if !php_i_cmd.status.success() {
56-
let stderr = String::from_utf8(includes_cmd.stderr)
57-
.unwrap_or_else(|_| String::from("Unable to read stderr"));
57+
let stderr = str::from_utf8(&includes_cmd.stderr).unwrap_or("Unable to read stderr");
5858
panic!("Error running `php -i`: {}", stderr);
5959
}
6060

61-
let php_i = String::from_utf8(php_i_cmd.stdout).expect("unable to parse `php -i` stdout");
62-
let php_api_regex = Regex::new(r"PHP API => ([0-9]+)").unwrap();
63-
let api_ver: Vec<Captures> = php_api_regex.captures_iter(php_i.as_ref()).collect();
64-
65-
match api_ver.first() {
66-
Some(api_ver) => match api_ver.get(1) {
67-
Some(api_ver) => {
68-
let api_ver: u32 = api_ver.as_str().parse().unwrap();
61+
let api_ver = Regex::new(r"PHP API => ([0-9]+)")
62+
.unwrap()
63+
.captures_iter(
64+
str::from_utf8(&php_i_cmd.stdout).expect("Unable to parse `php -i` stdout as UTF-8"),
65+
)
66+
.next()
67+
.and_then(|ver| ver.get(1))
68+
.and_then(|ver| ver.as_str().parse::<u32>().ok())
69+
.expect("Unable to retrieve PHP API version from `php -i`.");
6970

70-
if api_ver < MIN_PHP_API_VER || api_ver > MAX_PHP_API_VER {
71-
panic!("The current version of PHP is not supported. Current PHP API version: {}, requires a version between {} and {}", api_ver, MIN_PHP_API_VER, MAX_PHP_API_VER);
72-
}
73-
},
74-
None => panic!("Unable to retrieve PHP API version from `php -i`. Please check the installation and ensure it is callable.")
75-
},
76-
None => panic!("Unable to retrieve PHP API version from `php -i`. Please check the installation and ensure it is callable.")
77-
};
71+
if api_ver < MIN_PHP_API_VER || api_ver > MAX_PHP_API_VER {
72+
panic!("The current version of PHP is not supported. Current PHP API version: {}, requires a version between {} and {}", api_ver, MIN_PHP_API_VER, MAX_PHP_API_VER);
73+
}
7874

7975
let includes =
8076
String::from_utf8(includes_cmd.stdout).expect("unable to parse `php-config` stdout");
@@ -109,13 +105,23 @@ fn main() {
109105
);
110106

111107
let out_path = PathBuf::from(env::var("OUT_DIR").unwrap());
112-
bindgen::Builder::default()
108+
let mut bindgen = bindgen::Builder::default()
113109
.header("src/wrapper/wrapper.h")
114110
.clang_args(includes.split(' '))
115111
.parse_callbacks(Box::new(bindgen::CargoCallbacks))
116112
.parse_callbacks(Box::new(ignore_math_h_macros))
117113
.rustfmt_bindings(true)
118114
.no_copy("_zend_value")
115+
.layout_tests(env::var("EXT_PHP_RS_TEST").is_ok());
116+
117+
for binding in ALLOWED_BINDINGS.iter() {
118+
bindgen = bindgen
119+
.allowlist_function(binding)
120+
.allowlist_type(binding)
121+
.allowlist_var(binding);
122+
}
123+
124+
bindgen
119125
.generate()
120126
.expect("Unable to generate bindings for PHP")
121127
.write_to_file(out_path.join("bindings.rs"))
@@ -161,3 +167,176 @@ impl Configure {
161167
self.0.contains("--enable-debug")
162168
}
163169
}
170+
171+
/// Array of functions/types used in `ext-php-rs` - used to allowlist when generating
172+
/// bindings, as we don't want to generate bindings for everything (i.e. stdlib headers).
173+
const ALLOWED_BINDINGS: &[&str] = &[
174+
"HashTable",
175+
"_Bucket",
176+
"_call_user_function_impl",
177+
"_efree",
178+
"_emalloc",
179+
"_zend_executor_globals",
180+
"_zend_expected_type",
181+
"_zend_expected_type_Z_EXPECTED_ARRAY",
182+
"_zend_expected_type_Z_EXPECTED_BOOL",
183+
"_zend_expected_type_Z_EXPECTED_DOUBLE",
184+
"_zend_expected_type_Z_EXPECTED_LONG",
185+
"_zend_expected_type_Z_EXPECTED_OBJECT",
186+
"_zend_expected_type_Z_EXPECTED_RESOURCE",
187+
"_zend_expected_type_Z_EXPECTED_STRING",
188+
"_zend_new_array",
189+
"_zval_struct__bindgen_ty_1",
190+
"_zval_struct__bindgen_ty_2",
191+
"ext_php_rs_executor_globals",
192+
"ext_php_rs_php_build_id",
193+
"ext_php_rs_zend_object_alloc",
194+
"ext_php_rs_zend_object_release",
195+
"ext_php_rs_zend_string_init",
196+
"ext_php_rs_zend_string_release",
197+
"object_properties_init",
198+
"php_info_print_table_end",
199+
"php_info_print_table_header",
200+
"php_info_print_table_row",
201+
"php_info_print_table_start",
202+
"std_object_handlers",
203+
"zend_array_destroy",
204+
"zend_array_dup",
205+
"zend_ce_argument_count_error",
206+
"zend_ce_arithmetic_error",
207+
"zend_ce_compile_error",
208+
"zend_ce_division_by_zero_error",
209+
"zend_ce_error_exception",
210+
"zend_ce_exception",
211+
"zend_ce_parse_error",
212+
"zend_ce_throwable",
213+
"zend_ce_type_error",
214+
"zend_ce_unhandled_match_error",
215+
"zend_ce_value_error",
216+
"zend_class_entry",
217+
"zend_declare_class_constant",
218+
"zend_declare_property",
219+
"zend_do_implement_interface",
220+
"zend_execute_data",
221+
"zend_function_entry",
222+
"zend_hash_clean",
223+
"zend_hash_index_del",
224+
"zend_hash_index_find",
225+
"zend_hash_index_update",
226+
"zend_hash_next_index_insert",
227+
"zend_hash_str_del",
228+
"zend_hash_str_find",
229+
"zend_hash_str_update",
230+
"zend_internal_arg_info",
231+
"zend_is_callable",
232+
"zend_long",
233+
"zend_lookup_class_ex",
234+
"zend_module_entry",
235+
"zend_object",
236+
"zend_object_handlers",
237+
"zend_object_std_init",
238+
"zend_objects_clone_members",
239+
"zend_register_bool_constant",
240+
"zend_register_double_constant",
241+
"zend_register_internal_class_ex",
242+
"zend_register_long_constant",
243+
"zend_register_string_constant",
244+
"zend_resource",
245+
"zend_string",
246+
"zend_string_init_interned",
247+
"zend_throw_exception_ex",
248+
"zend_type",
249+
"zend_value",
250+
"zend_wrong_parameters_count_error",
251+
"zval",
252+
"CONST_CS",
253+
"CONST_DEPRECATED",
254+
"CONST_NO_FILE_CACHE",
255+
"CONST_PERSISTENT",
256+
"HT_MIN_SIZE",
257+
"IS_ARRAY",
258+
"IS_ARRAY_EX",
259+
"IS_CALLABLE",
260+
"IS_CONSTANT_AST",
261+
"IS_CONSTANT_AST_EX",
262+
"IS_DOUBLE",
263+
"IS_FALSE",
264+
"IS_INTERNED_STRING_EX",
265+
"IS_LONG",
266+
"IS_MIXED",
267+
"IS_NULL",
268+
"IS_OBJECT",
269+
"IS_OBJECT_EX",
270+
"IS_REFERENCE",
271+
"IS_REFERENCE_EX",
272+
"IS_RESOURCE",
273+
"IS_RESOURCE_EX",
274+
"IS_STRING",
275+
"IS_STRING_EX",
276+
"IS_TRUE",
277+
"IS_TYPE_COLLECTABLE",
278+
"IS_TYPE_REFCOUNTED",
279+
"IS_UNDEF",
280+
"IS_VOID",
281+
"MAY_BE_ANY",
282+
"MAY_BE_BOOL",
283+
"USING_ZTS",
284+
"ZEND_ACC_ABSTRACT",
285+
"ZEND_ACC_ANON_CLASS",
286+
"ZEND_ACC_CALL_VIA_TRAMPOLINE",
287+
"ZEND_ACC_CHANGED",
288+
"ZEND_ACC_CLOSURE",
289+
"ZEND_ACC_CONSTANTS_UPDATED",
290+
"ZEND_ACC_CTOR",
291+
"ZEND_ACC_DEPRECATED",
292+
"ZEND_ACC_DONE_PASS_TWO",
293+
"ZEND_ACC_EARLY_BINDING",
294+
"ZEND_ACC_FAKE_CLOSURE",
295+
"ZEND_ACC_FINAL",
296+
"ZEND_ACC_GENERATOR",
297+
"ZEND_ACC_HAS_FINALLY_BLOCK",
298+
"ZEND_ACC_HAS_RETURN_TYPE",
299+
"ZEND_ACC_HAS_TYPE_HINTS",
300+
"ZEND_ACC_HAS_UNLINKED_USES",
301+
"ZEND_ACC_HEAP_RT_CACHE",
302+
"ZEND_ACC_IMMUTABLE",
303+
"ZEND_ACC_IMPLICIT_ABSTRACT_CLASS",
304+
"ZEND_ACC_INTERFACE",
305+
"ZEND_ACC_LINKED",
306+
"ZEND_ACC_NEARLY_LINKED",
307+
"ZEND_ACC_NEVER_CACHE",
308+
"ZEND_ACC_NO_DYNAMIC_PROPERTIES",
309+
"ZEND_ACC_PRELOADED",
310+
"ZEND_ACC_PRIVATE",
311+
"ZEND_ACC_PROMOTED",
312+
"ZEND_ACC_PROPERTY_TYPES_RESOLVED",
313+
"ZEND_ACC_PROTECTED",
314+
"ZEND_ACC_PUBLIC",
315+
"ZEND_ACC_RESOLVED_INTERFACES",
316+
"ZEND_ACC_RESOLVED_PARENT",
317+
"ZEND_ACC_RETURN_REFERENCE",
318+
"ZEND_ACC_REUSE_GET_ITERATOR",
319+
"ZEND_ACC_STATIC",
320+
"ZEND_ACC_STRICT_TYPES",
321+
"ZEND_ACC_TOP_LEVEL",
322+
"ZEND_ACC_TRAIT",
323+
"ZEND_ACC_TRAIT_CLONE",
324+
"ZEND_ACC_UNRESOLVED_VARIANCE",
325+
"ZEND_ACC_USES_THIS",
326+
"ZEND_ACC_USE_GUARDS",
327+
"ZEND_ACC_VARIADIC",
328+
"ZEND_DEBUG",
329+
"ZEND_HAS_STATIC_IN_METHODS",
330+
"ZEND_ISEMPTY",
331+
"ZEND_MM_ALIGNMENT",
332+
"ZEND_MM_ALIGNMENT_MASK",
333+
"ZEND_MODULE_API_NO",
334+
"ZEND_PROPERTY_EXISTS",
335+
"ZEND_PROPERTY_ISSET",
336+
"Z_TYPE_FLAGS_SHIFT",
337+
"_IS_BOOL",
338+
"_ZEND_IS_VARIADIC_BIT",
339+
"_ZEND_SEND_MODE_SHIFT",
340+
"_ZEND_TYPE_NULLABLE_BIT",
341+
"ts_rsrc_id",
342+
];

0 commit comments

Comments
 (0)