The Meson Build System
http://mesonbuild.com/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
160 lines
3.6 KiB
160 lines
3.6 KiB
# SPDX-license-identifer: Apache-2.0 |
|
# Copyright © 2021-2024 Intel Corporation |
|
|
|
project( |
|
'rustmod bindgen', |
|
['c', 'cpp', 'rust'], |
|
meson_version : '>= 0.63', |
|
default_options : ['cpp_std=c++17']) |
|
|
|
prog_bindgen = find_program('bindgen', required : false) |
|
if not prog_bindgen.found() |
|
error('MESON_SKIP_TEST bindgen not found') |
|
endif |
|
|
|
cc_id = meson.get_compiler('c').get_id() |
|
compiler_specific_args = [] |
|
if cc_id == 'gcc' |
|
compiler_specific_args = ['-fipa-pta'] |
|
elif cc_id == 'msvc' |
|
compiler_specific_args = ['/fp:fast'] |
|
endif |
|
|
|
add_project_arguments(['-DPROJECT_ARG', compiler_specific_args], language : 'c') |
|
add_global_arguments(['-DGLOBAL_ARG', compiler_specific_args], language : 'c') |
|
|
|
# This seems to happen on windows when libclang.dll is not in path or is not |
|
# valid. We must try to process a header file for this to work. |
|
# |
|
# See https://github.com/rust-lang/rust-bindgen/issues/1797 |
|
result = run_command(prog_bindgen, 'include/other.h', check: false) |
|
if result.returncode() != 0 |
|
error('MESON_SKIP_TEST bindgen does not seem to work') |
|
endif |
|
|
|
rust = import('unstable-rust') |
|
|
|
# Check version, this case is obviously impossible |
|
testcase expect_error('Program \'bindgen\' not found or not executable') |
|
rust.bindgen(input : 'include/other.h', output : 'other.rs', bindgen_version : ['< 0.1', '> 10000']) |
|
endtestcase |
|
|
|
# This is to test the include_directories argument to bindgen |
|
inc = include_directories('include') |
|
|
|
c_lib = static_library('clib', 'src/source.c', include_directories : inc) |
|
|
|
gen = rust.bindgen( |
|
input : 'src/header.h', |
|
output : 'header.rs', |
|
include_directories : 'include', |
|
) |
|
|
|
# see: https://github.com/mesonbuild/meson/issues/8160 |
|
f = configure_file( |
|
input : 'src/main.rs', |
|
output : 'main.rs', |
|
copy : true, |
|
) |
|
|
|
rust_bin = executable( |
|
'rust_bin', |
|
[f, gen], |
|
link_with : c_lib, |
|
) |
|
|
|
test('main', rust_bin) |
|
|
|
# Test a generated header |
|
gen_h = custom_target( |
|
'gen.h', |
|
command : [find_program('src/gen_header.py'), '@INPUT@', '@OUTPUT@'], |
|
output : 'gen.h', |
|
input : 'src/header.h' |
|
) |
|
|
|
gen2_h = custom_target( |
|
'other.h', |
|
command : [find_program('src/gen_header.py'), '@INPUT@', '@OUTPUT@'], |
|
output : 'other.h', |
|
input : 'include/other.h' |
|
) |
|
|
|
gen_rs = rust.bindgen( |
|
input : [gen_h, gen2_h], |
|
output : 'gen.rs', |
|
) |
|
|
|
f = configure_file( |
|
input : 'src/main2.rs', |
|
output : 'main2.rs', |
|
copy : true, |
|
) |
|
|
|
rust_bin2 = executable( |
|
'rust_bin2', |
|
[f, gen_rs], |
|
link_with : c_lib, |
|
) |
|
|
|
test('generated header', rust_bin2) |
|
|
|
if prog_bindgen.version().version_compare('>= 0.65') |
|
# Test generating a static inline wrapper |
|
gen3 = rust.bindgen( |
|
input : 'src/header3.h', |
|
output : 'header3.rs', |
|
output_inline_wrapper : 'header3.c', |
|
include_directories : inc, |
|
) |
|
c_inline_wrapper = static_library('c_wrapper', gen3[1], include_directories: inc) |
|
|
|
f = configure_file( |
|
input : 'src/main3.rs', |
|
output : 'main3.rs', |
|
copy : true, |
|
) |
|
|
|
rust_bin3 = executable( |
|
'rust_bin3', |
|
[f, gen3[0]], |
|
link_with : [ |
|
c_lib, |
|
c_inline_wrapper, |
|
], |
|
) |
|
|
|
test('static inline wrapper', rust_bin3) |
|
endif |
|
|
|
subdir('sub') |
|
subdir('dependencies') |
|
|
|
gp = rust.bindgen( |
|
input : 'src/global-project.h', |
|
output : 'global-project.rs', |
|
) |
|
|
|
gp_lib = static_library('gp_lib', 'src/global.c') |
|
|
|
gp_exe = executable( |
|
'gp_exe', |
|
structured_sources(['src/global.rs', gp]), |
|
link_with : gp_lib, |
|
) |
|
|
|
test('global and project arguments', gp_exe) |
|
|
|
cpp_lib = static_library('cpplib', 'src/impl.cpp') |
|
|
|
cpp_bind = rust.bindgen( |
|
input : 'src/header.hpp', |
|
output : 'generated-cpp.rs', |
|
) |
|
|
|
cpp_exe = executable( |
|
'cpp_exe', |
|
structured_sources(['src/cpp.rs', cpp_bind]), |
|
link_with : cpp_lib, |
|
) |
|
test('cpp', cpp_exe)
|
|
|