|
|
|
project('rust and c polyglot executable', 'c', 'rust')
|
|
|
|
|
|
|
|
if host_machine.system() == 'darwin'
|
|
|
|
error('MESON_SKIP_TEST: does not work right on macos, please fix!')
|
|
|
|
endif
|
|
|
|
|
|
|
|
cc = meson.get_compiler('c')
|
|
|
|
|
|
|
|
# Test all combinations of crate and target types.
|
|
|
|
# - 'clib' gets translated to `rust_abi: 'c'` instead.
|
|
|
|
# - '' gets translated to no kwargs.
|
|
|
|
allowed_map = {
|
|
|
|
'static_library': ['rlib', 'staticlib', 'lib', 'clib', ''],
|
|
|
|
'shared_library': ['dylib', 'cdylib', 'lib', 'proc-macro', 'clib', ''],
|
|
|
|
'both_libraries': ['lib', 'clib', ''],
|
|
|
|
}
|
|
|
|
foreach crate_type : ['lib', 'rlib', 'dylib', 'cdylib', 'staticlib', 'proc-macro', 'clib', '', 'invalid']
|
|
|
|
foreach target_type, allowed : allowed_map
|
|
|
|
name = f'stuff_@crate_type@_@target_type@'.underscorify()
|
|
|
|
src = crate_type == 'proc-macro' ? 'proc.rs' : 'stuff.rs'
|
|
|
|
if crate_type not in allowed
|
|
|
|
# Note: in the both_libraries() case it is possible that the static part
|
|
|
|
# is still being built because the shared part raised an error but we
|
|
|
|
# don't rollback correctly.
|
|
|
|
testcase expect_error('(Crate type .* invalid for .*)|(.*must be one of.*not invalid)', how: 're')
|
|
|
|
build_target(name, src,
|
|
|
|
target_type: target_type,
|
|
|
|
rust_crate_type: crate_type,
|
|
|
|
install: true)
|
|
|
|
endtestcase
|
|
|
|
continue
|
|
|
|
endif
|
|
|
|
rust_kwargs = {}
|
|
|
|
if crate_type == 'clib'
|
|
|
|
rust_kwargs = {'rust_abi': 'c'}
|
|
|
|
elif crate_type != ''
|
|
|
|
rust_kwargs = {'rust_crate_type': crate_type}
|
|
|
|
endif
|
|
|
|
l = build_target(name, src,
|
|
|
|
target_type: target_type,
|
|
|
|
kwargs: rust_kwargs,
|
|
|
|
install: true)
|
|
|
|
if crate_type in ['cdylib', 'staticlib', 'clib']
|
|
|
|
e = executable(f'prog-@name@', 'prog.c',
|
|
|
|
link_with: l,
|
|
|
|
rust_dependency_map: {name: 'stuff'},
|
|
|
|
install: true)
|
|
|
|
test(f'polyglottest-@name@', e)
|
|
|
|
else
|
|
|
|
testcase expect_error('Try to link Rust ABI library .*', how: 're')
|
|
|
|
executable(f'prog-@name@', 'prog.c', link_with: l)
|
|
|
|
endtestcase
|
|
|
|
endif
|
|
|
|
endforeach
|
|
|
|
endforeach
|