Skip to content

Commit

Permalink
meson/rust: wrap bindgens wrap-static-fns functionality
Browse files Browse the repository at this point in the history
This way the `rust.bindgen` can generate a second output being a C file,
which contains wrapper functions for static inline ones.

This output file can then be compiled via C targets.
  • Loading branch information
karolherbst committed Sep 17, 2023
1 parent ca60f71 commit 0ec6ae0
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 4 deletions.
4 changes: 4 additions & 0 deletions docs/markdown/Rust-module.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,10 @@ It takes the following keyword arguments
- `input`: a list of Files, Strings, or CustomTargets. The first element is
the header bindgen will parse, additional elements are dependencies.
- `output`: the name of the output rust file
- `output_inline_wrapper`: the name of the optional output c file containing
wrappers for static inline function. Setting this will instruct `bindgen` to
generate it by adding the relevant arguments to `args`. This requires
`bindgen` `0.64` or newer (*since 1.3.0*).
- `include_directories`: A list of `include_directories` or `string` objects,
these are passed to clang as `-I` arguments *(string since 1.0.0)*
- `c_args`: a list of string arguments to pass to clang untouched
Expand Down
25 changes: 21 additions & 4 deletions mesonbuild/modules/rust.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ class FuncBindgen(TypedDict):
include_directories: T.List[IncludeDirs]
input: T.List[SourceInputs]
output: str
output_inline_wrapper: str
dependencies: T.List[T.Union[Dependency, ExternalLibrary]]


Expand Down Expand Up @@ -191,6 +192,12 @@ def test(self, state: ModuleState, args: T.Tuple[str, BuildTarget], kwargs: Func
),
INCLUDE_DIRECTORIES.evolve(since_values={ContainerTypeInfo(list, str): '1.0.0'}),
OUTPUT_KW,
KwargInfo(
'output_inline_wrapper',
str,
default='',
since='1.3.0',
),
DEPENDENCIES_KW.evolve(since='1.0.0'),
)
def bindgen(self, state: ModuleState, args: T.List, kwargs: FuncBindgen) -> ModuleReturnValue:
Expand Down Expand Up @@ -243,12 +250,22 @@ def bindgen(self, state: ModuleState, args: T.List, kwargs: FuncBindgen) -> Modu
else:
name = header.get_outputs()[0]

inline_wrapper_args = []
outputs = [kwargs['output']]
if kwargs['output_inline_wrapper']:
outputs.append(kwargs['output_inline_wrapper'])
inline_wrapper_args = [
'--experimental', '--wrap-static-fns',
'--wrap-static-fns-path', os.path.join(state.environment.build_dir, state.subdir, kwargs['output_inline_wrapper'])
]

cmd = self._bindgen_bin.get_command() + \
[
'@INPUT@', '--output',
os.path.join(state.environment.build_dir, '@OUTPUT@')
os.path.join(state.environment.build_dir, '@OUTPUT0@')
] + \
kwargs['args'] + ['--'] + kwargs['c_args'] + clang_args + \
kwargs['args'] + inline_wrapper_args + ['--'] + \
kwargs['c_args'] + clang_args + \
['-MD', '-MQ', '@INPUT@', '-MF', '@DEPFILE@']

target = CustomTarget(
Expand All @@ -258,15 +275,15 @@ def bindgen(self, state: ModuleState, args: T.List, kwargs: FuncBindgen) -> Modu
state.environment,
cmd,
[header],
[kwargs['output']],
outputs,
depfile='@PLAINNAME@.d',
extra_depends=depends,
depend_files=depend_files,
backend=state.backend,
description='Generating bindings for Rust {}',
)

return ModuleReturnValue([target], [target])
return ModuleReturnValue(target, [target])


def initialize(interp: Interpreter) -> RustModule:
Expand Down

0 comments on commit 0ec6ae0

Please sign in to comment.