aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDylan Baker <dylan@pnwbakers.com>2020-10-26 12:45:35 -0700
committerJussi Pakkanen <jpakkane@gmail.com>2020-11-05 21:24:20 +0200
commit7860a6aeab9514391f02923a7f6357f094c8af68 (patch)
tree57e7b9bf1f89ab5e5d1133a97a550ea237527046
parentbe2c1a43000db0a84a76522b23b80d597e08f663 (diff)
downloadmeson-7860a6aeab9514391f02923a7f6357f094c8af68.zip
meson-7860a6aeab9514391f02923a7f6357f094c8af68.tar.gz
meson-7860a6aeab9514391f02923a7f6357f094c8af68.tar.bz2
rust: implement support for --edition
Using the std option, so now `rust_std=..` will work. I've chosen to use "std" even though rust calls these "editions", as meson refers to language versions as "standards", which makes meson feel more uniform, and be less surprising. Fixes: #5100
-rw-r--r--docs/markdown/snippets/rust_std_option.md5
-rw-r--r--mesonbuild/backend/ninjabackend.py3
-rw-r--r--mesonbuild/compilers/rust.py19
-rw-r--r--test cases/rust/10 language stds/2015.rs3
-rw-r--r--test cases/rust/10 language stds/2018.rs9
-rw-r--r--test cases/rust/10 language stds/meson.build18
6 files changed, 57 insertions, 0 deletions
diff --git a/docs/markdown/snippets/rust_std_option.md b/docs/markdown/snippets/rust_std_option.md
new file mode 100644
index 0000000..f2efdb9
--- /dev/null
+++ b/docs/markdown/snippets/rust_std_option.md
@@ -0,0 +1,5 @@
+## Rust now has a a standard option
+
+Rust calls these `editions`, however, meson generally refers to such language
+versions as "standards", or "std" for short. Rust uses "std" to keep normalize
+it with other languages.
diff --git a/mesonbuild/backend/ninjabackend.py b/mesonbuild/backend/ninjabackend.py
index 2ffbb85..09f06da 100644
--- a/mesonbuild/backend/ninjabackend.py
+++ b/mesonbuild/backend/ninjabackend.py
@@ -1524,10 +1524,13 @@ int dummy;
for a in rustc.linker.get_always_args():
args += ['-C', 'link-arg={}'.format(a)]
+ opt_proxy = self.get_compiler_options_for_target(target)[rustc.language]
+
args += ['--crate-name', target.name]
args += rustc.get_buildtype_args(self.get_option_for_target('buildtype', target))
args += rustc.get_debug_args(self.get_option_for_target('debug', target))
args += rustc.get_optimization_args(self.get_option_for_target('optimization', target))
+ args += rustc.get_option_compile_args(opt_proxy)
args += self.build.get_global_args(rustc, target.for_machine)
args += self.build.get_project_args(rustc, target.subproject, target.for_machine)
depfile = os.path.join(target.subdir, target.name + '.d')
diff --git a/mesonbuild/compilers/rust.py b/mesonbuild/compilers/rust.py
index 02bc791..469859b 100644
--- a/mesonbuild/compilers/rust.py
+++ b/mesonbuild/compilers/rust.py
@@ -16,15 +16,18 @@ import subprocess, os.path
import textwrap
import typing as T
+from .. import coredata
from ..mesonlib import EnvironmentException, MachineChoice, Popen_safe
from .compilers import Compiler, rust_buildtype_args, clike_debug_args
if T.TYPE_CHECKING:
+ from ..coredata import OptionDictType
from ..dependencies import ExternalProgram
from ..envconfig import MachineInfo
from ..environment import Environment # noqa: F401
from ..linkers import DynamicLinker
+
rust_optimization_args = {
'0': [],
'g': ['-C', 'opt-level=0'],
@@ -122,3 +125,19 @@ class RustCompiler(Compiler):
# Rust does not have a use_linker_args because it dispatches to a gcc-like
# C compiler for dynamic linking, as such we invoke the C compiler's
# use_linker_args method instead.
+
+ def get_options(self) -> 'OptionDictType':
+ return {
+ 'std': coredata.UserComboOption(
+ 'Rust Eddition to use',
+ ['none', '2015', '2018'],
+ 'none',
+ ),
+ }
+
+ def get_option_compile_args(self, options: 'OptionDictType') -> T.List[str]:
+ args = []
+ std = options['std']
+ if std.value != 'none':
+ args.append('--edition=' + std.value)
+ return args
diff --git a/test cases/rust/10 language stds/2015.rs b/test cases/rust/10 language stds/2015.rs
new file mode 100644
index 0000000..4d28c57
--- /dev/null
+++ b/test cases/rust/10 language stds/2015.rs
@@ -0,0 +1,3 @@
+trait Foo {
+ fn foo(&self, Box<dyn Foo>);
+}
diff --git a/test cases/rust/10 language stds/2018.rs b/test cases/rust/10 language stds/2018.rs
new file mode 100644
index 0000000..4009154
--- /dev/null
+++ b/test cases/rust/10 language stds/2018.rs
@@ -0,0 +1,9 @@
+const fn foo(x: i32) -> i32 {
+ return x + 1;
+}
+
+const VALUE: i32 = foo(-1);
+
+pub fn main() {
+ std::process::exit(VALUE);
+}
diff --git a/test cases/rust/10 language stds/meson.build b/test cases/rust/10 language stds/meson.build
new file mode 100644
index 0000000..9944339
--- /dev/null
+++ b/test cases/rust/10 language stds/meson.build
@@ -0,0 +1,18 @@
+project('rust std options', 'rust')
+
+# this only works in 2018
+new = executable(
+ 'new',
+ '2018.rs',
+ override_options : ['rust_std=2018'],
+)
+
+# this only works in 2015
+old = static_library(
+ 'old',
+ '2015.rs',
+ override_options : ['rust_std=2015'],
+)
+
+
+test('2018 std', new)