| 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 |