aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild
diff options
context:
space:
mode:
authorKramer Peace <kpeace1@gmail.com>2019-09-02 14:23:11 +0300
committerDylan Baker <dylan@pnwbakers.com>2019-09-05 08:38:56 -0700
commitfb9a5ce8672a01b4b82d10fe2518a047dc532da9 (patch)
tree55115636518d01cd3b26f3e16fd18733f530dabb /mesonbuild
parentbd37147b4b46081c58e0b15f6a0f0123099b27b1 (diff)
downloadmeson-fb9a5ce8672a01b4b82d10fe2518a047dc532da9.zip
meson-fb9a5ce8672a01b4b82d10fe2518a047dc532da9.tar.gz
meson-fb9a5ce8672a01b4b82d10fe2518a047dc532da9.tar.bz2
Add a CUDA linker object
Fixes issue #5870
Diffstat (limited to 'mesonbuild')
-rw-r--r--mesonbuild/compilers/cuda.py6
-rw-r--r--mesonbuild/environment.py4
-rw-r--r--mesonbuild/linkers.py29
3 files changed, 38 insertions, 1 deletions
diff --git a/mesonbuild/compilers/cuda.py b/mesonbuild/compilers/cuda.py
index 3bcabf5..0a26bed 100644
--- a/mesonbuild/compilers/cuda.py
+++ b/mesonbuild/compilers/cuda.py
@@ -34,7 +34,7 @@ class CudaCompiler(Compiler):
super().__init__(exelist, version, for_machine, **kwargs)
self.is_cross = is_cross
self.exe_wrapper = exe_wrapper
- self.id = 'nvcc'
+ self.id = CudaCompiler.cuda_id()
default_warn_args = []
self.warn_args = {'0': [],
'1': default_warn_args,
@@ -42,6 +42,10 @@ class CudaCompiler(Compiler):
'3': default_warn_args + ['-Xcompiler=-Wextra',
'-Xcompiler=-Wpedantic']}
+ @staticmethod
+ def cuda_id():
+ return 'nvcc'
+
def needs_static_linker(self):
return False
diff --git a/mesonbuild/environment.py b/mesonbuild/environment.py
index 7386965..b53c6f5 100644
--- a/mesonbuild/environment.py
+++ b/mesonbuild/environment.py
@@ -55,6 +55,7 @@ from .linkers import (
XildAppleDynamicLinker,
XildLinuxDynamicLinker,
XilinkDynamicLinker,
+ CudaLinker,
)
from functools import lru_cache
from .compilers import (
@@ -696,6 +697,9 @@ class Environment:
`-Xlinker=--version`) you must pass as a list.
:extra_args: Any addtional arguments rquired (such as a source file)
"""
+ if CudaCompiler.cuda_id() in compiler:
+ return CudaLinker(compiler, for_machine, 'nvlink', prefix, version=CudaLinker.parse_version())
+
extra_args = typing.cast(typing.List[str], extra_args or [])
if isinstance(prefix, str):
check_args = [prefix + '--version'] + extra_args
diff --git a/mesonbuild/linkers.py b/mesonbuild/linkers.py
index 272f927..7db7d09 100644
--- a/mesonbuild/linkers.py
+++ b/mesonbuild/linkers.py
@@ -909,3 +909,32 @@ class OptlinkDynamicLinker(VisualStudioLikeLinkerMixin, DynamicLinker):
def get_allow_undefined_args(self) -> typing.List[str]:
return []
+
+class CudaLinker(DynamicLinker):
+ """Cuda linker (nvlink)"""
+ @staticmethod
+ def parse_version():
+ version_cmd = ['nvlink', '--version']
+ try:
+ _, out, _ = mesonlib.Popen_safe(version_cmd)
+ except OSError:
+ return 'unknown version'
+ # Output example:
+ # nvlink: NVIDIA (R) Cuda linker
+ # Copyright (c) 2005-2018 NVIDIA Corporation
+ # Built on Sun_Sep_30_21:09:22_CDT_2018
+ # Cuda compilation tools, release 10.0, V10.0.166
+ # we need the most verbose version output. Luckily starting with V
+ return out.strip().split('V')[-1]
+
+ def get_output_args(self, outname: str) -> typing.List[str]:
+ return ['-o', outname]
+
+ def get_search_args(self, dirname: str) -> typing.List[str]:
+ return ['-L', dirname]
+
+ def fatal_warnings(self) -> typing.List[str]:
+ return ['--warning-as-error']
+
+ def get_allow_undefined_args(self) -> typing.List[str]:
+ return []