aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/backend
diff options
context:
space:
mode:
authorJussi Pakkanen <jpakkane@gmail.com>2023-06-27 23:57:13 +0300
committerGitHub <noreply@github.com>2023-06-27 23:57:13 +0300
commita4fb8dcc4111575c670c384e52bf1abb119879b9 (patch)
treebdf995d017f7452d7b96f17829d022a208243aba /mesonbuild/backend
parent8946bc05f7f9cdd16dce3613c481a66f7835fc7f (diff)
parent6bfb47a455af60dc975e21dd82943d5baa2bea83 (diff)
downloadmeson-a4fb8dcc4111575c670c384e52bf1abb119879b9.zip
meson-a4fb8dcc4111575c670c384e52bf1abb119879b9.tar.gz
meson-a4fb8dcc4111575c670c384e52bf1abb119879b9.tar.bz2
Merge pull request #11902 from dcbaker/submit/rust-module-enhancements
Rust module enhancements for mesa
Diffstat (limited to 'mesonbuild/backend')
-rw-r--r--mesonbuild/backend/ninjabackend.py60
1 files changed, 59 insertions, 1 deletions
diff --git a/mesonbuild/backend/ninjabackend.py b/mesonbuild/backend/ninjabackend.py
index 29cc8c6..ba614fd 100644
--- a/mesonbuild/backend/ninjabackend.py
+++ b/mesonbuild/backend/ninjabackend.py
@@ -1948,6 +1948,49 @@ class NinjaBackend(backends.Backend):
args += output
linkdirs = mesonlib.OrderedSet()
external_deps = target.external_deps.copy()
+
+ # Have we already injected msvc-crt args?
+ #
+ # If we don't have A C, C++, or Fortran compiler that is
+ # VisualStudioLike treat this as if we've already injected them
+ #
+ # We handle this here rather than in the rust compiler because in
+ # general we don't want to link rust targets to a non-default crt.
+ # However, because of the way that MSCRTs work you can only link to one
+ # per target, so if A links to the debug one, and B links to the normal
+ # one you can't link A and B. Rust is hardcoded to the default one,
+ # so if we compile C/C++ code and link against a non-default MSCRT then
+ # linking will fail. We can work around this by injecting MSCRT link
+ # arguments early in the rustc command line
+ # https://github.com/rust-lang/rust/issues/39016
+ crt_args_injected = not any(x is not None and x.get_argument_syntax() == 'msvc' for x in
+ (self.environment.coredata.compilers[target.for_machine].get(l)
+ for l in ['c', 'cpp', 'fortran']))
+
+ crt_link_args: T.List[str] = []
+ try:
+ buildtype = self.environment.coredata.options[OptionKey('buildtype')].value
+ crt = self.environment.coredata.options[OptionKey('b_vscrt')].value
+ is_debug = buildtype == 'debug'
+
+ if crt == 'from_buildtype':
+ crt = 'mdd' if is_debug else 'md'
+ elif crt == 'static_from_buildtype':
+ crt = 'mtd' if is_debug else 'mt'
+
+ if crt == 'mdd':
+ crt_link_args = ['-l', 'static=msvcrtd']
+ elif crt == 'md':
+ # this is the default, no need to inject anything
+ crt_args_injected = True
+ elif crt == 'mtd':
+ crt_link_args = ['-l', 'static=libcmtd']
+ elif crt == 'mt':
+ crt_link_args = ['-l', 'static=libcmt']
+
+ except KeyError:
+ crt_args_injected = True
+
# TODO: we likely need to use verbatim to handle name_prefix and name_suffix
for d in target.link_targets:
linkdirs.add(d.subdir)
@@ -1961,7 +2004,13 @@ class NinjaBackend(backends.Backend):
d_name = self._get_rust_dependency_name(target, d)
args += ['--extern', '{}={}'.format(d_name, os.path.join(d.subdir, d.filename))]
project_deps.append(RustDep(d_name, self.rust_crates[d.name].order))
- elif isinstance(d, build.StaticLibrary):
+ continue
+
+ if not crt_args_injected and not {'c', 'cpp', 'fortran'}.isdisjoint(d.compilers):
+ args += crt_link_args
+ crt_args_injected = True
+
+ if isinstance(d, build.StaticLibrary):
# Rustc doesn't follow Meson's convention that static libraries
# are called .a, and import libraries are .lib, so we have to
# manually handle that.
@@ -2001,6 +2050,10 @@ class NinjaBackend(backends.Backend):
args += ['--extern', '{}={}'.format(d_name, os.path.join(d.subdir, d.filename))]
project_deps.append(RustDep(d_name, self.rust_crates[d.name].order))
else:
+ if not crt_args_injected and not {'c', 'cpp', 'fortran'}.isdisjoint(d.compilers):
+ crt_args_injected = True
+ crt_args_injected = True
+
if rustc.linker.id in {'link', 'lld-link'}:
if verbatim:
# If we can use the verbatim modifier, then everything is great
@@ -2045,6 +2098,11 @@ class NinjaBackend(backends.Backend):
if d == '':
d = '.'
args += ['-L', d]
+
+ # Because of the way rustc links, this must come after any potential
+ # library need to link with their stdlibs (C++ and Fortran, for example)
+ args.extend(target.get_used_stdlib_args('rust'))
+
target_deps = target.get_dependencies()
has_shared_deps = any(isinstance(dep, build.SharedLibrary) for dep in target_deps)
has_rust_shared_deps = any(dep.uses_rust()