diff options
author | Sebastian Dröge <sebastian@centricular.com> | 2023-04-17 20:09:27 +0300 |
---|---|---|
committer | Nirbheek Chauhan <nirbheek@centricular.com> | 2023-04-21 13:29:15 +0530 |
commit | d72a8e87c80ffb942dbaaa1e7192ade832a8ba86 (patch) | |
tree | 5de334705ccda1d4f353e678facd971f30b259de | |
parent | d64092b1df6093d3e9eb460a4f87ad900ff5f9db (diff) | |
download | meson-d72a8e87c80ffb942dbaaa1e7192ade832a8ba86.tar.gz |
rust: Don't allow spaces/dashes in Rust library names
The library names are directly mapped to filenames by meson while the
crate name gets spaces/dashes replaced by underscores. This works fine
to a certain degree except that rustc expects a certain filename scheme
for rlibs that matches the crate name.
When using such a library as a dependency of a dependency compilation
will fail with a confusing error message.
See https://github.com/rust-lang/rust/issues/110460
-rw-r--r-- | mesonbuild/build.py | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/mesonbuild/build.py b/mesonbuild/build.py index 22ae57b92..7134c9f34 100644 --- a/mesonbuild/build.py +++ b/mesonbuild/build.py @@ -1937,6 +1937,10 @@ class StaticLibrary(BuildTarget): # Don't let configuration proceed with a non-static crate type elif self.rust_crate_type not in ['rlib', 'staticlib']: raise InvalidArguments(f'Crate type "{self.rust_crate_type}" invalid for static libraries; must be "rlib" or "staticlib"') + # See https://github.com/rust-lang/rust/issues/110460 + if self.rust_crate_type == 'rlib' and any(c in self.name for c in ['-', ' ']): + raise InvalidArguments('Rust crate types "dylib" and "proc-macro" do not allow spaces or dashes in the library name ' + 'due to a limitation of rustc. Replace them with underscores, for example') # By default a static library is named libfoo.a even on Windows because # MSVC does not have a consistent convention for what static libraries # are called. The MSVC CRT uses libfoo.lib syntax but nothing else uses @@ -2019,6 +2023,11 @@ class SharedLibrary(BuildTarget): # Don't let configuration proceed with a non-dynamic crate type elif self.rust_crate_type not in ['dylib', 'cdylib', 'proc-macro']: raise InvalidArguments(f'Crate type "{self.rust_crate_type}" invalid for dynamic libraries; must be "dylib", "cdylib", or "proc-macro"') + # See https://github.com/rust-lang/rust/issues/110460 + if self.rust_crate_type != 'cdylib' and any(c in self.name for c in ['-', ' ']): + raise InvalidArguments('Rust crate types "dylib" and "proc-macro" do not allow spaces or dashes in the library name ' + 'due to a limitation of rustc. Replace them with underscores, for example') + if not hasattr(self, 'prefix'): self.prefix = None if not hasattr(self, 'suffix'): |