|
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
|
|
# Copyright 2019 The Meson development team
|
|
|
|
# Copyright © 2023-2025 Intel Corporation
|
|
|
|
|
|
|
|
from __future__ import annotations
|
|
|
|
|
|
|
|
import typing as T
|
|
|
|
|
|
|
|
from mesonbuild.templates.sampleimpl import FileImpl
|
|
|
|
|
|
|
|
if T.TYPE_CHECKING:
|
|
|
|
from ..minit import Arguments
|
|
|
|
|
|
|
|
|
|
|
|
lib_rust_template = '''#![crate_name = "{crate_file}"]
|
|
|
|
|
|
|
|
/* This function will not be exported and is not
|
|
|
|
* directly callable by users of this library.
|
|
|
|
*/
|
|
|
|
fn internal_function() -> i32 {{
|
|
|
|
return 0;
|
|
|
|
}}
|
|
|
|
|
|
|
|
pub fn {function_name}() -> i32 {{
|
|
|
|
return internal_function();
|
|
|
|
}}
|
|
|
|
|
|
|
|
#[cfg(test)]
|
|
|
|
mod tests {{
|
|
|
|
use super::*;
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_function() {{
|
|
|
|
assert_eq!({function_name}(), 0);
|
|
|
|
}}
|
|
|
|
}}
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
|
|
lib_rust_meson_template = '''project(
|
|
|
|
'{project_name}',
|
|
|
|
'rust',
|
|
|
|
version : '{version}',
|
|
|
|
meson_version : '>= {meson_version}',
|
|
|
|
default_options : ['rust_std=2021', 'warning_level=3'],
|
|
|
|
)
|
|
|
|
|
|
|
|
rust = import('rust')
|
|
|
|
|
|
|
|
dependencies = [{dependencies}
|
|
|
|
]
|
|
|
|
|
|
|
|
lib = static_library(
|
|
|
|
'{lib_name}',
|
|
|
|
'{source_file}',
|
|
|
|
dependencies : dependencies,
|
|
|
|
install : true,
|
|
|
|
)
|
|
|
|
|
|
|
|
rust.test('{test_name}', lib)
|
|
|
|
|
|
|
|
# Make this library usable as a Meson subproject.
|
|
|
|
{ltoken}_dep = declare_dependency(
|
|
|
|
include_directories : include_directories('.'),
|
|
|
|
dependencies : dependencies,
|
|
|
|
link_with : lib,
|
|
|
|
)
|
|
|
|
meson.override_dependency('{project_name}', {ltoken}_dep)
|
|
|
|
'''
|
|
|
|
|
|
|
|
hello_rust_template = '''
|
|
|
|
fn main() {{
|
|
|
|
let project_name = "{project_name}";
|
|
|
|
println!("This is project {{}}.\\n", project_name);
|
|
|
|
}}
|
|
|
|
'''
|
|
|
|
|
|
|
|
hello_rust_meson_template = '''project(
|
|
|
|
'{project_name}',
|
|
|
|
'rust',
|
|
|
|
version : '{version}',
|
|
|
|
meson_version : '>= {meson_version}',
|
|
|
|
default_options : ['rust_std=2021', 'warning_level=3'],
|
|
|
|
)
|
|
|
|
|
|
|
|
dependencies = [{dependencies}
|
|
|
|
]
|
|
|
|
|
|
|
|
exe = executable(
|
|
|
|
'{exe_name}',
|
|
|
|
'{source_name}',
|
|
|
|
dependencies : dependencies,
|
|
|
|
install : true,
|
|
|
|
)
|
|
|
|
|
|
|
|
test('basic', exe)
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
|
|
class RustProject(FileImpl):
|
|
|
|
|
|
|
|
source_ext = 'rs'
|
|
|
|
exe_template = hello_rust_template
|
|
|
|
exe_meson_template = hello_rust_meson_template
|
|
|
|
lib_template = lib_rust_template
|
|
|
|
lib_test_template = None
|
|
|
|
lib_meson_template = lib_rust_meson_template
|
|
|
|
|
|
|
|
def __init__(self, args: Arguments):
|
|
|
|
super().__init__(args)
|
|
|
|
self.meson_version = '1.3.0'
|
|
|
|
|
|
|
|
def lib_kwargs(self) -> T.Dict[str, str]:
|
|
|
|
kwargs = super().lib_kwargs()
|
|
|
|
kwargs['crate_file'] = self.lowercase_token
|
|
|
|
return kwargs
|