aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/build.py
diff options
context:
space:
mode:
authorAdam C. Foltzer <acfoltzer@galois.com>2017-06-09 14:51:58 -0700
committerAdam C. Foltzer <acfoltzer@galois.com>2017-06-09 15:14:02 -0700
commitbdd4c45b173055931db1c758cd7f016693d3a924 (patch)
treea868e261a3771996dbd3c1dd03c5bac049f60389 /mesonbuild/build.py
parent22cfd44221ada3219d9096e15dc8b00d32e0f9f6 (diff)
downloadmeson-bdd4c45b173055931db1c758cd7f016693d3a924.zip
meson-bdd4c45b173055931db1c758cd7f016693d3a924.tar.gz
meson-bdd4c45b173055931db1c758cd7f016693d3a924.tar.bz2
Enhance Rust support
- Adds a `crate_type` kwarg to library targets, allowing the different types of Rust [linkage][1]. - Shared libraries use the `dylib` crate type by default, but can also be `cdylib` - Static libraries use the `rlib` crate type by default, but can also be `staticlib` - If any Rust target has shared library dependencies, add the appropriate linker arguments, including rpath for the sysroot of the Rust compiler [1]: https://doc.rust-lang.org/reference/linkage.html
Diffstat (limited to 'mesonbuild/build.py')
-rw-r--r--mesonbuild/build.py45
1 files changed, 37 insertions, 8 deletions
diff --git a/mesonbuild/build.py b/mesonbuild/build.py
index 2c55ed4..f4b3382 100644
--- a/mesonbuild/build.py
+++ b/mesonbuild/build.py
@@ -71,6 +71,7 @@ known_lib_kwargs.update({'version': True, # Only for shared libs
'vala_vapi': True,
'vala_gir': True,
'pic': True, # Only for static libs
+ 'crate_type': True, # Only for Rust libs
})
@@ -1123,6 +1124,14 @@ class StaticLibrary(BuildTarget):
super().__init__(name, subdir, subproject, is_cross, sources, objects, environment, kwargs)
if 'cs' in self.compilers:
raise InvalidArguments('Static libraries not supported for C#.')
+ if 'rust' in self.compilers:
+ # If no crate type is specified, or it's the generic lib type, use rlib
+ if not hasattr(self, 'crate_type') or self.crate_type == 'lib':
+ mlog.debug('Defaulting Rust static library target crate type to rlib')
+ self.crate_type = 'rlib'
+ # Don't let configuration proceed with a non-static crate type
+ elif self.crate_type not in ['rlib', 'staticlib']:
+ raise InvalidArguments('Crate type "{0}" invalid for static libraries; must be "rlib" or "staticlib"'.format(self.crate_type))
# 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
@@ -1133,9 +1142,12 @@ class StaticLibrary(BuildTarget):
if not hasattr(self, 'prefix'):
self.prefix = 'lib'
if not hasattr(self, 'suffix'):
- # Rust static library crates have .rlib suffix
if 'rust' in self.compilers:
- self.suffix = 'rlib'
+ if not hasattr(self, 'crate_type') or self.crate_type == 'rlib':
+ # default Rust static library suffix
+ self.suffix = 'rlib'
+ elif self.crate_type == 'staticlib':
+ self.suffix = 'a'
else:
self.suffix = 'a'
self.filename = self.prefix + self.name + '.' + self.suffix
@@ -1147,6 +1159,15 @@ class StaticLibrary(BuildTarget):
def check_unknown_kwargs(self, kwargs):
self.check_unknown_kwargs_int(kwargs, known_lib_kwargs)
+ def process_kwargs(self, kwargs, environment):
+ super().process_kwargs(kwargs, environment)
+ if 'crate_type' in kwargs:
+ crate_type = kwargs['crate_type']
+ if isinstance(crate_type, str):
+ self.crate_type = crate_type
+ else:
+ raise InvalidArguments('Invalid crate_type "{0}": must be a string.'.format(crate_type))
+
class SharedLibrary(BuildTarget):
def __init__(self, name, subdir, subproject, is_cross, sources, objects, environment, kwargs):
self.soversion = None
@@ -1159,6 +1180,14 @@ class SharedLibrary(BuildTarget):
# The import library that GCC would generate (and prefer)
self.gcc_import_filename = None
super().__init__(name, subdir, subproject, is_cross, sources, objects, environment, kwargs)
+ if 'rust' in self.compilers:
+ # If no crate type is specified, or it's the generic lib type, use dylib
+ if not hasattr(self, 'crate_type') or self.crate_type == 'lib':
+ mlog.debug('Defaulting Rust dynamic library target crate type to "dylib"')
+ self.crate_type = 'dylib'
+ # Don't let configuration proceed with a non-dynamic crate type
+ elif self.crate_type not in ['dylib', 'cdylib']:
+ raise InvalidArguments('Crate type "{0}" invalid for dynamic libraries; must be "dylib" or "cdylib"'.format(self.crate_type))
if not hasattr(self, 'prefix'):
self.prefix = None
if not hasattr(self, 'suffix'):
@@ -1200,12 +1229,6 @@ class SharedLibrary(BuildTarget):
prefix = ''
suffix = 'dll'
self.filename_tpl = '{0.prefix}{0.name}.{0.suffix}'
- # Rust
- elif 'rust' in self.compilers:
- # Currently, we always build --crate-type=rlib
- prefix = 'lib'
- suffix = 'rlib'
- self.filename_tpl = '{0.prefix}{0.name}.{0.suffix}'
# C, C++, Swift, Vala
# Only Windows uses a separate import library for linking
# For all other targets/platforms import_filename stays None
@@ -1315,6 +1338,12 @@ class SharedLibrary(BuildTarget):
raise InvalidArguments(
'Shared library vs_module_defs must be either a string, '
'a file object or a Custom Target')
+ if 'crate_type' in kwargs:
+ crate_type = kwargs['crate_type']
+ if isinstance(crate_type, str):
+ self.crate_type = crate_type
+ else:
+ raise InvalidArguments('Invalid crate_type "{0}": must be a string.'.format(crate_type))
def check_unknown_kwargs(self, kwargs):
self.check_unknown_kwargs_int(kwargs, known_lib_kwargs)