aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDylan Baker <dylan@pnwbakers.com>2023-08-09 16:20:34 -0700
committerXavier Claessens <xclaesse@gmail.com>2023-09-19 13:54:49 -0400
commit8ccdb881374084ddb90ef259539cfd3bb748c904 (patch)
tree249596da64205c1b0b9cc778788d4bac4f6e7aa6
parentdd22546bdd5b7de34025437ae1360f6dd20491eb (diff)
downloadmeson-8ccdb881374084ddb90ef259539cfd3bb748c904.zip
meson-8ccdb881374084ddb90ef259539cfd3bb748c904.tar.gz
meson-8ccdb881374084ddb90ef259539cfd3bb748c904.tar.bz2
Rust: Add a rust.proc_macro() method
-rw-r--r--docs/markdown/Rust-module.md29
-rw-r--r--mesonbuild/modules/rust.py23
-rw-r--r--test cases/rust/18 proc-macro/meson.build13
3 files changed, 62 insertions, 3 deletions
diff --git a/docs/markdown/Rust-module.md b/docs/markdown/Rust-module.md
index bbc92fc..0fb9ede 100644
--- a/docs/markdown/Rust-module.md
+++ b/docs/markdown/Rust-module.md
@@ -105,3 +105,32 @@ were never turned on by Meson.
[properties]
bindgen_clang_arguments = ['--target', 'x86_64-linux-gnu']
```
+
+### proc_macro()
+
+```meson
+rustmod.proc_macro(name, sources, ...)
+```
+
+*Since 1.3.0*
+
+This function creates a Rust `proc-macro` crate, similar to:
+```meson
+[[shared_library]](name, sources,
+ rust_crate_type: 'proc-macro',
+ native: true)
+```
+
+`proc-macro` targets can be passed to `link_with` keyword argument of other Rust
+targets.
+
+Only a subset of [[shared_library]] keyword arguments are allowed:
+- rust_args
+- rust_dependency_map
+- sources
+- dependencies
+- extra_files
+- link_args
+- link_depends
+- link_with
+- override_options
diff --git a/mesonbuild/modules/rust.py b/mesonbuild/modules/rust.py
index 0bda2c2..b6dd731 100644
--- a/mesonbuild/modules/rust.py
+++ b/mesonbuild/modules/rust.py
@@ -15,13 +15,15 @@ from __future__ import annotations
import os
import typing as T
+from mesonbuild.interpreterbase.decorators import FeatureNew
from . import ExtensionModule, ModuleReturnValue, ModuleInfo
from .. import mlog
-from ..build import BothLibraries, BuildTarget, CustomTargetIndex, Executable, ExtractedObjects, GeneratedList, CustomTarget, InvalidArguments, Jar, StructuredSources
+from ..build import (BothLibraries, BuildTarget, CustomTargetIndex, Executable, ExtractedObjects, GeneratedList,
+ CustomTarget, InvalidArguments, Jar, StructuredSources, SharedLibrary)
from ..compilers.compilers import are_asserts_disabled
-from ..interpreter.type_checking import DEPENDENCIES_KW, LINK_WITH_KW, TEST_KWS, OUTPUT_KW, INCLUDE_DIRECTORIES
-from ..interpreterbase import ContainerTypeInfo, InterpreterException, KwargInfo, typed_kwargs, typed_pos_args, noPosargs
+from ..interpreter.type_checking import DEPENDENCIES_KW, LINK_WITH_KW, SHARED_LIB_KWS, TEST_KWS, OUTPUT_KW, INCLUDE_DIRECTORIES, SOURCES_VARARGS
+from ..interpreterbase import ContainerTypeInfo, InterpreterException, KwargInfo, typed_kwargs, typed_pos_args, noPosargs, permittedKwargs
from ..mesonlib import File
if T.TYPE_CHECKING:
@@ -32,6 +34,7 @@ if T.TYPE_CHECKING:
from ..interpreter import kwargs as _kwargs
from ..interpreter.interpreter import SourceInputs, SourceOutputs
from ..programs import ExternalProgram, OverrideProgram
+ from ..interpreter.type_checking import SourcesVarargsType
from typing_extensions import TypedDict
@@ -64,6 +67,7 @@ class RustModule(ExtensionModule):
self.methods.update({
'test': self.test,
'bindgen': self.bindgen,
+ 'proc_macro': self.proc_macro,
})
@typed_pos_args('rust.test', str, BuildTarget)
@@ -268,6 +272,19 @@ class RustModule(ExtensionModule):
return ModuleReturnValue([target], [target])
+ # Allow a limited set of kwargs, but still use the full set of typed_kwargs()
+ # because it could be setting required default values.
+ @FeatureNew('rust.proc_macro', '1.3.0')
+ @permittedKwargs({'rust_args', 'rust_dependency_map', 'sources', 'dependencies', 'extra_files',
+ 'link_args', 'link_depends', 'link_with', 'override_options'})
+ @typed_pos_args('rust.proc_macro', str, varargs=SOURCES_VARARGS)
+ @typed_kwargs('rust.proc_macro', *SHARED_LIB_KWS, allow_unknown=True)
+ def proc_macro(self, state: ModuleState, args: T.Tuple[str, SourcesVarargsType], kwargs: T.Dict) -> SharedLibrary:
+ kwargs['native'] = True
+ kwargs['rust_crate_type'] = 'proc-macro'
+ target = state._interpreter.build_target(state.current_node, args, kwargs, SharedLibrary)
+ return T.cast('SharedLibrary', target)
+
def initialize(interp: Interpreter) -> RustModule:
return RustModule(interp)
diff --git a/test cases/rust/18 proc-macro/meson.build b/test cases/rust/18 proc-macro/meson.build
index 2958df1..c5f0dfc 100644
--- a/test cases/rust/18 proc-macro/meson.build
+++ b/test cases/rust/18 proc-macro/meson.build
@@ -18,3 +18,16 @@ main = executable(
)
test('main_test', main)
+
+rust = import('rust')
+
+pm = rust.proc_macro('proc_macro_examples2', 'proc.rs')
+
+main = executable(
+ 'main2',
+ 'use.rs',
+ link_with : pm,
+ rust_dependency_map : {'proc_macro_examples2' : 'proc_macro_examples'}
+)
+
+test('main_test2', main)